import postgres from 'postgres'; const expectedOrigin = process.argv[2]; if ( !expectedOrigin || !['https://stanrunge.dev', 'https://staging.stanrunge.dev'].includes(expectedOrigin) ) { throw new Error('Expected a known production or staging origin'); } if (!process.env.DB_URL) throw new Error('DB_URL is missing'); if (!process.env.BETTER_AUTH_SECRET || process.env.BETTER_AUTH_SECRET.length < 32) { throw new Error('BETTER_AUTH_SECRET must be at least 32 characters'); } if (process.env.ORIGIN !== expectedOrigin || process.env.BETTER_AUTH_URL !== expectedOrigin) { throw new Error('ORIGIN and BETTER_AUTH_URL must both match the public site origin'); } const client = postgres(process.env.DB_URL, { max: 1, connect_timeout: 10 }); try { await client`select 1`; const [schema] = await client` select (select count(*) from information_schema.columns where table_name = 'user' and column_name = 'role') as user_role, (select count(*) from information_schema.columns where table_name = 'account' and column_name = 'issuer') as account_issuer, (select count(*) from information_schema.columns where table_name = 'blog_articles' and column_name = 'tags') as blog_tags, to_regclass('public.catch_em_all_settings') is not null as settings_ready, (select count(*) from information_schema.columns where table_name = 'lists' and column_name = 'slug') as list_slug, to_regclass('public.list_item_completions') is not null as list_completions, (select count(*) from information_schema.columns where table_name = 'tasks_to_topics' and column_name = 'id') as topic_link_id, (select count(*) from information_schema.columns where table_name in ('animals', 'sightings', 'photos') and column_name = 'id' and data_type = 'integer') as animal_serial_ids, (select count(*) from information_schema.tables where table_schema = 'public' and table_name in ( 'money_accounts', 'money_transactions', 'money_recurring', 'money_forecasts', 'money_utility_settings', 'money_utility_readings', 'money_wishlist', 'money_insurances' )) as money_tables, (select count(*) from information_schema.columns where table_name = 'money_utility_settings' and column_name = 'billing_start') as money_billing_start `; if ( !Number(schema.user_role) || !Number(schema.account_issuer) || !Number(schema.blog_tags) || !schema.settings_ready || !Number(schema.list_slug) || !schema.list_completions || !Number(schema.topic_link_id) || Number(schema.animal_serial_ids) !== 3 || Number(schema.money_tables) !== 8 || !Number(schema.money_billing_start) ) { throw new Error( 'Required migrations or Animaldex ID conversion have not been applied to this database' ); } const [catalog] = await client` select (select count(*) from pokemon) as pokemon, (select count(*) from games where source_id is not null) as games, (select count(*) from pokemon_game_entries) as entries `; if ( Number(catalog.pokemon) < 1025 || Number(catalog.games) < 53 || Number(catalog.entries) < 27267 ) { throw new Error('Pokémon catalog has not been seeded in this database'); } } finally { await client.end(); } const google = !!(process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET); const osu = !!(process.env.OSU_CLIENT_ID && process.env.OSU_CLIENT_SECRET); console.log( `Preflight passed for ${expectedOrigin}; Google ${google ? 'configured' : 'disabled'}, osu! ${osu ? 'configured' : 'disabled'}` );