From 9f8f56ac4e0d0ccf6eb3ec139d93b9f83a628dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Mon, 15 Jun 2026 08:53:20 +0200 Subject: [PATCH] fix: remove redundant DDL from sync.ts and validate DATABASE_URL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- scripts/sync.ts | 98 +++---------------------------------------------- 1 file changed, 5 insertions(+), 93 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 51b1154..67455e3 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -3,7 +3,11 @@ import { drizzle } from 'drizzle-orm/postgres-js' import { sql } from 'drizzle-orm' 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' async function fetchJson(url: string): Promise { @@ -36,98 +40,6 @@ async function run() { const client = postgres(DATABASE_URL, { max: 5 }) 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() async function upsertTeam(rawName: string, extra?: { iso2?: string | null; fifaCode?: string; continent?: string; confederation?: string }) {