fix: remove redundant DDL from sync.ts and validate DATABASE_URL
The DDL block in sync.ts was a "safety net" but caused misleading password auth errors when Coolify's scheduled task ran without DATABASE_URL injected — the fallback `wc:wc` password was wrong. - Drop the silent `?? 'postgres://wc:wc@...'` fallback; exit with a clear message if DATABASE_URL is missing so the root cause is obvious - Remove the 90-line CREATE TABLE IF NOT EXISTS block — seed.ts runs before the server starts and guarantees all tables exist Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+5
-93
@@ -3,7 +3,11 @@ import { drizzle } from 'drizzle-orm/postgres-js'
|
|||||||
import { sql } from 'drizzle-orm'
|
import { sql } from 'drizzle-orm'
|
||||||
import { TEAM_ISO, getIso } from '../lib/iso-codes'
|
import { TEAM_ISO, getIso } from '../lib/iso-codes'
|
||||||
|
|
||||||
const DATABASE_URL = process.env.DATABASE_URL ?? 'postgres://wc:wc@localhost:5432/worldcup'
|
const DATABASE_URL = process.env.DATABASE_URL
|
||||||
|
if (!DATABASE_URL) {
|
||||||
|
console.error('ERROR: DATABASE_URL environment variable is not set')
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
const BASE = 'https://raw.githubusercontent.com/openfootball/worldcup.json/master'
|
const BASE = 'https://raw.githubusercontent.com/openfootball/worldcup.json/master'
|
||||||
|
|
||||||
async function fetchJson(url: string): Promise<unknown> {
|
async function fetchJson(url: string): Promise<unknown> {
|
||||||
@@ -36,98 +40,6 @@ async function run() {
|
|||||||
const client = postgres(DATABASE_URL, { max: 5 })
|
const client = postgres(DATABASE_URL, { max: 5 })
|
||||||
const db = drizzle(client)
|
const db = drizzle(client)
|
||||||
|
|
||||||
// Safety net — seed.ts should have created these already
|
|
||||||
await db.execute(sql`
|
|
||||||
CREATE TABLE IF NOT EXISTS tournaments (
|
|
||||||
year INTEGER PRIMARY KEY,
|
|
||||||
host TEXT NOT NULL,
|
|
||||||
winner TEXT,
|
|
||||||
runner_up TEXT,
|
|
||||||
third_place TEXT,
|
|
||||||
fourth_place TEXT,
|
|
||||||
teams_count INTEGER,
|
|
||||||
matches_count INTEGER,
|
|
||||||
total_goals INTEGER,
|
|
||||||
avg_goals_per_game NUMERIC(4,2)
|
|
||||||
);
|
|
||||||
CREATE TABLE IF NOT EXISTS teams (
|
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
name TEXT UNIQUE NOT NULL,
|
|
||||||
iso2 TEXT,
|
|
||||||
fifa_code TEXT,
|
|
||||||
continent TEXT,
|
|
||||||
confederation TEXT
|
|
||||||
);
|
|
||||||
CREATE TABLE IF NOT EXISTS stadiums (
|
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
tournament_year INTEGER,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
city TEXT,
|
|
||||||
country_code TEXT,
|
|
||||||
capacity INTEGER,
|
|
||||||
timezone TEXT,
|
|
||||||
coordinates TEXT
|
|
||||||
);
|
|
||||||
CREATE TABLE IF NOT EXISTS matches (
|
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
tournament_year INTEGER NOT NULL,
|
|
||||||
round TEXT NOT NULL,
|
|
||||||
group_name TEXT,
|
|
||||||
date DATE,
|
|
||||||
time_local TEXT,
|
|
||||||
stadium_id INTEGER,
|
|
||||||
team1_id INTEGER NOT NULL,
|
|
||||||
team2_id INTEGER NOT NULL,
|
|
||||||
score_ft_home INTEGER,
|
|
||||||
score_ft_away INTEGER,
|
|
||||||
score_ht_home INTEGER,
|
|
||||||
score_ht_away INTEGER,
|
|
||||||
score_et_home INTEGER,
|
|
||||||
score_et_away INTEGER,
|
|
||||||
score_p_home INTEGER,
|
|
||||||
score_p_away INTEGER,
|
|
||||||
is_quali_playoff BOOLEAN DEFAULT false
|
|
||||||
);
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS matches_unique
|
|
||||||
ON matches (tournament_year, team1_id, team2_id, date, is_quali_playoff);
|
|
||||||
CREATE TABLE IF NOT EXISTS goals (
|
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
match_id INTEGER NOT NULL,
|
|
||||||
team_id INTEGER NOT NULL,
|
|
||||||
player_name TEXT NOT NULL,
|
|
||||||
minute INTEGER,
|
|
||||||
minute_offset INTEGER DEFAULT 0,
|
|
||||||
is_penalty BOOLEAN DEFAULT false,
|
|
||||||
is_own_goal BOOLEAN DEFAULT false
|
|
||||||
);
|
|
||||||
CREATE TABLE IF NOT EXISTS group_standings (
|
|
||||||
tournament_year INTEGER NOT NULL,
|
|
||||||
group_name TEXT NOT NULL,
|
|
||||||
team_id INTEGER NOT NULL,
|
|
||||||
pos INTEGER,
|
|
||||||
played INTEGER DEFAULT 0,
|
|
||||||
won INTEGER DEFAULT 0,
|
|
||||||
drawn INTEGER DEFAULT 0,
|
|
||||||
lost INTEGER DEFAULT 0,
|
|
||||||
goals_for INTEGER DEFAULT 0,
|
|
||||||
goals_against INTEGER DEFAULT 0,
|
|
||||||
goal_diff INTEGER DEFAULT 0,
|
|
||||||
pts INTEGER DEFAULT 0,
|
|
||||||
PRIMARY KEY (tournament_year, group_name, team_id)
|
|
||||||
);
|
|
||||||
CREATE TABLE IF NOT EXISTS squads (
|
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
tournament_year INTEGER NOT NULL,
|
|
||||||
team_id INTEGER NOT NULL,
|
|
||||||
player_name TEXT NOT NULL,
|
|
||||||
shirt_number INTEGER,
|
|
||||||
position TEXT,
|
|
||||||
date_of_birth DATE
|
|
||||||
);
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS squads_unique
|
|
||||||
ON squads (tournament_year, team_id, shirt_number);
|
|
||||||
`)
|
|
||||||
|
|
||||||
const teamCache = new Map<string, number>()
|
const teamCache = new Map<string, number>()
|
||||||
|
|
||||||
async function upsertTeam(rawName: string, extra?: { iso2?: string | null; fifaCode?: string; continent?: string; confederation?: string }) {
|
async function upsertTeam(rawName: string, extra?: { iso2?: string | null; fifaCode?: string; continent?: string; confederation?: string }) {
|
||||||
|
|||||||
Reference in New Issue
Block a user