@startuml
!theme mono

title 검증 완료 내부 시퀀스

participant "API Gateway<<E>>" as Gateway
participant "MeetingController" as Controller
participant "MeetingService" as Service
participant "Meeting" as Domain
participant "ValidationService" as ValidationService
participant "MeetingRepository" as Repository
database "PostgreSQL<<E>>" as DB
database "Redis Cache<<E>>" as Cache
queue "Event Hub<<E>>" as EventHub

Gateway -> Controller: POST /api/meetings/{id}/validate
activate Controller

Controller -> Service: validateMeeting(meetingId)
activate Service

Service -> Repository: findById(meetingId)
activate Repository
Repository -> DB: 회의 정보 조회\n(회의ID 기준)
activate DB
DB --> Repository: meeting_row
deactivate DB
Repository --> Service: Meeting entity
deactivate Repository

Service -> ValidationService: performValidation(meeting)
activate ValidationService

ValidationService -> ValidationService: validateStructure()
note right of ValidationService
구조 검증:
- 필수 섹션 존재
- 섹션 순서
- 데이터 완정성
end note

ValidationService -> ValidationService: validateContent()
note right of ValidationService
내용 검증:
- 필수 항목 기입
- 형식 준수
- 참조 무결성
end note

ValidationService -> ValidationService: validateBusiness()
note right of ValidationService
비즈니스 규칙:
- 참석자 서명
- Todo 할당 완료
- 첨부파일 검증
end note

ValidationService --> Service: ValidationResult
deactivate ValidationService

alt validation passed
    Service -> Domain: markAsValidated()
    activate Domain
    Domain -> Domain: changeStatus(VALIDATED)
    Domain --> Service: validated Meeting
    deactivate Domain

    Service -> Repository: save(meeting)
    activate Repository
    Repository -> DB: 회의 상태 업데이트\n(상태='검증완료')
    activate DB
    DB --> Repository: affected_rows
    deactivate DB
    Repository --> Service: savedMeeting
    deactivate Repository

    Service -> Cache: SET meeting:{id}\n(TTL: 10분)
    activate Cache
    note right of Cache
      회의 정보 캐싱:
      - TTL: 10분
      - 자동 만료
    end note
    Cache --> Service: OK
    deactivate Cache

    Service ->> EventHub: publish(MeetingValidatedEvent)
    activate EventHub
    note right of EventHub
    검증 완료 이벤트:
    - 확정 가능 상태 알림
    end note
    deactivate EventHub

    Service --> Controller: success response
else validation failed
    Service --> Controller: 400 Bad Request
    note right
      에러 응답 형식:
      {
        "error": {
          "code": "VALIDATION_FAILED",
          "message": "회의록 검증에 실패했습니다",
          "details": "필수 항목 누락 또는 형식 오류",
          "timestamp": "2025-10-23T12:00:00Z",
          "path": "/api/meetings/{id}/validate"
        }
      }
    end note
end

deactivate Service

Controller --> Gateway: 200 OK / 400 Bad Request
deactivate Controller

@enduml
