@startuml !theme mono title 외부 시퀀스 - 회의 종료 및 최종 확정 actor "사용자" as User participant "Web App" as WebApp participant "API Gateway" as Gateway participant "Meeting Service" as Meeting participant "STT Service" as STT participant "AI Service" as AI participant "Notification Service" as Notification participant "Azure Event Hubs" as EventHub == 회의 종료 == User -> WebApp: 회의 종료 버튼 클릭 WebApp -> Gateway: POST /meetings/{meetingId}/end note right 요청 헤더에 JWT 토큰 포함 요청 바디에 사용자 정보 포함 (userId, userName, email) end note Gateway -> Meeting: 회의 종료 요청 Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의 통계 생성\n (총 시간, 참석자 수, 발언 횟수 등) Meeting -> Meeting: DB 저장 Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId}) Meeting -> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime) note right Partition Key: {meetingId} Consumer Group: - stt-service-group - ai-service-group - notification-service-group end note Meeting -> Gateway: 202 Accepted\n(회의 종료 완료) Gateway -> WebApp: 회의 종료 완료 응답 WebApp -> User: 회의 통계 표시\n(총 시간, 참석자, 발언 횟수 등) == 비동기 처리 - STT 종료 == EventHub --> STT: MeetingEnded 이벤트 수신 STT -> STT: 음성 녹음 중지 STT -> STT: 최종 STT 변환 완료 확인 == 비동기 처리 - AI Todo 추출 == EventHub --> AI: MeetingEnded 이벤트 수신 AI -> AI: 최종 회의록 분석 AI -> AI: Todo 자동 추출\n- 액션 아이템 식별\n- 담당자 자동 식별\n- 마감일 추출 AI -> AI: DB 저장 (AiTaskStatus) AI -> Meeting: POST /meetings/{meetingId}/todos\n(Todo 정보 전송) note right Todo 정보: - Todo 내용 - 담당자 (자동 식별) - 마감일 (언급된 경우) - 우선순위 - 관련 회의록 섹션 링크 end note Meeting -> Meeting: Todo 생성 및 할당\n(내부 처리) Meeting -> Meeting: 회의록 섹션 링크 연결 Meeting -> Meeting: DB 저장 (Todo 테이블) Meeting -> Meeting: Redis 캐시 무효화\n(todo:user:{userId}) Meeting -> EventHub: TodoCreated 이벤트 발행\n(todoId, assignee, dueDate) note right Partition Key: {userId} Consumer Group: - notification-service-group end note Meeting -> AI: 200 OK (Todo 생성 완료) == 비동기 처리 - 회의 종료 알림 == EventHub --> Notification: MeetingEnded 이벤트 수신 Notification -> Notification: 회의 종료 알림 준비\n(참석자 전원) Notification -> Notification: 이메일 발송 note right 알림 내용: - 회의 제목 - 회의 종료 시간 - 회의 통계 - 회의록 링크 end note == 비동기 처리 - Todo 할당 알림 == EventHub --> Notification: TodoCreated 이벤트 수신 Notification -> Notification: Todo 할당 알림 준비 Notification -> Notification: 담당자에게 이메일 발송 note right 알림 내용: - Todo 내용 - 마감일 - 우선순위 - 회의록 링크 (해당 섹션) end note == 최종 회의록 확정 == User -> WebApp: 최종 회의록 확정 버튼 클릭 WebApp -> Gateway: POST /meetings/{meetingId}/transcripts/finalize note right 요청 헤더에 JWT 토큰 포함 요청 바디에 사용자 정보 포함 end note Gateway -> Meeting: 회의록 확정 요청 Meeting -> Meeting: 필수 항목 검사\n- 회의 제목\n- 참석자 목록\n- 주요 논의 내용\n- 결정 사항 alt 필수 항목 미작성 Meeting -> Gateway: 400 Bad Request\n(누락된 항목 정보) Gateway -> WebApp: 검증 실패 응답 WebApp -> User: 누락된 항목 안내\n(해당 섹션으로 자동 이동) else 필수 항목 작성 완료 Meeting -> Meeting: 회의록 최종 확정\n- 확정 버전 생성\n- 확정 시간 기록\n- 공유 가능 상태로 전환 Meeting -> Meeting: DB 저장 (TranscriptVersion) Meeting -> Meeting: Redis 캐시 무효화 Meeting -> EventHub: TranscriptFinalized 이벤트 발행\n(meetingId, version, finalizedAt) note right Partition Key: {meetingId} Consumer Group: - notification-service-group end note Meeting -> Gateway: 200 OK\n(확정 버전 정보) Gateway -> WebApp: 회의록 확정 완료 WebApp -> User: 확정 완료 안내\n(버전 번호, 확정 시간) EventHub --> Notification: TranscriptFinalized 이벤트 수신 Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원) end @enduml