06c8039281
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 8s
CI / integration (pull_request) Successful in 11s
CI / ui (pull_request) Successful in 30s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m3s
Foundation for persisting a player's client-side composition: a game_drafts table (game_id, account_id, rack_order, board_tiles jsonb) with raw-SQL store/service methods — GetDraft/SaveDraft (seated-player check) and, on every committed move, clearing the actor's own draft and resetting any opponent's board draft whose cell the play overlapped (the draft can no longer be placed; the rack order is kept). Integration tests cover the round-trip, the actor clear, the overlap reset, a non-conflicting survival, and the outsider rejection. The gateway op slice + UI wiring follow.
22 lines
922 B
SQL
22 lines
922 B
SQL
-- +goose Up
|
|
-- Stage 17: a per-(game, account) draft the server persists across reloads and devices —
|
|
-- the player's preferred rack tile order (#4) and the tiles they have laid on the board but
|
|
-- not yet submitted (#5/#6). board_tiles is reset when an opponent's committed move overlaps
|
|
-- one of its cells (the draft can no longer be placed). Queried with raw SQL, so no
|
|
-- generated jet code is needed.
|
|
SET search_path = backend, pg_catalog;
|
|
|
|
CREATE TABLE game_drafts (
|
|
game_id uuid NOT NULL REFERENCES games (game_id) ON DELETE CASCADE,
|
|
account_id uuid NOT NULL REFERENCES accounts (account_id) ON DELETE CASCADE,
|
|
rack_order text NOT NULL DEFAULT '',
|
|
board_tiles jsonb NOT NULL DEFAULT '[]',
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (game_id, account_id)
|
|
);
|
|
|
|
-- +goose Down
|
|
SET search_path = backend, pg_catalog;
|
|
|
|
DROP TABLE game_drafts;
|