/** * migrate.ts * * Script responsável por aplicar todas as migrations pendentes no banco SQLite. * * Pode ser executado de duas formas: * 1. Manual (CLI): pnpm db:migrate * 2. Programática: importado e chamado no boot do servidor (server.ts) */ import Database from 'better-sqlite3'; import { drizzle } from 'drizzle-orm/better-sqlite3'; import { migrate } from 'drizzle-orm/better-sqlite3/migrator'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; // Resolve o diretório correto em módulos ESM (não existe __dirname por padrão) const __dirname = path.dirname(fileURLToPath(import.meta.url)); const MIGRATIONS_DIR = path.join(__dirname, 'migrations'); const DATABASE_URL = process.env['DATABASE_URL'] ?? 'file:./helpdesk.db'; // Drizzle espera o caminho sem o prefixo "file:" const dbPath = DATABASE_URL.replace(/^file:/, ''); export async function runMigrations(): Promise { console.log('🗄️ Iniciando migrações do banco de dados...'); console.log(` Banco : ${dbPath}`); console.log(` Origem : ${MIGRATIONS_DIR}`); // better-sqlite3 opera de forma síncrona (sem Promises) const sqlite = new Database(dbPath); // Otimizações de performance recomendadas para SQLite sqlite.pragma('journal_mode = WAL'); // Write-Ahead Logging: leituras não bloqueiam escritas sqlite.pragma('foreign_keys = ON'); // Ativa integridade referencial (desativada por padrão no SQLite) const db = drizzle(sqlite); // Aplica todas as migrations ainda não registradas na tabela __drizzle_migrations migrate(db, { migrationsFolder: MIGRATIONS_DIR }); sqlite.close(); console.log('✅ Migrações aplicadas com sucesso.'); } // ─── Execução direta (CLI) ──────────────────────────────────────────────────── // Roda apenas quando o arquivo é chamado diretamente (pnpm db:migrate) // e não quando é importado como módulo pelo server.ts const isMain = process.argv[1] === fileURLToPath(import.meta.url); if (isMain) { runMigrations().catch((err) => { console.error('❌ Falha ao aplicar migrações:', err); process.exit(1); }); }