From d6df40015e9e1a48e70fe047110ca5287e1bcf0e Mon Sep 17 00:00:00 2001 From: cyjadela Date: Thu, 23 Oct 2025 13:31:47 +0900 Subject: [PATCH] =?UTF-8?q?meeting=20service=20API=20=EC=84=A4=EA=B3=84?= =?UTF-8?q?=EC=84=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/backend/api/meeting-service-api.yaml | 402 +++++++++++++++----- 1 file changed, 305 insertions(+), 97 deletions(-) diff --git a/design/backend/api/meeting-service-api.yaml b/design/backend/api/meeting-service-api.yaml index 1061c30..f4ad099 100644 --- a/design/backend/api/meeting-service-api.yaml +++ b/design/backend/api/meeting-service-api.yaml @@ -99,20 +99,13 @@ paths: priority: "MEDIUM" status: "IN_PROGRESS" minutesId: "770e8400-e29b-41d4-a716-446655440001" - recentMinutes: + myMinutes: - minutesId: "770e8400-e29b-41d4-a716-446655440000" title: "아키텍처 설계 회의" meetingDate: "2025-01-23T14:00:00Z" status: "FINALIZED" participantCount: 6 lastModified: "2025-01-23T16:30:00Z" - sharedMinutes: - - minutesId: "770e8400-e29b-41d4-a716-446655440002" - title: "프로젝트 킥오프 미팅" - meetingDate: "2025-01-22T10:00:00Z" - status: "FINALIZED" - sharedBy: "김철수" - sharedAt: "2025-01-22T15:00:00Z" statistics: upcomingMeetingsCount: 2 activeTodosCount: 5 @@ -154,6 +147,7 @@ paths: startTime: "2025-01-25T14:00:00Z" endTime: "2025-01-25T16:00:00Z" location: "회의실 A" + agenda: "1. Q1 목표 달성 현황 검토\n2. Q2 전략 방향 논의\n3. 주요 이슈 및 리스크 검토" participants: - "user1@example.com" - "user2@example.com" @@ -288,6 +282,7 @@ paths: - 회의 통계 생성 - AI 제안 데이터 회의록에 반영 - 참석자에게 종료 알림 + - 검증 완료 화면 데이터 반환 operationId: endMeeting x-user-story: UFR-MEET-040 x-controller: MeetingController @@ -296,6 +291,15 @@ paths: parameters: - $ref: '#/components/parameters/MeetingIdPath' - $ref: '#/components/parameters/UserIdHeader' + requestBody: + required: false + content: + application/json: + schema: + $ref: '#/components/schemas/EndMeetingRequest' + example: + finalAgenda: "1. Q1 목표 달성률 85% 확인\n2. 신규 기능 우선순위 결정\n3. 다음 주 개발 일정 조율" + applyAiSuggestions: true responses: '200': description: 회의 종료 성공 @@ -320,6 +324,53 @@ paths: discussion: 3 decision: 2 todo: 3 + verificationStatus: + totalSections: 4 + verifiedSections: 2 + verificationRate: 50 + sections: + - sectionId: "880e8400-e29b-41d4-a716-446655440000" + sectionType: "DISCUSSION" + title: "회의 개요" + isVerified: true + isLocked: false + verifiers: + - userId: "user1" + name: "김민준" + verifiedAt: "2025-01-25T15:30:00Z" + - userId: "user2" + name: "박서연" + verifiedAt: "2025-01-25T15:35:00Z" + - sectionId: "880e8400-e29b-41d4-a716-446655440001" + sectionType: "DECISION" + title: "논의 사항" + isVerified: true + isLocked: true + verifiers: + - userId: "user1" + name: "김민준" + verifiedAt: "2025-01-25T15:40:00Z" + - userId: "user2" + name: "박서연" + verifiedAt: "2025-01-25T15:42:00Z" + - userId: "user3" + name: "이준호" + verifiedAt: "2025-01-25T15:45:00Z" + - sectionId: "880e8400-e29b-41d4-a716-446655440002" + sectionType: "TODO" + title: "결정 사항" + isVerified: false + isLocked: false + verifiers: + - userId: "user2" + name: "박서연" + verifiedAt: "2025-01-25T15:50:00Z" + - sectionId: "880e8400-e29b-41d4-a716-446655440003" + sectionType: "TODO" + title: "액션 아이템" + isVerified: false + isLocked: false + verifiers: [] '404': $ref: '#/components/responses/NotFoundError' '409': @@ -629,6 +680,85 @@ paths: # ==================== Todo APIs ==================== /todos: + get: + tags: + - Todo + summary: Todo 목록 조회 + description: | + 사용자별 Todo 목록을 조회하고 필터링합니다. + - 상태별 필터링 (전체/진행중/완료/마감임박) + - 우선순위별 정렬 + - 통계 정보 포함 + operationId: getTodoList + x-user-story: UFR-TODO-020 + x-controller: TodoController + security: + - bearerAuth: [] + parameters: + - $ref: '#/components/parameters/UserIdHeader' + - name: status + in: query + schema: + type: string + enum: [ALL, IN_PROGRESS, COMPLETED, URGENT] + default: ALL + description: | + Todo 상태 필터 + - ALL: 전체 + - IN_PROGRESS: 진행중 + - COMPLETED: 완료 + - URGENT: 마감 임박 (3일 이내) + - name: sort + in: query + schema: + type: string + enum: [DUE_DATE, PRIORITY, CREATED_AT] + default: DUE_DATE + description: 정렬 기준 + responses: + '200': + description: Todo 목록 조회 성공 + content: + application/json: + schema: + $ref: '#/components/schemas/TodoListResponse' + example: + statistics: + total: 12 + inProgress: 8 + completed: 4 + urgent: 3 + completionRate: 33.3 + todos: + - todoId: "660e8400-e29b-41d4-a716-446655440000" + content: "API 설계 문서 작성" + assignee: + userId: "user1" + email: "user@example.com" + name: "김민준" + dueDate: "2025-01-30" + priority: "HIGH" + status: "IN_PROGRESS" + progress: 60 + minutesId: "770e8400-e29b-41d4-a716-446655440000" + meetingTitle: "아키텍처 설계 회의" + createdAt: "2025-01-23T10:00:00Z" + - todoId: "660e8400-e29b-41d4-a716-446655440001" + content: "데이터베이스 스키마 설계" + assignee: + userId: "user1" + email: "user@example.com" + name: "김민준" + dueDate: "2025-02-05" + priority: "MEDIUM" + status: "IN_PROGRESS" + progress: 30 + minutesId: "770e8400-e29b-41d4-a716-446655440001" + meetingTitle: "주간 스프린트 리뷰" + createdAt: "2025-01-22T14:00:00Z" + '401': + $ref: '#/components/responses/UnauthorizedError' + post: tags: - Todo @@ -712,6 +842,7 @@ paths: summary: 템플릿 목록 조회 description: | 사용 가능한 회의록 템플릿 목록을 조회합니다. + 각 템플릿의 섹션 정보를 포함하여 반환합니다. - 일반 회의 - 스크럼 회의 - 프로젝트 킥오프 @@ -730,34 +861,47 @@ paths: type: array items: $ref: '#/components/schemas/TemplateResponse' - - /templates/{templateId}: - get: - tags: - - Template - summary: 템플릿 상세 조회 - description: 특정 템플릿의 상세 정보를 조회합니다. - operationId: getTemplate - x-user-story: UFR-MEET-020 - x-controller: TemplateController - security: - - bearerAuth: [] - parameters: - - name: templateId - in: path - required: true - schema: - type: string - description: 템플릿 ID - responses: - '200': - description: 템플릿 상세 조회 성공 - content: - application/json: - schema: - $ref: '#/components/schemas/TemplateDetailResponse' - '404': - $ref: '#/components/responses/NotFoundError' + example: + - templateId: "general-meeting" + name: "일반 회의" + description: "기본 회의록 형식" + icon: "📋" + category: "GENERAL" + sections: + - sectionType: "DISCUSSION" + title: "회의 개요" + order: 1 + isRequired: true + - sectionType: "DISCUSSION" + title: "논의 사항" + order: 2 + isRequired: true + - sectionType: "DECISION" + title: "결정 사항" + order: 3 + isRequired: true + - sectionType: "TODO" + title: "액션 아이템" + order: 4 + isRequired: true + - templateId: "scrum-meeting" + name: "스크럼 회의" + description: "데일리 스탠드업 형식" + icon: "🏃" + category: "SCRUM" + sections: + - sectionType: "DISCUSSION" + title: "어제 한 일" + order: 1 + isRequired: true + - sectionType: "TODO" + title: "오늘 할 일" + order: 2 + isRequired: true + - sectionType: "CUSTOM" + title: "블로커/이슈" + order: 3 + isRequired: true # ==================== WebSocket Endpoints ==================== /ws/minutes/{minutesId}: @@ -880,16 +1024,11 @@ components: items: $ref: '#/components/schemas/ActiveTodo' description: 진행 중 Todo 목록 - recentMinutes: + myMinutes: type: array items: - $ref: '#/components/schemas/RecentMinutes' - description: 최근 회의록 목록 - sharedMinutes: - type: array - items: - $ref: '#/components/schemas/SharedMinutes' - description: 공유받은 회의록 목록 + $ref: '#/components/schemas/MyMinutes' + description: 내 회의록 목록 statistics: $ref: '#/components/schemas/DashboardStatistics' description: 통계 정보 @@ -949,7 +1088,7 @@ components: - priority - status - RecentMinutes: + MyMinutes: type: object properties: minutesId: @@ -974,30 +1113,6 @@ components: - meetingDate - status - SharedMinutes: - type: object - properties: - minutesId: - type: string - format: uuid - title: - type: string - meetingDate: - type: string - format: date-time - status: - type: string - enum: [DRAFT, FINALIZED] - sharedBy: - type: string - sharedAt: - type: string - format: date-time - required: - - minutesId - - title - - status - DashboardStatistics: type: object properties: @@ -1034,6 +1149,10 @@ components: type: string maxLength: 200 description: 회의 장소 + agenda: + type: string + maxLength: 1000 + description: 회의 안건 (선택 사항) participants: type: array items: @@ -1319,14 +1438,7 @@ components: type: array items: $ref: '#/components/schemas/MinutesSection' - aiSummaries: - type: array - items: - $ref: '#/components/schemas/AISummary' - relatedMinutes: - type: array - items: - $ref: '#/components/schemas/RelatedMinutes' + description: 섹션별 내용 (AI 요약 및 관련 회의록 포함) permissions: $ref: '#/components/schemas/MinutesPermissions' status: @@ -1390,6 +1502,14 @@ components: verifiedAt: type: string format: date-time + aiSummary: + $ref: '#/components/schemas/AISummary' + description: 이 섹션의 AI 요약 + relatedMinutes: + type: array + items: + $ref: '#/components/schemas/RelatedMinutes' + description: 이 섹션과 관련된 회의록 목록 (최대 3개) required: - sectionId - sectionType @@ -1405,11 +1525,9 @@ components: summaryId: type: string format: uuid - sectionId: - type: string - format: uuid content: type: string + description: AI가 생성한 요약 내용 createdAt: type: string format: date-time @@ -1418,7 +1536,6 @@ components: format: date-time required: - summaryId - - sectionId - content RelatedMinutes: @@ -1475,6 +1592,13 @@ components: type: string aiSummary: type: string + relatedMinutesIds: + type: array + items: + type: string + format: uuid + description: 이 섹션과 연결할 관련 회의록 ID 목록 (최대 3개) + maxItems: 3 required: - sectionId @@ -1541,6 +1665,102 @@ components: - isVerified # ==================== Todo Schemas ==================== + TodoListResponse: + type: object + properties: + statistics: + $ref: '#/components/schemas/TodoStatistics' + todos: + type: array + items: + $ref: '#/components/schemas/TodoDetail' + required: + - statistics + - todos + + TodoStatistics: + type: object + properties: + total: + type: integer + description: 전체 Todo 개수 + inProgress: + type: integer + description: 진행 중 Todo 개수 + completed: + type: integer + description: 완료된 Todo 개수 + urgent: + type: integer + description: 마감 임박 Todo 개수 (3일 이내) + completionRate: + type: number + format: double + description: 완료율 (%) + required: + - total + - inProgress + - completed + - urgent + - completionRate + + TodoDetail: + type: object + properties: + todoId: + type: string + format: uuid + content: + type: string + assignee: + $ref: '#/components/schemas/TodoAssignee' + dueDate: + type: string + format: date + priority: + type: string + enum: [HIGH, MEDIUM, LOW] + status: + type: string + enum: [IN_PROGRESS, COMPLETED] + progress: + type: integer + minimum: 0 + maximum: 100 + description: 진행률 (%) + minutesId: + type: string + format: uuid + meetingTitle: + type: string + description: 관련 회의 제목 + createdAt: + type: string + format: date-time + required: + - todoId + - content + - assignee + - priority + - status + - minutesId + - meetingTitle + + TodoAssignee: + type: object + properties: + userId: + type: string + email: + type: string + format: email + name: + type: string + required: + - userId + - email + - name + CreateTodoRequest: type: object properties: @@ -1643,29 +1863,17 @@ components: type: string description: type: string + icon: + type: string + description: 템플릿 아이콘 (이모지) category: type: string enum: [GENERAL, SCRUM, KICKOFF, WEEKLY] - required: - - templateId - - name - - category - - TemplateDetailResponse: - type: object - properties: - templateId: - type: string - name: - type: string - description: - type: string - category: - type: string sections: type: array items: $ref: '#/components/schemas/TemplateSection' + description: 템플릿 섹션 목록 required: - templateId - name