|
|
|
@@ -0,0 +1,52 @@ |
|
|
|
import pg from "pg"; |
|
|
|
|
|
|
|
const client = new pg.Client({ |
|
|
|
host: process.env.PROVISION_HOST, |
|
|
|
port: parseInt(process.env.PROVISION_PORT ?? "5432"), |
|
|
|
user: process.env.PROVISION_USER, |
|
|
|
password: process.env.PROVISION_PASSWORD, |
|
|
|
database: process.env.PROVISION_DATABASE, |
|
|
|
}); |
|
|
|
|
|
|
|
await client.connect(); |
|
|
|
|
|
|
|
try { |
|
|
|
await client.query(` |
|
|
|
CREATE TABLE IF NOT EXISTS players ( |
|
|
|
id TEXT PRIMARY KEY, |
|
|
|
games_played INT NOT NULL DEFAULT 0, |
|
|
|
games_won INT NOT NULL DEFAULT 0, |
|
|
|
games_lost INT NOT NULL DEFAULT 0, |
|
|
|
best_attempts INT, |
|
|
|
current_streak INT NOT NULL DEFAULT 0, |
|
|
|
best_streak INT NOT NULL DEFAULT 0, |
|
|
|
last_played_at TIMESTAMPTZ, |
|
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now() |
|
|
|
) |
|
|
|
`); |
|
|
|
|
|
|
|
await client.query(` |
|
|
|
CREATE TABLE IF NOT EXISTS games ( |
|
|
|
id BIGSERIAL PRIMARY KEY, |
|
|
|
player_id TEXT NOT NULL REFERENCES players(id) ON DELETE CASCADE, |
|
|
|
target INT NOT NULL, |
|
|
|
attempts INT NOT NULL, |
|
|
|
won BOOLEAN NOT NULL, |
|
|
|
finished_at TIMESTAMPTZ NOT NULL DEFAULT now() |
|
|
|
) |
|
|
|
`); |
|
|
|
|
|
|
|
await client.query(` |
|
|
|
CREATE INDEX IF NOT EXISTS idx_players_scoreboard |
|
|
|
ON players (best_attempts NULLS LAST, last_played_at) |
|
|
|
`); |
|
|
|
|
|
|
|
await client.query(` |
|
|
|
CREATE INDEX IF NOT EXISTS idx_games_player_history |
|
|
|
ON games (player_id, finished_at DESC) |
|
|
|
`); |
|
|
|
|
|
|
|
console.log("[txt-game migration-000] score schema created"); |
|
|
|
} finally { |
|
|
|
await client.end(); |
|
|
|
} |