138 lines
4.2 KiB
JavaScript
138 lines
4.2 KiB
JavaScript
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();
|