import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import pg from 'pg'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Try local first (with SSH tunnel), then remote directly const URLS = [ 'postgresql://edumanager:EduManager2026!Seguro@127.0.0.1:5432/edumanager', 'postgresql://edumanager:EduManager2026!Seguro@150.230.87.131:5432/edumanager' ]; async function run() { const backupPath = path.join(__dirname, '../backup_supabase_2026-04-19_migrado.json'); console.log(`Lendo backup de: ${backupPath}`); if (!fs.existsSync(backupPath)) { console.error('ERRO: Arquivo de backup não encontrado!'); process.exit(1); } const raw = fs.readFileSync(backupPath, 'utf8'); const backupData = JSON.parse(raw); const students = backupData.students || []; console.log(`Encontrados ${students.length} alunos no arquivo de backup.`); let pool; for (const url of URLS) { try { console.log(`Tentando conectar ao banco via: ${url.split('@')[1]}...`); pool = new pg.Pool({ connectionString: url, connectionTimeoutMillis: 5000 }); await pool.query('SELECT NOW()'); console.log('Conectado com sucesso!'); break; } catch (err) { console.warn(`Falha ao conectar via ${url.split('@')[1]}: ${err.message}`); pool = null; } } if (!pool) { console.error('ERRO: Não foi possível conectar ao banco de dados com nenhuma das URLs.'); process.exit(1); } let updatedCount = 0; let notFoundCount = 0; try { for (const s of students) { // Formatar datas para o padrão YYYY-MM-DD const birthDate = s.birthDate ? s.birthDate.split('T')[0] : null; const rgIssueDate = s.rgIssueDate ? s.rgIssueDate.split('T')[0] : null; const guardianBirthDate = s.guardianBirthDate ? s.guardianBirthDate.split('T')[0] : null; const registrationDate = s.registrationDate ? s.registrationDate.split('T')[0] : null; // Verificar se o aluno existe const { rows } = await pool.query('SELECT id, nome FROM alunos WHERE id = $1', [s.id]); if (rows.length === 0) { console.log(`Aluno não encontrado no banco SQL (Será ignorado): ${s.name} (${s.id})`); notFoundCount++; continue; } // Executar o UPDATE dos dados restaurados const query = ` UPDATE alunos SET rg = $1, data_nascimento = $2, rg_data_emissao = $3, cep = $4, rua = $5, numero = $6, bairro = $7, cidade = $8, estado = $9, tem_responsavel = $10, nome_responsavel = $11, cpf_responsavel = $12, telefone_responsavel = $13, data_nascimento_responsavel = $14, numero_matricula = $15, data_matricula = $16, modelo_contrato_id = $17, foto_url = $18, senha_portal = $19, face_descriptor = $20 WHERE id = $21 `; const values = [ s.rg || '', birthDate, rgIssueDate, s.addressZip || '', s.addressStreet || '', s.addressNumber || '', s.addressNeighborhood || '', s.addressCity || '', s.addressState || '', s.hasGuardian || false, s.guardianName || '', s.guardianCpf || '', s.guardianPhone || '', guardianBirthDate, s.enrollmentNumber || null, registrationDate, s.contractTemplateId || 'default-template', s.photo || '', s.portalPassword || null, s.faceDescriptor ? JSON.stringify(s.faceDescriptor) : null, s.id ]; await pool.query(query, values); console.log(`Restaurado aluno: ${s.name} (${s.id})`); updatedCount++; } console.log('\n--- RELATÓRIO DE RESTAURAÇÃO ---'); console.log(`Alunos atualizados com sucesso no SQL: ${updatedCount}`); console.log(`Alunos do backup não encontrados no SQL: ${notFoundCount}`); console.log('--------------------------------\n'); } catch (err) { console.error('ERRO CRÍTICO DURANTE A RESTAURAÇÃO:', err); } finally { await pool.end(); } } run();