141 lines
6.3 KiB
JavaScript
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()
|