@startuml 회의록상세조회및수정
!theme mono

title 회의록상세조회및수정 외부 시퀀스

actor "사용자" as User
participant "Web App" as Frontend
participant "API Gateway" as Gateway
participant "Meeting Service" as Meeting
participant "AI Service" as AI
database "Redis Cache" as Cache
database "Meeting DB" as MeetingDB
participant "WebSocket" as WS

note over Gateway
  라우팅 규칙:
  /api/meetings/** → Meeting Service
  /api/minutes/** → Meeting Service
  /api/dashboard → User Service
  /api/notifications/** → Notification Service
  /api/auth/** → User Service
  /api/todos/** → Meeting Service
end note

== 회의록 상세 조회 ==

User -> Frontend: 회의록 클릭
activate Frontend

Frontend -> Gateway: GET /api/minutes/{minutesId}
activate Gateway

Gateway -> Meeting: GET /minutes/{minutesId}
activate Meeting

' 캐시 조회 (회의록 상세 정보)
Meeting --> Cache: GET minutes:detail:{minutesId}
activate Cache
Cache --> Meeting: 캐시 조회 결과
deactivate Cache

alt Cache Hit
    Meeting -> Meeting: 캐시 데이터 사용
else Cache Miss
    Meeting -> MeetingDB: 회의록 상세 조회\n- 회의 기본 정보\n- 섹션별 상세 내용\n- 참석자 목록\n- Todo 목록\n- 검증 상태
    activate MeetingDB
    MeetingDB --> Meeting: 회의록 데이터
    deactivate MeetingDB

    Meeting --> Cache: SET minutes:detail:{minutesId}\n(TTL: 10분)
    activate Cache
    Cache --> Meeting: 캐시 저장 완료
    deactivate Cache
end

' 관련 회의록 검색 (비동기, 선택적)
Meeting -> AI: POST /ai/related-minutes\n{\n  "minutesId": "{minutesId}",\n  "threshold": 0.7\n}
activate AI
AI -> AI: 벡터 유사도 검색\n- 회의 주제 임베딩\n- 과거 회의록 비교\n- 유사도 70%+ 필터링

AI --> Meeting: 관련 회의록 목록\n(최대 3개, 관련도순)
deactivate AI

Meeting --> Gateway: 회의록 상세 데이터 응답\n{\n  "minutesId": "...",\n  "title": "...",\n  "meetingInfo": {...},\n  "sections": [...],\n  "relatedMinutes": [...],\n  "participants": [...],\n  "todos": [...],\n  "verificationStatus": {...}\n}
deactivate Meeting

Gateway --> Frontend: 200 OK\n회의록 상세 데이터
deactivate Gateway

Frontend -> Frontend: 회의록 상세 화면 렌더링\n- 회의 기본 정보 표시\n- 섹션별 내용 표시\n- 관련 회의록 표시\n- Todo 목록 표시\n- 수정 권한 확인

Frontend --> User: 회의록 상세 화면 표시
deactivate Frontend

== 회의록 수정 ==

User -> Frontend: 수정 버튼 클릭
activate Frontend

Frontend -> Frontend: 수정 화면으로 전환\n- 마크다운 에디터 활성화\n- WebSocket 연결 준비

' WebSocket 연결 (실시간 동기화)
Frontend -> WS: WebSocket 연결\n(회의록 ID, 사용자 정보)
activate WS
WS --> Frontend: 연결 완료
deactivate WS

Frontend --> User: 수정 가능 상태
deactivate Frontend

User -> Frontend: 내용 수정 입력
activate Frontend

Frontend -> Frontend: 자동 저장 타이머 시작\n(30초 간격)

note over Frontend
  사용자가 계속 수정 중...
  30초마다 자동 저장
end note

Frontend -> Gateway: PATCH /api/minutes/{minutesId}\n{\n  "sections": [...],\n  "modifiedBy": "userId",\n  "timestamp": "...",\n  "delta": {...}\n}
activate Gateway

Gateway -> Meeting: PATCH /minutes/{minutesId}
activate Meeting

Meeting -> Meeting: 수정 권한 검증\n- 작성자 확인\n- 잠금 섹션 확인

alt 권한 없음
    Meeting --> Gateway: 403 Forbidden
    Gateway --> Frontend: 수정 권한 없음
    Frontend --> User: 오류 메시지 표시
else 권한 있음
    Meeting -> MeetingDB: 회의록 수정\n- 수정 내용 저장\n- 버전 관리 (이전 버전 보관)\n- 수정 이력 기록\n- 상태 변경 (확정완료 → 작성중)
    activate MeetingDB
    MeetingDB --> Meeting: 수정 완료
    deactivate MeetingDB

    ' 캐시 무효화
    Meeting --> Cache: DEL minutes:detail:{minutesId}
    activate Cache
    Cache --> Meeting: 캐시 삭제 완료
    deactivate Cache

    ' 실시간 동기화 (WebSocket)
    Meeting -> WS: 수정 델타 전송\n{\n  "minutesId": "...",\n  "modifiedBy": "...",\n  "delta": {...},\n  "timestamp": "..."\n}
    activate WS
    WS -> Frontend: 실시간 수정 반영\n(다른 참석자들에게)
    deactivate WS

    Meeting --> Gateway: 수정 완료 응답\n{\n  "version": "...",\n  "modifiedAt": "...",\n  "status": "작성중"\n}
    deactivate Meeting

    Gateway --> Frontend: 200 OK\n수정 완료
    deactivate Gateway

    Frontend -> Frontend: 수정 상태 업데이트\n- "저장됨" 표시\n- 수정 시간 갱신

    Frontend --> User: 수정 반영 완료
end

deactivate Frontend

== 섹션 AI 요약 재생성 (선택적) ==

User -> Frontend: "AI 재생성" 버튼 클릭\n(특정 섹션)
activate Frontend

Frontend -> Frontend: 로딩 상태 표시\n"AI 요약을 생성 중입니다..."

Frontend -> Gateway: POST /api/ai/sections/{sectionId}/regenerate-summary\n{\n  "sectionContent": "**논의 사항:**\n- AI 기반...",\n  "meetingId": "..."\n}
activate Gateway

Gateway -> AI: POST /sections/{sectionId}/regenerate-summary
activate AI

AI -> AI: 섹션 내용 분석 및 요약 생성\n- 회의 맥락 조회\n- LLM 기반 요약 (2-3문장)\n- 처리 시간: 2-5초

AI --> Gateway: 생성된 AI 요약\n{\n  "summary": "AI 기반 회의록...",\n  "generatedAt": "..."\n}
deactivate AI

Gateway --> Frontend: 200 OK\nAI 요약
deactivate Gateway

Frontend -> Frontend: AI 요약 영역 업데이트\n- 생성된 요약 표시\n- "저장됨" 표시

Frontend --> User: AI 요약 재생성 완료
deactivate Frontend

note over User, AI
AI 재생성 특징:
- 각 섹션별 독립 처리
- 사용자가 수정한 내용 기반
- 프롬프트 입력 없이 자동 생성
- 생성된 요약은 사용자가 다시 수정 가능
- 처리 시간 2-5초 (빠름)
end note

@enduml
