SlotKeeper 設計と品質

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