@startuml 대시보드조회
!theme mono

title 대시보드조회 외부 시퀀스

actor "사용자" as User
participant "Web App" as Frontend
participant "API Gateway" as Gateway
participant "User Service" as UserService
participant "Meeting Service" as MeetingService
database "Redis Cache" as Cache
database "User DB" as UserDB
database "Meeting DB" as MeetingDB

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/dashboard?\npage=1&size=10&sort=createdAt,desc
note right
  페이지네이션 파라미터:
  - page: 페이지 번호 (기본값: 1)
  - size: 페이지 크기 (기본값: 10)
  - sort: 정렬 기준 (기본값: createdAt,desc)
end note
activate Gateway

Gateway -> UserService: GET /dashboard?\npage=1&size=10&sort=createdAt,desc
activate UserService

' 캐시 조회
UserService -> Cache: GET dashboard:{userId}
activate Cache
Cache --> UserService: 캐시 조회 결과
deactivate Cache

alt Cache Hit
    UserService -> UserService: 캐시 데이터 반환
else Cache Miss
    par 병렬 데이터 조회
        ' Meeting Service 호출
        UserService -> MeetingService: GET /api/v1/dashboard
        note right
          Meeting Service에서 조회:
          - 예정된 회의 목록
          - 진행 중 Todo 목록
          - 최근 회의록 목록
          - 공유받은 회의록
          - 통계 정보
        end note
        activate MeetingService
        MeetingService -> Cache: GET dashboard:{userId}
        activate Cache
        Cache --> MeetingService: 캐시 조회 결과
        deactivate Cache

        alt Meeting Service 캐시 미존재
            MeetingService -> MeetingDB: 회의/Todo/회의록 데이터 조회
            activate MeetingDB
            MeetingDB --> MeetingService: 조회 결과
            deactivate MeetingDB

            MeetingService -> Cache: SET dashboard:{userId}\n(TTL: 5분)
            activate Cache
            Cache --> MeetingService: 캐시 저장
            deactivate Cache
        end

        MeetingService --> UserService: 회의 관련 데이터 응답\n{\n  "upcomingMeetings": [...],\n  "activeTodos": [...],\n  "recentMinutes": [...],\n  "sharedMinutes": [...],\n  "statistics": {...}\n}
        deactivate MeetingService
    else
        ' User Service 자체 데이터 조회
        UserService -> UserDB: 최근 활동 내역 조회
        activate UserDB
        UserDB --> UserService: 활동 내역
        deactivate UserDB
    end

    UserService -> UserService: 데이터 통합 및 조합
    note right
      대시보드 데이터 구성:
      - Meeting Service 데이터
      - User Service 활동 내역
      - 통합 통계 정보
    end note

    UserService -> Cache: SET dashboard:{userId}\n(TTL: 5분)
    activate Cache
    Cache --> UserService: 캐시 저장 완료
    deactivate Cache
end

UserService --> Gateway: 대시보드 데이터 응답\n{\n  "upcomingMeetings": [...],\n  "activeTodos": [...],\n  "recentMinutes": [...],\n  "recentActivities": [...],\n  "statistics": {...},\n  "pagination": {\n    "page": 1,\n    "size": 10,\n    "totalElements": 45,\n    "totalPages": 5,\n    "hasNext": true\n  }\n}
deactivate UserService

Gateway --> Frontend: 200 OK\n대시보드 데이터 + 페이지네이션 정보
deactivate Gateway

Frontend -> Frontend: 대시보드 화면 렌더링\n- 예정된 회의 표시\n- Todo 목록 표시\n- 최근 회의록 표시\n- 통계 차트 표시

Frontend --> User: 대시보드 화면 표시
deactivate Frontend

@enduml
