351 lines
16 KiB
Markdown
351 lines
16 KiB
Markdown
# API 패키징 작업 계획
|
|
|
|
- 작성일: 2026-08-25
|
|
- 목적: 현재 ABC User Feedback와 커스터마이징 기능을 다른 서비스에서 사용할 수 있는 공식 API 패키지로 정리한다.
|
|
- 현재 상태: 기능별 API는 대부분 존재하고 Swagger도 연결되어 있으나, 외부 배포용 API 계약과 스키마는 아직 정리되지 않았다.
|
|
|
|
## 1. 현재 구조
|
|
|
|
### 1.1 NestJS API
|
|
|
|
| 구분 | 현재 주소 | 인증 | Swagger |
|
|
|---|---|---|---|
|
|
| 공개 연동 API | /api/... | x-api-key | /docs |
|
|
| 관리자 API | /api/admin/... | JWT + 권한 | /admin-docs |
|
|
| Swagger JSON | /docs-json, /admin-docs-json | 서버 설정에 따름 | 생성 가능 |
|
|
|
|
현재 로컬 확인 주소:
|
|
|
|
- 공개 API 문서: http://127.0.0.1:4000/docs
|
|
- 관리자 API 문서: http://127.0.0.1:4000/admin-docs
|
|
- 공개 OpenAPI JSON: http://127.0.0.1:4000/docs-json
|
|
- 관리자 OpenAPI JSON: http://127.0.0.1:4000/admin-docs-json
|
|
|
|
Swagger 설정은 apps/api/src/main.ts에 있으며, 공개 문서 생성 스크립트는 apps/api/src/scripts/build-swagger-docs.ts에 있다.
|
|
|
|
### 1.2 Secretary API
|
|
|
|
Secretary API는 FastAPI 자동 문서를 사용한다.
|
|
|
|
- Swagger UI: :8010/docs
|
|
- OpenAPI JSON: :8010/openapi.json
|
|
|
|
현재 Secretary API에는 SSO 기반 접근 정보, workspace, ticket, 댓글, 내부 메모, 첨부파일, 담당자 관련 API가 포함되어 있다.
|
|
|
|
### 1.3 Next.js API Route
|
|
|
|
apps/web/src/pages/api/support/* 아래의 API는 화면과 Secretary API 사이를 연결하는 내부 프록시다.
|
|
|
|
이 경로들은 NestJS Swagger 문서에는 포함되지 않는다. 외부 패키지에서 직접 사용할 공식 API로 제공하려면 NestJS 또는 Secretary API의 공개 계약으로 승격해야 한다.
|
|
|
|
## 2. 현재 구현된 API 범위
|
|
|
|
### 2.1 공개 피드백 API
|
|
|
|
- 프로젝트·채널 조회
|
|
- 채널 필드 조회
|
|
- 피드백 생성
|
|
- 피드백 목록 조회
|
|
- 피드백 검색
|
|
- 피드백 상세 조회
|
|
- 피드백 수정·삭제
|
|
- 피드백과 이슈 연결·해제
|
|
- 댓글 CRUD
|
|
- 내부 댓글 구분
|
|
- 댓글 첨부파일 업로드·조회·삭제
|
|
- 피드백 첨부 이미지 업로드
|
|
- 카테고리 조회·관리
|
|
- 이슈 생성·조회·검색·수정·삭제
|
|
|
|
관련 컨트롤러:
|
|
|
|
- apps/api/src/domains/api/feedback.controller.ts
|
|
- apps/api/src/domains/api/v2/feedback.controller.ts
|
|
- apps/api/src/domains/api/issue.controller.ts
|
|
- apps/api/src/domains/api/channel.controller.ts
|
|
- apps/api/src/domains/api/project.controller.ts
|
|
|
|
### 2.2 관리자 API
|
|
|
|
- 프로젝트·채널·필드 관리
|
|
- 피드백 관리자 검색·수정·삭제
|
|
- 피드백 상태 처리
|
|
- 피드백 담당자 지정
|
|
- 이슈 관리자 지정
|
|
- 이슈 상태 처리
|
|
- Gitea 이슈 생성·연결·동기화
|
|
- 댓글·내부 메모 관리
|
|
- 통계 조회
|
|
- 다중 프로젝트 통합 대시보드
|
|
- 관리자 권한·역할 관리
|
|
|
|
통합 대시보드 API:
|
|
|
|
GET /api/admin/dashboard/overview
|
|
|
|
현재 대시보드 API는 사용자의 프로젝트 권한을 기준으로 프로젝트별 피드백·이슈 요약과 Todo 항목을 집계한다.
|
|
|
|
### 2.3 Secretary API
|
|
|
|
- SSO 사용자 접근 정보
|
|
- workspace 목록 및 폼 템플릿
|
|
- ticket 생성·조회·상세 조회
|
|
- 댓글 CRUD
|
|
- 내부 메모 CRUD
|
|
- 담당자 후보 조회 및 지정
|
|
- 이슈 연결
|
|
- 승인 처리
|
|
- 첨부파일 저장·조회
|
|
- R2 기반 파일 저장
|
|
|
|
## 3. 현재 Swagger 문서화 상태
|
|
|
|
### 완료된 부분
|
|
|
|
- [x] NestJS Swagger 모듈 연결
|
|
- [x] 공개 API 문서와 관리자 API 문서 분리
|
|
- [x] 공개 API Key 인증 정의
|
|
- [x] 관리자 JWT 인증 정의
|
|
- [x] 주요 피드백·이슈 API의 ApiTags, ApiParam, ApiOperation 일부 적용
|
|
- [x] 일부 요청·응답 DTO에 ApiProperty 적용
|
|
- [x] FastAPI 자동 OpenAPI 문서 제공
|
|
- [x] 공개 Swagger JSON 생성 스크립트 존재
|
|
|
|
### 보완이 필요한 부분
|
|
|
|
- [x] 통합 대시보드 응답 DTO 정의
|
|
- [x] 통합 대시보드 날짜·프로젝트 필터 파라미터 문서화
|
|
- [x] 관리자 피드백 컨트롤러에 ApiTags와 상세 operation 문서 추가
|
|
- [x] 댓글 CRUD 요청·응답 DTO 정의
|
|
- [x] 내부 메모와 일반 댓글의 공개 범위 문서화
|
|
- [x] 첨부파일 multipart 요청 스키마 정의
|
|
- [x] 담당자·상태·우선순위 enum 문서화
|
|
- [x] 오류 응답 형식 표준화
|
|
- [x] 동적 필드의 요청·응답 계약 정의
|
|
- [x] 내부 workspace mapping API의 Swagger 공개 범위 재검토
|
|
- [x] Next.js 내부 프록시 API와 공식 API의 역할 분리
|
|
|
|
### 1차 보완 완료 기록
|
|
|
|
- `DashboardOverviewResponseDto`와 하위 통계·Todo·상태 스키마를 추가했다.
|
|
- `GET /api/admin/dashboard/overview`의 날짜 범위와 쉼표 구분 프로젝트 필터를 Swagger에 명시했다.
|
|
- 관리자 피드백 API에 `admin-feedbacks` 태그, 경로 파라미터, operation 설명, 동적 body 예시, 생성·수정·삭제 응답 설명을 추가했다.
|
|
- 공개 OpenAPI JSON과 관리자 OpenAPI JSON을 함께 생성하도록 `apps/api/src/scripts/build-swagger-docs.ts`를 보완했다.
|
|
- 공통 오류 응답, enum 문서화, 동적 필드 계약은 다음 보완 작업으로 남겨두었다.
|
|
|
|
### 2차 보완 완료 기록
|
|
|
|
- Secretary 댓글 요청·응답 모델에 작성자, 공개 범위, 첨부파일 메타데이터, 수정·삭제 가능 여부의 설명을 추가했다.
|
|
- `GET/POST/PUT/DELETE /api/tickets/{ticketId}/comments...`를 공개 댓글 계약으로 명시하고, `GET/POST/PUT/DELETE /api/tickets/{ticketId}/internal-memos...`를 관리자 전용 계약으로 분리했다.
|
|
- 공개 댓글 API는 관리자 권한으로 호출하더라도 `is_internal=false`로 저장되며, 내부 메모는 전용 API에서만 생성되도록 경계를 고정했다.
|
|
- 지원 요청 생성 API에 JSON과 multipart/form-data 계약을 모두 문서화하고, 반복 가능한 `attachments` binary 필드와 JSON 문자열 `extra_fields`를 명시했다.
|
|
- 첨부파일 댓글 API도 `content`와 반복 가능한 `attachments` 입력을 OpenAPI에 노출하도록 명시적인 multipart 파라미터로 변경했다.
|
|
- 삭제 응답을 `TicketDeleteResponse` DTO로 고정해 `deleted`, `ticket_id`, `comment_id`, `feedback_id`를 문서화했다.
|
|
- Secretary API는 FastAPI 자동 OpenAPI 엔드포인트(`/openapi.json`)에서 위 계약을 산출하며, 실행 환경에 의존성 설치 후 `/docs`에서 확인한다.
|
|
|
|
### 3차 보완 완료 기록
|
|
|
|
- 피드백 상태 enum을 `INIT`, `ON_REVIEW`, `DETAILED_REVIEW`, `IN_PROGRESS`, `RESOLVED`, `PENDING`으로 고정하고, 이슈 상태와 동일한 6단계 값임을 Swagger에 명시했다.
|
|
- 피드백 우선순위 enum을 `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`로 문서화했다.
|
|
- 관리자 피드백 수정 API에 상태, 우선순위, 담당자 ID·tenant ID·이름·이메일 필드의 요청 예시와 enum을 추가했다.
|
|
- 통합 대시보드 Todo 응답에 담당자 정보를 포함하고, 피드백 상태·우선순위 타입을 enum으로 제한했다.
|
|
- NestJS와 Secretary API의 오류 응답을 `code`, `message`, `error`, `statusCode`, `path` 공통 구조로 표준화했다. 추가 오류 정보는 `details`에 담는다.
|
|
- NestJS 관리자 피드백·통합 대시보드 API와 Secretary API OpenAPI에 공통 오류 응답 스키마를 노출했다.
|
|
|
|
### 4차 보완 완료 기록
|
|
|
|
- 채널 필드 조회 API(`/projects/{projectId}/channels/{channelId}/fields`)를 동적 피드백 계약의 기준점으로 명시했다. 클라이언트는 이 응답으로 필드 키, format, property, status, select 옵션을 먼저 확인한다.
|
|
- 공개·관리자 피드백 생성 API에 동적 JSON 요청 스키마를 연결했다. `title`, `contents`, `Category`, `IP`, `MAC_address`는 대표 예시이며 실제 입력 키는 채널 설정을 따른다.
|
|
- `issueNames`는 피드백 필드로 저장되지 않는 이슈 연결용 제어 필드임을 문서화했다.
|
|
- 이미지 첨부 생성 API에 multipart 스키마를 연결하고, 동적 비파일 필드와 반복 가능한 `images` binary 파일 입력을 구분했다.
|
|
- 피드백 검색 응답은 실제 구현처럼 동적 필드가 최상위에 펼쳐지는 `items`와 페이지네이션 `meta` 구조로 문서화했다.
|
|
- 동적 검색 `query` 값에 문자열·숫자·배열·`gte/lt` 범위 조건을 문서화했다.
|
|
- 관리자 피드백 수정 API는 공통 관리 필드(상태·우선순위·담당자)를 명시하면서, 나머지 허용 필드는 채널 필드 설정에서 발견하도록 설명했다.
|
|
|
|
### 5차 보완 완료 기록
|
|
|
|
- Secretary API가 ABC API의 `GET /api/internal/support/workspace-mappings`를 서비스 간 동기화에만 사용하도록 확인했다.
|
|
- workspace mapping endpoint는 `MASTER_API_KEY` 서비스 인증을 사용하므로 공개·관리자 Swagger에서 제외했다. 이 키는 외부 패키지 소비자에게 제공하는 API Key가 아니다.
|
|
- Next.js의 `/api/support/*` 경로는 브라우저 세션과 Secretary API 사이의 내부 BFF(proxy)로 분류하고, 외부 패키지용 공식 API는 Secretary API와 NestJS 공개·관리자 API로 한정했다.
|
|
- Next.js proxy 경로는 Swagger 산출 대상이 아니며, 외부 연동 문서와 SDK 계약에 포함하지 않는다는 경계를 명시했다.
|
|
|
|
## 4. 외부 패키지용 API 계약 설계
|
|
|
|
### 4.1 API 영역 분리
|
|
|
|
외부 패키지에서는 다음 세 영역을 분리한다.
|
|
|
|
1. 사용자용 피드백 API
|
|
2. 관리자용 운영 API
|
|
3. 내부 Secretary 업무 API
|
|
|
|
외부 사용자에게 관리자 API나 내부 API 권한이 노출되지 않도록 인증 체계와 문서도 분리한다.
|
|
|
|
### 4.2 권장 버전 정책
|
|
|
|
/api/v1/projects/{projectId}/channels/{channelId}/feedbacks
|
|
/api/v1/projects/{projectId}/issues
|
|
/api/v1/admin/...
|
|
|
|
기존 경로는 호환성을 위해 유지하고, 패키지용 공식 계약은 v1 버전으로 고정하는 것을 권장한다.
|
|
|
|
### 4.3 공통 응답 형식
|
|
|
|
성공 응답과 오류 응답을 모든 API에서 일관되게 정의한다.
|
|
|
|
{
|
|
"data": {},
|
|
"meta": {
|
|
"requestId": "..."
|
|
}
|
|
}
|
|
|
|
오류 예시:
|
|
|
|
{
|
|
"code": "NOT_FOUND",
|
|
"message": "Feedback was not found.",
|
|
"error": "NOT_FOUND",
|
|
"statusCode": 404,
|
|
"path": "/api/feedbacks/34",
|
|
"details": {}
|
|
}
|
|
|
|
### 4.4 페이지네이션·검색·정렬
|
|
|
|
- page, limit 또는 cursor 방식 중 하나로 표준화
|
|
- 최대 limit 제한
|
|
- 정렬 가능 필드 화이트리스트 적용
|
|
- 제목·내용·작성자 검색의 검색 범위 명시
|
|
- 비밀글 접근 시 작성자·관리자 권한 검증
|
|
- 응답에 total, page, limit, hasNext 포함
|
|
|
|
### 4.5 동적 필드
|
|
|
|
현재 피드백 데이터는 채널 필드 설정에 따라 동적으로 구성된다.
|
|
|
|
현재 API 계약:
|
|
|
|
{
|
|
"title": "...",
|
|
"contents": "...",
|
|
"Category": "ERROR_QNA",
|
|
"IP": "...",
|
|
"MAC_address": "...",
|
|
"issueNames": ["Login error"]
|
|
}
|
|
|
|
- 실제 필드 키와 허용 값은 `GET /projects/{projectId}/channels/{channelId}/fields`에서 확인한다.
|
|
- `text`, `keyword`, `aiField`는 문자열, `number`는 숫자, `select`는 옵션 key 또는 null, `multiSelect`와 `images`는 배열, `date`는 날짜 문자열 또는 null을 사용한다.
|
|
- 응답에서도 채널 필드 값은 최상위 동적 속성으로 반환되며, `id`, `createdAt`, `updatedAt`, `issues`가 함께 제공된다.
|
|
- `issueNames`는 생성 요청에서만 사용하는 이슈 연결 제어 필드다.
|
|
- 장기적으로 SDK 호환성을 위해 `customFields` 래퍼를 도입할 수 있지만, 기존 클라이언트 호환성을 깨지 않도록 별도 버전 계약으로 진행한다.
|
|
|
|
## 5. 인증·권한·보안
|
|
|
|
- [ ] 공개 API Key를 프로젝트·채널 단위로 제한
|
|
- [ ] 관리자 JWT와 공개 API Key의 권한 차이 문서화
|
|
- [ ] Secretary API는 SSO JWT 검증을 필수화
|
|
- [ ] workspace·tenant·project 접근 범위 검증
|
|
- [ ] 비밀글 조회 권한을 API 레벨에서 강제
|
|
- [x] 내부 댓글·내부 메모가 일반 사용자 응답에 포함되지 않도록 보장
|
|
- [ ] R2 presigned URL 만료 시간 문서화
|
|
- [ ] API Key·JWT·R2 credential 로그 마스킹 확인
|
|
- [ ] rate limit과 업로드 용량 제한 추가
|
|
- [ ] CORS와 외부 패키지 허용 origin 정책 정의
|
|
|
|
### 보안 검증 기록
|
|
|
|
- 공개 API의 일반 댓글 목록·생성·첨부파일 접근은 내부 메모를 포함하지 않도록 고정했다. `is_internal` 입력과 `includeInternal` 조회 플래그는 공개 API에서 무시하며, 내부 메모는 관리자 전용 API에서만 처리한다.
|
|
- 공개 API Key는 `projectId` 기준으로 검증하고, `MASTER_API_KEY`는 서비스 간 내부 호출을 위한 전역 키로 구분했다.
|
|
- 관리자 API는 JWT guard와 권한 guard를 사용하고, Secretary API는 SSO JWT의 서명·만료·`sso_sub`·`tenant_id`를 검증한다.
|
|
|
|
## 6. Swagger/OpenAPI 산출물 및 배포
|
|
|
|
- [x] 공개 API OpenAPI JSON 생성
|
|
- [x] 관리자 API OpenAPI JSON 생성
|
|
- [x] Secretary API OpenAPI JSON export (`/openapi.json` 자동 산출)
|
|
- [ ] OpenAPI 파일을 패키지에 포함할지 결정
|
|
- [ ] Swagger UI를 staging에서만 노출할지 결정
|
|
- [ ] production에서는 인증된 관리자만 Swagger 접근 가능하도록 제한
|
|
- [ ] API 버전별 문서 URL 제공
|
|
- [ ] Postman collection 또는 SDK 생성 여부 결정
|
|
- [ ] 외부 패키지 배포 시 changelog와 breaking change 정책 추가
|
|
|
|
생성 산출물 후보:
|
|
|
|
packages/api-contract/openapi/public.json
|
|
packages/api-contract/openapi/admin.json
|
|
packages/api-contract/openapi/secretary.json
|
|
|
|
## 7. 테스트 계획
|
|
|
|
### 계약 테스트
|
|
|
|
- [ ] OpenAPI schema validation
|
|
- [ ] 요청 DTO validation
|
|
- [ ] 응답 DTO serialization
|
|
- [x] 오류 응답 형식 검증
|
|
- [ ] 페이지네이션·정렬·검색 검증
|
|
- [ ] 비밀글 권한 검증
|
|
- [ ] 내부 댓글 노출 차단 검증
|
|
|
|
### 기능 테스트
|
|
|
|
- [ ] 사용자 피드백 생성
|
|
- [ ] 피드백 목록·상세·수정·삭제
|
|
- [ ] 댓글 CRUD
|
|
- [ ] 내부 메모 CRUD
|
|
- [ ] 첨부파일 R2 업로드·다운로드·삭제
|
|
- [ ] 피드백 담당자 지정
|
|
- [ ] 상태 변경
|
|
- [ ] 이슈 연결·해제
|
|
- [ ] Gitea 이슈 생성·동기화
|
|
- [ ] 통합 대시보드 조회
|
|
- [ ] 다중 프로젝트 권한 필터링
|
|
- [ ] SSO 재로그인 후 사용자 정보 유지
|
|
|
|
### 배포 전 확인
|
|
|
|
- [ ] pnpm typecheck
|
|
- [ ] pnpm lint
|
|
- [ ] API 단위 테스트
|
|
- [ ] Secretary API 테스트
|
|
- [ ] E2E 테스트
|
|
- [ ] staging에서 OpenAPI JSON 확인
|
|
- [ ] 실제 외부 클라이언트 샘플 호출
|
|
- [ ] 마이그레이션 및 기존 데이터 호환성 확인
|
|
|
|
## 8. 권장 작업 순서
|
|
|
|
1. 공개 API와 관리자 API의 패키징 범위 확정
|
|
2. API 버전과 인증 정책 확정
|
|
3. 통합 대시보드 응답 DTO 작성
|
|
4. 피드백·댓글·내부메모·첨부파일 DTO 작성
|
|
5. 상태·우선순위·담당자 enum 정리
|
|
6. Swagger decorator 보완
|
|
7. Next.js 내부 프록시와 공식 API 경계 정리
|
|
8. OpenAPI JSON을 별도 계약 패키지로 export
|
|
9. 계약 테스트와 권한 테스트 추가
|
|
10. staging 배포 및 외부 호출 검증
|
|
11. SDK 또는 Postman collection 생성
|
|
12. API 패키지 버전 태그 및 배포
|
|
|
|
## 9. 완료 기준
|
|
|
|
- 외부 시스템이 Swagger 문서만 보고 피드백을 생성·조회·수정할 수 있다.
|
|
- 관리자 시스템이 피드백 상태·담당자·댓글·내부 메모·이슈·Gitea를 API로 처리할 수 있다.
|
|
- 사용자·관리자·내부 API의 권한이 분리되어 있다.
|
|
- 동적 필드와 비밀글 정책이 문서화되어 있다.
|
|
- 모든 주요 API의 요청·응답·오류 스키마가 OpenAPI에 표시된다.
|
|
- Swagger JSON이 CI에서 생성되고 버전 관리 또는 패키지 산출물로 배포된다.
|
|
- 기존 화면과 API 소비처의 호환성이 깨지지 않는다.
|
|
|
|
## 참고 문서
|
|
|
|
- SSOT 피드백 재구성 작업: docs/ssot-feedback-rearchitecture-tasks.md
|
|
- 다중 프로젝트 관리자 통합 대시보드 설계: docs/multi-project-admin-dashboard-design.md
|
|
- Secretary SSO 구성 설계: docs/architecture_secretary_sso_components_v2.md
|
|
- Q&A 플랫폼 작업 목록: docs/qna-platform-prototype-2-feedback-tasks.md
|
|
- NestJS API README: apps/api/README.md
|