/** * Execute SQL Files on Supabase * * This script runs SQL files directly on Supabase database */ const { createClient } = require('@supabase/supabase-js'); const fs = require('fs'); const path = require('path'); const supabaseUrl = 'https://vsyrpfiwhjvahofxwytr.supabase.co'; const supabaseServiceKey = 'sb_secret_oXy8Diay2J_u8dKPZLxdcQ_hq69Mrb6'; const supabase = createClient(supabaseUrl, supabaseServiceKey, { auth: { autoRefreshToken: false, persistSession: false } }); async function executeSQLFile(filename) { console.log(`\n${'='.repeat(70)}`); console.log(`šŸ“„ Executing: ${filename}`); console.log('='.repeat(70)); try { const sqlContent = fs.readFileSync(path.join(__dirname, filename), 'utf8'); // Split SQL by semicolons (simple parser) const statements = sqlContent .split(';') .map(s => s.trim()) .filter(s => s.length > 0 && !s.startsWith('--') && !s.match(/^\/\*/)); console.log(`\nšŸ“Š Found ${statements.length} SQL statements\n`); let successCount = 0; let errorCount = 0; for (let i = 0; i < statements.length; i++) { const statement = statements[i]; // Skip comments and empty statements if (statement.startsWith('--') || statement.length < 5) { continue; } // Show first 80 chars of statement const preview = statement.substring(0, 80).replace(/\s+/g, ' '); process.stdout.write(` [${i + 1}/${statements.length}] ${preview}...`); try { // Execute using RPC query function (if available) // Note: This requires a custom RPC function in Supabase // Alternative: Use REST API directly const response = await fetch(`${supabaseUrl}/rest/v1/rpc/exec_sql`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'apikey': supabaseServiceKey, 'Authorization': `Bearer ${supabaseServiceKey}` }, body: JSON.stringify({ sql: statement }) }); if (response.ok) { console.log(' āœ…'); successCount++; } else { const error = await response.text(); console.log(` āŒ ${error}`); errorCount++; } } catch (error) { console.log(` āŒ ${error.message}`); errorCount++; } } console.log(`\n${'='.repeat(70)}`); console.log(`šŸ“Š Results: ${successCount} succeeded, ${errorCount} failed`); console.log('='.repeat(70)); return { success: successCount, errors: errorCount }; } catch (error) { console.error(`āŒ Error reading file: ${error.message}`); return { success: 0, errors: 1 }; } } async function main() { console.log('\nšŸš€ Starting SQL Execution...\n'); // Step 1: Fix schema compatibility console.log('šŸ“ Step 1: Fixing schema compatibility...'); const result1 = await executeSQLFile('FIX_SCHEMA_COMPATIBILITY.sql'); // Step 2: Create missing tables console.log('\nšŸ“ Step 2: Creating missing tables...'); const result2 = await executeSQLFile('SUPABASE_SCHEMA.sql'); // Summary console.log('\n' + '='.repeat(70)); console.log('šŸŽ‰ EXECUTION SUMMARY'); console.log('='.repeat(70)); console.log(`\nStep 1 (Compatibility Fix):`); console.log(` āœ… Success: ${result1.success}`); console.log(` āŒ Errors: ${result1.errors}`); console.log(`\nStep 2 (Create Tables):`); console.log(` āœ… Success: ${result2.success}`); console.log(` āŒ Errors: ${result2.errors}`); console.log('\n' + '='.repeat(70)); if (result1.errors === 0 && result2.errors === 0) { console.log('\nāœ… ALL OPERATIONS COMPLETED SUCCESSFULLY!\n'); console.log('šŸ“ Next step: Run verification script'); console.log(' node check_schema_compatibility.cjs\n'); } else { console.log('\nāš ļø Some operations failed. Check errors above.\n'); } } // Alternative: Use Management API async function executeViaManagementAPI() { console.log('\nšŸ“ Attempting to execute via Management API...\n'); // Supabase doesn't have a public SQL execution API // Best option is to use Supabase Dashboard SQL Editor console.log('āš ļø Supabase JS SDK does not support direct SQL execution'); console.log('ā„¹ļø SQL must be executed via Supabase Dashboard\n'); console.log('šŸ“‹ Instructions:'); console.log(' 1. Go to: https://app.supabase.com'); console.log(' 2. Select project: vsyrpfiwhjvahofxwytr'); console.log(' 3. Open: SQL Editor (left menu)'); console.log(' 4. Copy contents of: FIX_SCHEMA_COMPATIBILITY.sql'); console.log(' 5. Paste and click: Run'); console.log(' 6. Repeat for: SUPABASE_SCHEMA.sql\n'); return false; } // Check if we can execute SQL programmatically executeViaManagementAPI().then(canExecute => { if (!canExecute) { console.log('āš ļø Manual execution required via Supabase Dashboard\n'); process.exit(1); } else { main().then(() => process.exit(0)); } });