When a game finishes (win or draw), players see a "Play again" button. Clicking it creates a new game and the opponent sees a "Join Rematch" link to join the same game.
46 lines
1.2 KiB
SQL
46 lines
1.2 KiB
SQL
-- name: CreateGame :one
|
|
INSERT INTO games (id, board, current_turn, status)
|
|
VALUES (?, ?, ?, ?)
|
|
RETURNING *;
|
|
|
|
-- name: GetGame :one
|
|
SELECT * FROM games WHERE id = ?;
|
|
|
|
-- name: UpdateGame :exec
|
|
UPDATE games
|
|
SET board = ?, current_turn = ?, status = ?, winner_user_id = ?, winning_cells = ?, rematch_game_id = ?, updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = ?;
|
|
|
|
-- name: DeleteGame :exec
|
|
DELETE FROM games WHERE id = ?;
|
|
|
|
-- name: GetActiveGames :many
|
|
SELECT * FROM games WHERE status < 2;
|
|
|
|
-- name: CreateGamePlayer :exec
|
|
INSERT INTO game_players (game_id, user_id, guest_player_id, nickname, color, slot)
|
|
VALUES (?, ?, ?, ?, ?, ?);
|
|
|
|
-- name: GetGamePlayers :many
|
|
SELECT * FROM game_players WHERE game_id = ?;
|
|
|
|
-- name: GetGamesByUserID :many
|
|
SELECT g.* FROM games g
|
|
JOIN game_players gp ON g.id = gp.game_id
|
|
WHERE gp.user_id = ?
|
|
ORDER BY g.updated_at DESC;
|
|
|
|
-- name: GetUserActiveGames :many
|
|
SELECT
|
|
g.id,
|
|
g.status,
|
|
g.current_turn,
|
|
g.updated_at,
|
|
gp_user.color as my_color,
|
|
gp_opponent.nickname as opponent_nickname
|
|
FROM games g
|
|
JOIN game_players gp_user ON g.id = gp_user.game_id AND gp_user.user_id = ?
|
|
LEFT JOIN game_players gp_opponent ON g.id = gp_opponent.game_id AND gp_opponent.slot != gp_user.slot
|
|
WHERE g.status < 2
|
|
ORDER BY g.updated_at DESC;
|