Small text-based online game — a HAL mesh module
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

53 строки
1.4KB

  1. import pg from "pg";
  2. const client = new pg.Client({
  3. host: process.env.PROVISION_HOST,
  4. port: parseInt(process.env.PROVISION_PORT ?? "5432"),
  5. user: process.env.PROVISION_USER,
  6. password: process.env.PROVISION_PASSWORD,
  7. database: process.env.PROVISION_DATABASE,
  8. });
  9. await client.connect();
  10. try {
  11. await client.query(`
  12. CREATE TABLE IF NOT EXISTS players (
  13. id TEXT PRIMARY KEY,
  14. games_played INT NOT NULL DEFAULT 0,
  15. games_won INT NOT NULL DEFAULT 0,
  16. games_lost INT NOT NULL DEFAULT 0,
  17. best_attempts INT,
  18. current_streak INT NOT NULL DEFAULT 0,
  19. best_streak INT NOT NULL DEFAULT 0,
  20. last_played_at TIMESTAMPTZ,
  21. created_at TIMESTAMPTZ NOT NULL DEFAULT now()
  22. )
  23. `);
  24. await client.query(`
  25. CREATE TABLE IF NOT EXISTS games (
  26. id BIGSERIAL PRIMARY KEY,
  27. player_id TEXT NOT NULL REFERENCES players(id) ON DELETE CASCADE,
  28. target INT NOT NULL,
  29. attempts INT NOT NULL,
  30. won BOOLEAN NOT NULL,
  31. finished_at TIMESTAMPTZ NOT NULL DEFAULT now()
  32. )
  33. `);
  34. await client.query(`
  35. CREATE INDEX IF NOT EXISTS idx_players_scoreboard
  36. ON players (best_attempts NULLS LAST, last_played_at)
  37. `);
  38. await client.query(`
  39. CREATE INDEX IF NOT EXISTS idx_games_player_history
  40. ON games (player_id, finished_at DESC)
  41. `);
  42. console.log("[txt-game migration-000] score schema created");
  43. } finally {
  44. await client.end();
  45. }