@startuml 회의예약및참석자초대
!theme mono

title 회의 예약 및 참석자 초대 플로우

actor "사용자" as User
participant "Web App" as WebApp
participant "API Gateway" as Gateway
participant "Meeting Service" as Meeting
database "Meeting DB" as MeetingDB
database "Redis Cache" as Redis
participant "Azure Event Hubs" as EventHub
participant "Notification Service" as Notification
participant "Email Service" as Email

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 -> WebApp: 회의 정보 입력\n(제목, 날짜/시간, 장소, 참석자)
activate WebApp

WebApp -> Gateway: POST /api/meetings\n+ JWT 토큰\n+ 사용자 정보 (userId, userName, email)
activate Gateway

Gateway -> Meeting: 회의 생성 요청
activate Meeting

Meeting -> MeetingDB: 회의 정보 저장\n(제목, 일시, 장소, 참석자, 생성자)
activate MeetingDB
MeetingDB --> Meeting: 회의 ID 반환
deactivate MeetingDB

Meeting -> Redis: 회의 정보 캐싱\nkey: meeting:info:{meetingId}\nTTL: 10분
activate Redis
Redis --> Meeting: 캐싱 완료
deactivate Redis

Meeting -> Redis: 참석자 목록 캐싱\nkey: meeting:participants:{meetingId}\nTTL: 10분
activate Redis
Redis --> Meeting: 캐싱 완료
deactivate Redis

Meeting -> EventHub: NotificationRequest 이벤트 발행
activate EventHub
note right
  이벤트 데이터:
  - 발송수단: EMAIL
  - 대상자: 참석자 목록
  - 메시지: 회의 초대 내용
  - 메타데이터: 회의 제목, 일시, 장소
end note
EventHub --> Meeting: 발행 완료
deactivate EventHub

Meeting --> Gateway: 201 Created\n회의 ID, 회의 정보
deactivate Meeting

Gateway --> WebApp: 회의 생성 응답
deactivate Gateway

WebApp --> User: 회의 예약 완료 표시\n캘린더에 자동 등록
deactivate WebApp

== 참석자 초대 알림 (비동기) ==
EventHub -> Notification: NotificationRequest 이벤트 수신\n(Consumer Group: notification-service-group)

Notification -> Email: 참석자 전원에게 초대 이메일 발송\n(회의 제목, 일시, 장소, 참여 링크)
Email --> Notification: 발송 완료

Notification -> MeetingDB: 알림 발송 기록 저장
MeetingDB --> Notification: 저장 완료

== 회의 시작 30분 전 리마인더 (스케줄링) ==
note over Notification
  스케줄링된 작업:
  회의 시작 시간 30분 전 자동 실행
end note

Notification -> Email: 참석자 전원에게 리마인더 이메일 발송\n(회의 시작 30분 전)
Email --> Notification: 발송 완료

@enduml
