feat: redesign match play and add broadcast tooling
This commit is contained in:
87
scripts/seed-dev-superset.ts
Normal file
87
scripts/seed-dev-superset.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
/** A small, labeled dev-only showcase for features absent from the live archive. */
|
||||
import { SQL } from 'bun';
|
||||
import { PRESETS } from '../src/lib/broadcast/layout';
|
||||
|
||||
const databaseUrl = process.env.DB_URL || process.env.DATABASE_URL;
|
||||
if (!databaseUrl) throw new Error('DB_URL or DATABASE_URL is required');
|
||||
const sql = new SQL(databaseUrl, { max: 1 });
|
||||
|
||||
const ids = {
|
||||
tournament: '00000000-0000-4000-8000-00000000d101',
|
||||
round: '00000000-0000-4000-8000-00000000d102',
|
||||
registration: [
|
||||
'00000000-0000-4000-8000-00000000d111',
|
||||
'00000000-0000-4000-8000-00000000d112',
|
||||
'00000000-0000-4000-8000-00000000d113',
|
||||
'00000000-0000-4000-8000-00000000d114'
|
||||
],
|
||||
match: ['00000000-0000-4000-8000-00000000d121', '00000000-0000-4000-8000-00000000d122'],
|
||||
prediction: ['00000000-0000-4000-8000-00000000d131', '00000000-0000-4000-8000-00000000d132'],
|
||||
channel: '00000000-0000-4000-8000-00000000d141'
|
||||
} as const;
|
||||
|
||||
try {
|
||||
const [{ name }] = await sql`SELECT current_database() AS name`;
|
||||
if (name !== 'vash_dev' && name !== process.env.SEED_TEST_DATABASE)
|
||||
throw new Error(`Refusing to seed ${name}; only a dev database is allowed`);
|
||||
|
||||
await sql.begin(async (tx) => {
|
||||
const teams = await tx`
|
||||
SELECT t.id AS team_id, t.owner_id AS user_id
|
||||
FROM team t JOIN "user" u ON u.id = t.owner_id
|
||||
WHERE t.is_personal AND t.owner_id IS NOT NULL
|
||||
ORDER BY t.owner_id, t.id LIMIT 5
|
||||
`;
|
||||
if (teams.length < 5 || new Set(teams.map((team) => team.user_id)).size < 5)
|
||||
throw new Error('The dev showcase needs five distinct users with personal teams');
|
||||
const [pool] = await tx`SELECT id FROM mappool ORDER BY created_at, id LIMIT 1`;
|
||||
if (!pool) throw new Error('The dev showcase needs one copied mappool');
|
||||
|
||||
await tx`
|
||||
INSERT INTO tournament (id, name, description, format, state, config, max_slots, created_by, tagline, accent_color)
|
||||
VALUES (
|
||||
${ids.tournament}, 'Dev Showcase',
|
||||
'A dev-only bracket built from copied players and a copied mappool.',
|
||||
'single_elim', 'IN_PROGRESS',
|
||||
${{ teamSize: 1, scoringType: 'score_v2', bans: 1, bestOf: 7 }},
|
||||
4, ${teams[0].user_id}, 'Explore the bracket and predictions', '#ff66aa'
|
||||
) ON CONFLICT (id) DO NOTHING
|
||||
`;
|
||||
await tx`
|
||||
INSERT INTO tournament_round (id, tournament_id, name, abbreviation, round_order, best_of, mappool_id, bracket_type)
|
||||
VALUES (${ids.round}, ${ids.tournament}, 'Semifinals', 'SF', 1, 7, ${pool.id}, 'winners')
|
||||
ON CONFLICT (id) DO NOTHING
|
||||
`;
|
||||
for (let i = 0; i < 4; i++) {
|
||||
await tx`
|
||||
INSERT INTO tournament_registration (id, tournament_id, team_id, user_id, status, seed)
|
||||
VALUES (${ids.registration[i]}, ${ids.tournament}, ${teams[i].team_id}, ${teams[i].user_id}, 'registered', ${i + 1})
|
||||
ON CONFLICT (id) DO NOTHING
|
||||
`;
|
||||
}
|
||||
for (let i = 0; i < 2; i++) {
|
||||
await tx`
|
||||
INSERT INTO tournament_match (id, tournament_id, round_id, bracket_position, team1_id, team2_id, state)
|
||||
VALUES (${ids.match[i]}, ${ids.tournament}, ${ids.round}, ${i + 1},
|
||||
${teams[i * 2].team_id}, ${teams[i * 2 + 1].team_id}, 'PENDING')
|
||||
ON CONFLICT (id) DO NOTHING
|
||||
`;
|
||||
await tx`
|
||||
INSERT INTO prediction (id, user_id, tournament_match_id, winner_team_id, winner_score, loser_score)
|
||||
VALUES (${ids.prediction[i]}, ${teams[4].user_id}, ${ids.match[i]}, ${teams[i * 2].team_id}, 4, 2)
|
||||
ON CONFLICT (id) DO NOTHING
|
||||
`;
|
||||
}
|
||||
await tx`
|
||||
INSERT INTO broadcast_channel (id, name, mode, tournament_id, layout, created_by, live, record)
|
||||
VALUES (${ids.channel}, 'Dev Showcase TV', 'tournament', ${ids.tournament},
|
||||
${PRESETS.tourney.make()}, ${teams[0].user_id}, false, true)
|
||||
ON CONFLICT (id) DO NOTHING
|
||||
`;
|
||||
});
|
||||
console.log(
|
||||
'Seeded dev showcase: 1 tournament, 1 round, 4 registrations, 2 bracket matches, 2 predictions, 1 broadcast channel'
|
||||
);
|
||||
} finally {
|
||||
await sql.end();
|
||||
}
|
||||
Reference in New Issue
Block a user