feat: tournament DB schema
Add tournaments, tournament_entries, and tournament_matches tables with Drizzle ORM definitions and SQLite CREATE TABLE migrations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
38f94c2955
commit
4dfa49c036
@@ -109,3 +109,39 @@ export const bets = sqliteTable('bets', {
|
||||
createdAt: text('created_at').notNull(),
|
||||
settledAt: text('settled_at'),
|
||||
})
|
||||
|
||||
export const tournaments = sqliteTable('tournaments', {
|
||||
id: text('id').primaryKey(),
|
||||
name: text('name').notNull(),
|
||||
format: text('format', { enum: ['single_elim', 'round_robin'] }).notNull(),
|
||||
size: integer('size').notNull(),
|
||||
entrySats: integer('entry_sats').notNull().default(0),
|
||||
prizeSats: integer('prize_sats').notNull().default(0),
|
||||
status: text('status', { enum: ['open', 'active', 'finished'] }).notNull().default('open'),
|
||||
currentRound: integer('current_round').notNull().default(0),
|
||||
seasonId: text('season_id'),
|
||||
createdAt: text('created_at').notNull(),
|
||||
startedAt: text('started_at'),
|
||||
finishedAt: text('finished_at'),
|
||||
})
|
||||
|
||||
export const tournamentEntries = sqliteTable('tournament_entries', {
|
||||
id: text('id').primaryKey(),
|
||||
tournamentId: text('tournament_id').notNull().references(() => tournaments.id),
|
||||
botId: text('bot_id').notNull().references(() => bots.id),
|
||||
seed: integer('seed').notNull().default(0),
|
||||
eliminated: integer('eliminated', { mode: 'boolean' }).notNull().default(false),
|
||||
createdAt: text('created_at').notNull(),
|
||||
})
|
||||
|
||||
export const tournamentMatches = sqliteTable('tournament_matches', {
|
||||
id: text('id').primaryKey(),
|
||||
tournamentId: text('tournament_id').notNull().references(() => tournaments.id),
|
||||
round: integer('round').notNull(),
|
||||
matchIndex: integer('match_index').notNull(),
|
||||
botAId: text('bot_a_id').references(() => bots.id),
|
||||
botBId: text('bot_b_id').references(() => bots.id),
|
||||
fightId: text('fight_id').references(() => fights.id),
|
||||
winnerId: text('winner_id').references(() => bots.id),
|
||||
status: text('status', { enum: ['pending', 'live', 'finished'] }).notNull().default('pending'),
|
||||
})
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { sqlite } from './index.js'
|
||||
import { logger } from '../lib/logger.js'
|
||||
|
||||
export function runMigrations() {
|
||||
sqlite.exec(`
|
||||
@@ -86,6 +87,45 @@ export function runMigrations() {
|
||||
);
|
||||
`)
|
||||
|
||||
|
||||
sqlite.exec(`
|
||||
CREATE TABLE IF NOT EXISTS tournaments (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
format TEXT NOT NULL DEFAULT 'single_elim',
|
||||
size INTEGER NOT NULL,
|
||||
entry_sats INTEGER NOT NULL DEFAULT 0,
|
||||
prize_sats INTEGER NOT NULL DEFAULT 0,
|
||||
status TEXT NOT NULL DEFAULT 'open',
|
||||
current_round INTEGER NOT NULL DEFAULT 0,
|
||||
season_id TEXT,
|
||||
created_at TEXT NOT NULL,
|
||||
started_at TEXT,
|
||||
finished_at TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS tournament_entries (
|
||||
id TEXT PRIMARY KEY,
|
||||
tournament_id TEXT NOT NULL REFERENCES tournaments(id),
|
||||
bot_id TEXT NOT NULL REFERENCES bots(id),
|
||||
seed INTEGER NOT NULL DEFAULT 0,
|
||||
eliminated INTEGER NOT NULL DEFAULT 0,
|
||||
created_at TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS tournament_matches (
|
||||
id TEXT PRIMARY KEY,
|
||||
tournament_id TEXT NOT NULL REFERENCES tournaments(id),
|
||||
round INTEGER NOT NULL,
|
||||
match_index INTEGER NOT NULL,
|
||||
bot_a_id TEXT REFERENCES bots(id),
|
||||
bot_b_id TEXT REFERENCES bots(id),
|
||||
fight_id TEXT REFERENCES fights(id),
|
||||
winner_id TEXT REFERENCES bots(id),
|
||||
status TEXT NOT NULL DEFAULT 'pending'
|
||||
);
|
||||
`)
|
||||
|
||||
// Column migrations for existing databases
|
||||
const migrations = [
|
||||
"ALTER TABLE bots ADD COLUMN archetype TEXT NOT NULL DEFAULT 'standard'",
|
||||
@@ -120,5 +160,5 @@ export function runMigrations() {
|
||||
sqlite.exec("UPDATE bots SET bot_type = 'classic' WHERE webhook_url LIKE 'http://classic.local%' AND bot_type = 'regular'")
|
||||
} catch { /* ok */ }
|
||||
|
||||
console.log('[botfights] database migrated')
|
||||
logger.info('db', 'database migrated')
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user