SlotKeeper 設計と品質

create_reservation query

001_select_idempotency_records.sql

SQL種別

SELECT

SQLの概要

予約作成要求の再送を照合するため、利用者とIdempotency-Keyの成功記録を取得する。

利用するテーブル

  • idempotency_records

引数

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
idempotency_records principal_id principal_id 要求した利用者の認証subject。 VARCHAR(200) no
idempotency_records idempotency_key idempotency_key Idempotency-Keyヘッダの値。 VARCHAR(128) no

戻り値

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
idempotency_records idempotency_key idempotency_key Idempotency-Keyヘッダの値。 VARCHAR(128) no
idempotency_records request_hash request_hash 正規化した要求本文のSHA-256。 VARCHAR(64) no
idempotency_records response_payload response_payload 元の成功応答のJSON。 TEXT no
idempotency_records expires_at expires_at 成功記録の有効期限。 TIMESTAMPTZ no

条件

  • WHERE
    • idempotency_records.principal_id = @principal_id
    • AND idempotency_records.idempotency_key = @idempotency_key

002_update_resources_control_version.sql

SQL種別

UPDATE

SQLの概要

同一資源の予約作成・取消・無効化を競合させるため、資源の内部制御版を進めて現在値を取得する。

利用するテーブル

  • resources

引数

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
resources resource_id resource_id 資源ID。 VARCHAR(36) no

戻り値

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
resources resource_id resource_id 資源ID。 VARCHAR(36) no
resources active active 新規予約を受け付けるかどうか。 BOOLEAN no
resources row_version row_version 利用者に公開する楽観ロック用の行バージョン。 INT no

条件

  • WHERE
    • resource_id = @resource_id

003_select_reservations.sql

SQL種別

SELECT

SQLの概要

予約枠の重複を判定するため、取消済みを除き半開区間が重なる確定予約の件数を取得する。

利用するテーブル

  • reservations

引数

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
reservations resource_id resource_id 予約対象の資源ID。 VARCHAR(36) no
reservations start_at end_at 予約開始日時。UTCで保存する。 TIMESTAMPTZ no
reservations end_at start_at 予約終了日時。UTCで保存し、この時刻を含まない。 TIMESTAMPTZ no

戻り値

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
- overlapping_reservation_count overlapping_reservation_count - int no

条件

  • WHERE
    • reservations.resource_id = @resource_id
    • AND reservations.status = 'confirmed'
    • AND reservations.start_at < @end_at
    • AND reservations.end_at > @start_at

004_delete_idempotency_records.sql

SQL種別

DELETE

SQLの概要

有効期限を過ぎた成功記録を新規要求として扱うため削除する。

利用するテーブル

  • idempotency_records

引数

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
idempotency_records principal_id principal_id 要求した利用者の認証subject。 VARCHAR(200) no
idempotency_records idempotency_key idempotency_key Idempotency-Keyヘッダの値。 VARCHAR(128) no

戻り値

なし

条件

  • WHERE
    • principal_id = @principal_id
    • AND idempotency_key = @idempotency_key

005_insert_users.sql

SQL種別

INSERT

SQLの概要

初めて予約する利用者を記録する。既存利用者は変更しない。

利用するテーブル

  • users

引数

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
users principal_id principal_id 認証基盤のsubject。 VARCHAR(200) no
users first_seen_at first_seen_at 初めて予約した日時。 TIMESTAMPTZ no

戻り値

なし

条件

なし

006_insert_reservations.sql

SQL種別

INSERT

SQLの概要

予約を確定状態の初期版で保存する。

利用するテーブル

  • reservations

引数

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
reservations reservation_id reservation_id 予約ID。 VARCHAR(36) no
reservations resource_id resource_id 予約対象の資源ID。 VARCHAR(36) no
reservations owner_principal_id owner_principal_id 予約者の認証subject。 VARCHAR(200) no
reservations start_at start_at 予約開始日時。UTCで保存する。 TIMESTAMPTZ no
reservations end_at end_at 予約終了日時。UTCで保存し、この時刻を含まない。 TIMESTAMPTZ no
reservations purpose purpose 予約目的。1〜200文字。本人と管理者だけに返す。 VARCHAR(200) no

戻り値

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
reservations reservation_id reservation_id 予約ID。 VARCHAR(36) no
reservations resource_id resource_id 予約対象の資源ID。 VARCHAR(36) no
reservations owner_principal_id owner_principal_id 予約者の認証subject。 VARCHAR(200) no
reservations start_at start_at 予約開始日時。UTCで保存する。 TIMESTAMPTZ no
reservations end_at end_at 予約終了日時。UTCで保存し、この時刻を含まない。 TIMESTAMPTZ no
reservations purpose purpose 予約目的。1〜200文字。本人と管理者だけに返す。 VARCHAR(200) no
reservations status status 予約状態。confirmedまたはcancelled。 VARCHAR(20) no
reservations row_version row_version 楽観ロック用の行バージョン。 INT no

条件

なし

007_insert_reservation_events.sql

SQL種別

INSERT

SQLの概要

予約作成の履歴を予約と同じtransactionで追記する。

利用するテーブル

  • reservation_events

引数

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
reservation_events event_id event_id 履歴ID。 VARCHAR(36) no
reservation_events reservation_id reservation_id 対象の予約ID。 VARCHAR(36) no
reservation_events actor_principal_id actor_principal_id 操作した利用者の認証subject。 VARCHAR(200) no
reservation_events occurred_at occurred_at 操作日時。 TIMESTAMPTZ no

戻り値

なし

条件

なし

008_insert_idempotency_records.sql

SQL種別

INSERT

SQLの概要

元の成功応答を予約と同じtransactionで24時間の成功記録として保存する。

利用するテーブル

  • idempotency_records

引数

DDLテーブル DDL項目 SQL項目 日本語名 型 nullable
idempotency_records principal_id principal_id 要求した利用者の認証subject。 VARCHAR(200) no
idempotency_records idempotency_key idempotency_key Idempotency-Keyヘッダの値。 VARCHAR(128) no
idempotency_records request_hash request_hash 正規化した要求本文のSHA-256。 VARCHAR(64) no
idempotency_records response_payload response_payload 元の成功応答のJSON。 TEXT no
idempotency_records expires_at expires_at 成功記録の有効期限。 TIMESTAMPTZ no

戻り値

なし

条件

なし