SlotKeeper 設計と品質

cancel_reservation sequence

sequenceDiagram
  autonumber
  participant User as User
  participant API as API
  participant DB as DB
  User->>API: POST /reservations/{reservationId}/cancel
  alt Authorization ヘッダのBearer tokenが未指定、または署名・issuer・client・用途・期限を検証できない場合。
    API-->>User: HTTP 401 Unauthorized<br/>authentication_required / invalid_token
  end
  alt Path/Query/Header/Body が型または制約に一致しない場合。
    API-->>User: HTTP 422 Unprocessable Content<br/>invalid_input
  end
  Note over API,DB: DBの直列化競合・一意性競合・OCC競合は、rollback後に新しいsnapshotで処理順を最大12回・8秒まで再実行する。
  Note over API,DB: DB transaction範囲開始 (最初のDB操作からcommit/rollbackまで)
  API->>DB: 取消対象の予約と版を確認するため、指定した予約を取得する。<br/>SQL 001_select_reservations.sql<br/>テーブル reservations
  alt 取消対象の予約が存在しない場合。
    API->>DB: DB transactionをrollbackして変更を破棄する。
    API-->>User: HTTP 404 Not Found<br/>reservation_not_found
  end
  alt 呼び出し元が予約者本人または管理者でない場合。
    API->>API: 予約取消の権限がない場合の運用ログと error response を組み立てる。
    API->>DB: DB transactionをrollbackして変更を破棄する。
    API-->>User: HTTP 403 Forbidden<br/>forbidden
  end
  API->>DB: 同一資源の再予約と取消を競合させるため、資源の内部制御版を進める。<br/>SQL 002_update_resources_control_version.sql<br/>テーブル resources
  alt 取消対象の予約の資源が存在しない場合。
    API->>DB: DB transactionをrollbackして変更を破棄する。
    API-->>User: HTTP 404 Not Found<br/>resource_not_found
  end
  alt 取消要求の版が予約の現在の版と一致しない場合。
    API->>API: 予約の版が古い場合の運用ログと error response を組み立てる。
    API->>DB: DB transactionをrollbackして変更を破棄する。
    API-->>User: HTTP 409 Conflict<br/>stale_version
  end
  alt 予約が取消前の確定状態でない場合。
    API->>API: 取消済み予約への取消を拒否する場合の運用ログと error response を組み立てる。
    API->>DB: DB transactionをrollbackして変更を破棄する。
    API-->>User: HTTP 409 Conflict<br/>already_cancelled
  end
  alt 予約の開始時刻が現在時刻以前である場合。
    API->>API: 開始済み予約への取消を拒否する場合の運用ログと error response を組み立てる。
    API->>DB: DB transactionをrollbackして変更を破棄する。
    API-->>User: HTTP 409 Conflict<br/>already_started
  end
  API->>DB: 予約を取消状態へ変更し、版を進める。<br/>SQL 003_update_reservations.sql<br/>テーブル reservations
  alt 取消時点で予約が存在しない場合。
    API->>DB: DB transactionをrollbackして変更を破棄する。
    API-->>User: HTTP 404 Not Found<br/>reservation_not_found
  end
  API->>DB: 予約取消の履歴を取消と同じtransactionで追記する。<br/>SQL 004_insert_reservation_events.sql<br/>テーブル reservation_events
  API->>DB: DB transactionをcommitして変更を確定する。
  API->>API: 取消後の予約のレスポンスを組み立てる。
  API-->>User: HTTP 200 OK
  alt Router で捕捉した例外を error response に変換する場合。
    API->>API: Router で捕捉した例外を運用ログと HTTP error response に変換する。
    API-->>User: HTTP 500 Internal Server Error<br/>internal server error
  end
  alt DBの競合や接続障害が再試行上限を超えた場合。
    API-->>User: HTTP 503 Service Unavailable<br/>storage_temporarily_unavailable
  end