設計書 → 40.apis → reservations → cancel_reservation → detail-design_gen.md
cancel_reservation detail design
- Operation:
cancelReservation
- Endpoint:
POST /reservations/{reservationId}/cancel
1. 正常系入力
| Location |
Name |
Type |
説明 |
path |
reservationId |
ResourceId |
予約を一意に識別するIDです。 |
body |
request |
CancelReservationRequest |
- |
Request body CancelReservationRequest
| 項目 |
型 |
説明 |
version |
RowVersion |
取消前に取得した予約の版です。 |
2. 正常系前提
- 条件分岐: 呼び出し元が予約者本人または管理者でない場合。: 不成立
- 条件分岐: 取消要求の版が予約の現在の版と一致しない場合。: 不成立
- 条件分岐: 予約が取消前の確定状態でない場合。: 不成立
- 条件分岐: 予約の開始時刻が現在時刻以前である場合。: 不成立
- 例外処理: ROUTER_HANDLED_EXCEPTIONS: 発生しない
3. 正常系リソース変更
DB resources 更新
- SQL:
002_update_resources_control_version.sql
- 目的: 同一資源の再予約と取消を競合させるため、資源の内部制御版を進めて現在値を取得する。
| カラム |
カラム説明 |
パラメータ/SQL式 |
値の取得元 |
control_version |
同一資源の予約作成・取消・無効化を競合させる内部制御版。 |
control_version + 1 |
SQL式: control_version + 1 |
DB reservations 更新
- SQL:
003_update_reservations.sql
- 目的: 予約を取消状態へ変更し、版を1つ進める。
| カラム |
カラム説明 |
パラメータ/SQL式 |
値の取得元 |
status |
予約状態。confirmedまたはcancelled。 |
'cancelled' |
SQL式: 'cancelled' |
row_version |
楽観ロック用の行バージョン。 |
row_version + 1 |
SQL式: row_version + 1 |
DB reservation_events 作成
- SQL:
004_insert_reservation_events.sql
- 目的: 予約取消の履歴を取消と同じtransactionで追記する。
| カラム |
カラム説明 |
パラメータ/SQL式 |
値の取得元 |
event_id |
履歴ID。 |
event_id |
自動生成: uuid4() を str 化 |
reservation_id |
対象の予約ID。 |
reservation_id |
reservation.reservation_id |
actor_principal_id |
操作した利用者の認証subject。 |
actor_principal_id |
認証主体: caller.principalId |
action |
操作種別。createdまたはcancelled。 |
'cancelled' |
SQL式: 'cancelled' |
occurred_at |
操作日時。 |
occurred_at |
clock.now() |
4. 正常系レスポンス
- Response model:
CancelReservationResponse
| 項目 |
説明 |
値の取得元 |
reservationId |
予約を一意に識別するIDです。 |
reservation.reservation_id |
resourceId |
予約対象の資源を一意に識別するIDです。 |
reservation.resource_id |
ownerPrincipalId |
予約者を表す認証主体IDです。 |
reservation.owner_principal_id |
startAt |
予約開始日時です。 |
reservation.start_at |
endAt |
予約終了日時です。この時刻を含みません。 |
reservation.end_at |
purpose |
予約目的です。本人と管理者だけに返します。 |
reservation.purpose |
status |
予約の状態です。 |
reservation.status |
version |
予約取消の楽観ロックに使う版です。 |
reservation.version |