aboutsummaryrefslogtreecommitdiff
path: root/api/src/db/migrate.ts
diff options
context:
space:
mode:
Diffstat (limited to 'api/src/db/migrate.ts')
-rw-r--r--api/src/db/migrate.ts56
1 files changed, 56 insertions, 0 deletions
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<void> {
+ 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);
+ });
+}