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 |
条件
WHEREidempotency_records.principal_id = @principal_idAND 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 |
条件
WHEREresource_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 |
条件
WHEREreservations.resource_id = @resource_idAND reservations.status = 'confirmed'AND reservations.start_at < @end_atAND 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 |
戻り値
なし
条件
WHEREprincipal_id = @principal_idAND 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 |
戻り値
なし
条件
なし