From ef55d9bb24430610b60c1b77821307cd72c08c55 Mon Sep 17 00:00:00 2001 From: zwlucas Date: Sat, 25 Jul 2026 18:23:29 -0300 Subject: feat: upload of the project Signed-off-by: zwlucas --- api/src/db/migrate.ts | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 api/src/db/migrate.ts (limited to 'api/src/db/migrate.ts') diff --git a/api/src/db/migrate.ts b/api/src/db/migrate.ts new file mode 100644 index 0000000..7964ef6 --- /dev/null +++ b/api/src/db/migrate.ts @@ -0,0 +1,56 @@ +/** + * 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); + }); +} -- cgit v1.2.3