@startuml !theme mono title Flow 6: 회의록 확정 및 공유 (Transcript Confirmation and Sharing) actor "사용자\n(User)" as User participant "Web App" as Web participant "API Gateway" as Gateway participant "Meeting Service" as Meeting participant "Notification Service" as Notification queue "RabbitMQ" as MQ database "Redis" as Cache database "PostgreSQL" as DB == 회의록 검토 (Transcript Review) == User -> Web: 1. 회의록 최종 검토\n(Review final transcript) activate Web Web -> Gateway: 2. GET /api/meetings/{meetingId}/transcript\n(Get transcript for review) activate Gateway Gateway -> Meeting: 3. 회의록 조회 요청\n(Forward transcript query) activate Meeting Meeting -> Cache: 4. 캐시에서 회의록 조회\n(Check cache for transcript) activate Cache Cache --> Meeting: 캐시 히트/미스\n(Cache hit/miss) deactivate Cache alt 캐시 미스 (Cache miss) Meeting -> DB: 5. DB에서 회의록 조회\n(Query transcript from DB) activate DB DB --> Meeting: 회의록 데이터 반환\n(Return transcript data) deactivate DB Meeting -> Cache: 6. 캐시에 저장\n(Store in cache) activate Cache Cache --> Meeting: 저장 완료\n(Stored) deactivate Cache end Meeting --> Gateway: 7. 회의록 반환\n(Return transcript) deactivate Meeting Gateway --> Web: 8. 회의록 데이터\n(Return transcript data) deactivate Gateway Web --> User: 9. 회의록 표시\n(Display transcript) deactivate Web == 필수 항목 검증 (Validate Required Sections) == User -> Web: 10. 회의록 확정 요청\n(Request transcript confirmation) activate Web Web -> Web: 11. 필수 항목 검증\n- 회의 제목 존재 여부\n- 참석자 목록 존재 여부\n- 주요 결정사항 작성 여부\n(Validate required sections:\n- Title exists\n- Participants list exists\n- Key decisions documented) alt 필수 항목 누락 (Missing required sections) Web --> User: 12. 필수 항목 누락 경고\n(Display missing sections warning) deactivate Web else 검증 통과 (Validation passed) Web -> Gateway: 13. POST /api/meetings/{meetingId}/confirm\n(Confirm transcript request) activate Gateway Gateway -> Meeting: 14. 회의록 확정 요청\n(Forward confirmation request) activate Meeting Meeting -> DB: 15. 회의록 확정 처리\n- 최종 버전 생성 (version++)\n- 확정 상태로 변경 (status: "confirmed")\n- 확정 일시 기록\n(Confirm transcript:\n- Create final version\n- Update status to "confirmed"\n- Record confirmation time) activate DB DB --> Meeting: 확정 완료\n(Confirmation saved) deactivate DB Meeting -> Cache: 16. 캐시 무효화\n(Invalidate cache) activate Cache Cache --> Meeting: 캐시 삭제 완료\n(Cache invalidated) deactivate Cache Meeting --> Gateway: 17. 확정 완료 응답\n(Return confirmation response) deactivate Meeting Gateway --> Web: 18. 확정 완료\n(Confirmation successful) deactivate Gateway Web --> User: 19. 확정 완료 메시지 표시\n(Display confirmation message) deactivate Web end == 공유 설정 (Configure Sharing) == User -> Web: 20. 공유 설정 화면 열기\n(Open sharing configuration) activate Web Web --> User: 21. 공유 옵션 표시\n- 수신자 선택\n- 권한 설정 (읽기/편집)\n- 공유 범위 (전체/일부)\n(Display sharing options:\n- Select recipients\n- Set permissions\n- Choose scope) deactivate Web User -> Web: 22. 공유 설정 입력\n- 수신자 목록\n- 권한 레벨\n- 메시지 (선택)\n(Input sharing settings:\n- Recipients list\n- Permission level\n- Optional message) activate Web Web -> Gateway: 23. POST /api/meetings/{meetingId}/share\n{recipients, permissions, message}\n(Submit sharing request) activate Gateway Gateway -> Meeting: 24. 공유 설정 요청\n(Forward sharing request) activate Meeting Meeting -> DB: 25. 공유 링크 생성\n- 고유 공유 ID 생성 (UUID)\n- 공유 권한 저장\n- 유효기간 설정 (선택)\n(Generate share link:\n- Create unique share ID\n- Save permissions\n- Set expiration if configured) activate DB DB --> Meeting: 공유 정보 저장 완료\n(Share info saved) deactivate DB Meeting -> Cache: 26. 공유 링크 캐시 저장\n(Cache share link) activate Cache Cache --> Meeting: 캐시 저장 완료\n(Cached) deactivate Cache Meeting ->> MQ: 27. "TranscriptShared" 이벤트 발행\n(Publish "TranscriptShared" event)\n{meetingId, shareId, recipients, permissions} activate MQ Meeting --> Gateway: 28. 공유 링크 반환\n(Return share link) deactivate Meeting Gateway --> Web: 29. 공유 링크 및 확인\n(Return share link) deactivate Gateway Web --> User: 30. 공유 완료 메시지 및 링크 표시\n(Display share link and confirmation) deactivate Web == 공유 알림 발송 (Send Share Notifications) == MQ ->> Notification: 31. "TranscriptShared" 이벤트 수신\n(Receive "TranscriptShared" event) activate Notification loop 각 수신자마다 (For each recipient) Notification -> DB: 32. 수신자 정보 조회\n(Query recipient information) activate DB DB --> Notification: 사용자 정보 및 이메일\n(Return user info and email) deactivate DB Notification -> Notification: 33. 공유 알림 이메일 생성\n- 회의 정보\n- 공유 링크\n- 권한 레벨\n- 발신자 메시지\n(Generate share notification email:\n- Meeting info\n- Share link\n- Permission level\n- Sender message) Notification -> Notification: 34. 이메일 발송\n(Send email to recipient) Notification -> DB: 35. 알림 전송 기록 저장\n(Save notification log) activate DB DB --> Notification: 저장 완료\n(Save confirmed) deactivate DB end deactivate Notification deactivate MQ == 참여자 알림 (Participant Notification) == note over Notification 모든 회의 참여자에게도 회의록 확정 알림 발송 (Send confirmation notification to all meeting participants) end note Notification ->> Notification: 36. 참여자 알림 처리\n(Process participant notifications) activate Notification Notification -> DB: 37. 참여자 목록 조회\n(Query participants list) activate DB DB --> Notification: 참여자 정보 반환\n(Return participants info) deactivate DB loop 각 참여자마다 (For each participant) Notification -> Notification: 38. 확정 알림 이메일 생성\n- 회의록 확정 알림\n- 회의록 보기 링크\n- 주요 내용 요약\n(Generate confirmation email:\n- Transcript confirmed\n- View link\n- Summary) Notification -> Notification: 39. 이메일 발송\n(Send email) Notification -> DB: 40. 알림 기록 저장\n(Save notification log) activate DB DB --> Notification: 저장 완료\n(Saved) deactivate DB end deactivate Notification @enduml