Files
mercado.clube67.com/backend/database/migrate-sqlite-to-pg.js
T

141 lines
6.3 KiB
JavaScript

#!/usr/bin/env node
/**
* migrate-sqlite-to-pg.js
* Migra os dados existentes do database.sqlite para o PostgreSQL.
* Execute UMA ÚNICA VEZ: node database/migrate-sqlite-to-pg.js
*/
'use strict'
const path = require('path')
const fs = require('fs')
const { Pool } = require('pg')
// ── Configuração PostgreSQL ──────────────────────────────────────
const pool = new Pool({
host: process.env.PG_HOST || 'localhost',
port: parseInt(process.env.PG_PORT || '5432'),
database: process.env.PG_DATABASE || 'alemao',
user: process.env.PG_USER || 'newwhats',
password: process.env.PG_PASSWORD || 'newwhats123',
})
// ── Load SQLite via sql.js ───────────────────────────────────────
const DB_PATH = path.resolve(__dirname, '..', 'database.sqlite')
async function migrate() {
console.log('\n🔄 Iniciando migração SQLite → PostgreSQL...\n')
if (!fs.existsSync(DB_PATH)) {
console.error('❌ database.sqlite não encontrado em:', DB_PATH)
process.exit(1)
}
const initSqlJs = require('sql.js')
const SQL = await initSqlJs()
const fileBuffer = fs.readFileSync(DB_PATH)
const db = new SQL.Database(fileBuffer)
const client = await pool.connect()
try {
await client.query('BEGIN')
// ── Admins ──────────────────────────────────────────────────
console.log('📋 Migrando admins...')
const admins = db.exec('SELECT * FROM admins')[0]
if (admins) {
for (const row of admins.values) {
const [id, username, password_hash, nome, email, telefone] = row
await client.query(
`INSERT INTO admins (id, username, password_hash, nome, email, telefone)
VALUES ($1,$2,$3,$4,$5,$6) ON CONFLICT (username) DO NOTHING`,
[id, username, password_hash, nome || null, email || null, telefone || null]
)
}
// Sincronizar sequence
await client.query(`SELECT setval('admins_id_seq', (SELECT MAX(id) FROM admins))`)
console.log(`${admins.values.length} admins migrados`)
}
// ── Users ───────────────────────────────────────────────────
console.log('📋 Migrando users...')
const users = db.exec('SELECT * FROM users')[0]
if (users) {
let count = 0
for (const row of users.values) {
// Colunas reais: id, nome, cpf, telefone, ip, timestamp, source, email
const [id, nome, cpf, telefone, ip, timestamp, source, email] = row
await client.query(
`INSERT INTO users (id, nome, email, cpf, telefone, ip, source, timestamp)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8) ON CONFLICT DO NOTHING`,
[id, nome, email || null, cpf || null, telefone || null, ip || null, source || 'hotspot', timestamp || new Date()]
)
count++
}
await client.query(`SELECT setval('users_id_seq', (SELECT MAX(id) FROM users))`)
console.log(`${count} users migrados`)
}
// ── Raffles ─────────────────────────────────────────────────
console.log('📋 Migrando raffles...')
const raffles = db.exec('SELECT * FROM raffles')[0]
if (raffles) {
for (const row of raffles.values) {
const [id, titulo, descricao, preco_numero, total_numeros, ativo, data_criacao] = row
await client.query(
`INSERT INTO raffles (id, titulo, descricao, preco_numero, total_numeros, ativo, data_criacao)
VALUES ($1,$2,$3,$4,$5,$6,$7) ON CONFLICT DO NOTHING`,
[id, titulo, descricao || null, preco_numero || 5.0, total_numeros || 500, ativo, data_criacao || new Date()]
)
}
await client.query(`SELECT setval('raffles_id_seq', (SELECT MAX(id) FROM raffles))`)
console.log(`${raffles.values.length} sorteios migrados`)
}
// ── Tickets ─────────────────────────────────────────────────
console.log('📋 Migrando tickets...')
const tickets = db.exec('SELECT * FROM tickets')[0]
if (tickets) {
for (const row of tickets.values) {
const [id, raffle_id, numero, usuario_nome, usuario_telefone, usuario_cpf, data_compra] = row
await client.query(
`INSERT INTO tickets (id, raffle_id, numero, usuario_nome, usuario_telefone, usuario_cpf, data_compra)
VALUES ($1,$2,$3,$4,$5,$6,$7) ON CONFLICT DO NOTHING`,
[id, raffle_id, numero, usuario_nome, usuario_telefone || null, usuario_cpf || null, data_compra || new Date()]
)
}
await client.query(`SELECT setval('tickets_id_seq', (SELECT MAX(id) FROM tickets))`)
console.log(`${tickets.values.length} tickets migrados`)
}
// ── Promotions ──────────────────────────────────────────────
console.log('📋 Migrando promotions...')
const promos = db.exec('SELECT * FROM promotions')[0]
if (promos) {
for (const row of promos.values) {
const [id, nome, descricao, preco_original, preco_promocional, imagem, ativo, data_criacao] = row
await client.query(
`INSERT INTO promotions (id, nome, descricao, preco_original, preco_promocional, imagem, ativo, data_criacao)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8) ON CONFLICT DO NOTHING`,
[id, nome, descricao || null, preco_original || null, preco_promocional, imagem || '', ativo, data_criacao || new Date()]
)
}
await client.query(`SELECT setval('promotions_id_seq', (SELECT MAX(id) FROM promotions))`)
console.log(`${promos.values.length} promoções migradas`)
}
await client.query('COMMIT')
console.log('\n🎉 Migração concluída com sucesso!\n')
} catch (err) {
await client.query('ROLLBACK')
console.error('\n❌ Migração falhou — rollback executado:', err.message)
process.exit(1)
} finally {
client.release()
await pool.end()
}
}
migrate()