import { createClient } from '@supabase/supabase-js'; /** * Script to check the current schema of the stories table * * Usage: * npx tsx scripts/check-stories-schema.ts */ const SUPABASE_URL = process.env.MAERCHENZAUBER_SUPABASE_URL; const SUPABASE_SERVICE_ROLE_KEY = process.env.MAERCHENZAUBER_SUPABASE_SERVICE_ROLE_KEY; if (!SUPABASE_URL || !SUPABASE_SERVICE_ROLE_KEY) { console.error('āŒ Missing required environment variables:'); console.error(' MAERCHENZAUBER_SUPABASE_URL'); console.error(' MAERCHENZAUBER_SUPABASE_SERVICE_ROLE_KEY'); process.exit(1); } async function checkStoriesSchema() { console.log('šŸ” Checking stories table schema...\n'); console.log(`šŸ”— Supabase URL: ${SUPABASE_URL}\n`); // Create Supabase client with service role key const supabase = createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, { auth: { persistSession: false, }, }); try { // Query information_schema to get column details const { data: columns, error: columnsError } = await supabase .from('information_schema.columns') .select('column_name, data_type, is_nullable, column_default') .eq('table_name', 'stories') .order('ordinal_position'); if (columnsError) { console.error('āŒ Error fetching schema:', columnsError); // Try alternative method - just get a sample row console.log('\nšŸ”„ Trying alternative method - fetching sample story...\n'); const { data: sampleStory, error: sampleError } = await supabase .from('stories') .select('*') .limit(1) .single(); if (sampleError) { console.error('āŒ Error fetching sample story:', sampleError); process.exit(1); } if (sampleStory) { console.log('āœ… Sample story structure:'); console.log('─'.repeat(60)); Object.keys(sampleStory).forEach((key) => { const value = sampleStory[key]; const type = typeof value; console.log(` ${key.padEnd(30)} ${type.padEnd(10)} ${value === null ? '(null)' : ''}`); }); console.log('─'.repeat(60)); } return; } if (columns && columns.length > 0) { console.log('āœ… Stories table schema:'); console.log('─'.repeat(80)); console.log('Column Name'.padEnd(30) + 'Type'.padEnd(20) + 'Nullable'.padEnd(15) + 'Default'); console.log('─'.repeat(80)); columns.forEach((col: any) => { console.log( col.column_name.padEnd(30) + col.data_type.padEnd(20) + col.is_nullable.padEnd(15) + (col.column_default || '').substring(0, 30) ); }); console.log('─'.repeat(80)); // Check for specific columns we're interested in const columnNames = columns.map((col: any) => col.column_name); console.log('\nšŸ“‹ Column checks:'); console.log(` āœ“ is_favorite: ${columnNames.includes('is_favorite') ? 'āœ… EXISTS' : 'āŒ MISSING'}`); console.log(` āœ“ is_published: ${columnNames.includes('is_published') ? 'āœ… EXISTS' : 'āŒ MISSING'}`); console.log(` āœ“ visibility: ${columnNames.includes('visibility') ? 'āœ… EXISTS' : 'āŒ MISSING'}`); console.log(` āœ“ archived: ${columnNames.includes('archived') ? 'āœ… EXISTS' : 'āŒ MISSING'}`); } else { console.log('āš ļø No columns found or table does not exist'); } // Check for story_votes table console.log('\nšŸ” Checking story_votes table...'); const { data: votesTable, error: votesError } = await supabase .from('story_votes') .select('*') .limit(1); if (votesError) { if (votesError.message.includes('does not exist')) { console.log(' āŒ story_votes table DOES NOT EXIST'); } else { console.log(` āš ļø Error: ${votesError.message}`); } } else { console.log(' āœ… story_votes table EXISTS'); if (votesTable && votesTable.length > 0) { console.log(` šŸ“Š Sample vote record:`, votesTable[0]); } } } catch (error) { console.error('āŒ Error:', error); process.exit(1); } } checkStoriesSchema();