diff --git a/models/migrator.js b/models/migrator.js new file mode 100644 index 0000000..4c6e952 --- /dev/null +++ b/models/migrator.js @@ -0,0 +1,52 @@ +import { resolve } from "node:path"; +import migrationRunner from "node-pg-migrate"; +import database from "infra/database.js"; + +const defaultMigrationsOptions = { + dryRun: true, + dir: resolve("infra", "migrations"), + direction: "up", + verbose: true, + migrationsTable: "pgmigrations", +}; + +async function listPendingMigrations() { + let dbClient; + + try { + dbClient = await database.getNewClient(); + + const pendingMigrations = await migrationRunner({ + ...defaultMigrationsOptions, + dbClient, + }); + + return pendingMigrations; + } finally { + await dbClient?.end(); + } +} + +async function runPendingMigrations() { + let dbClient; + + try { + dbClient = await database.getNewClient(); + + const migratedMigrations = await migrationRunner({ + ...defaultMigrationsOptions, + dbClient, + dryRun: false, + }); + + return migratedMigrations; + } finally { + await dbClient?.end(); + } +} + +const migrator = { + listPendingMigrations, + runPendingMigrations, +}; +export default migrator; diff --git a/pages/api/v1/migrations/index.js b/pages/api/v1/migrations/index.js index 9be29bb..4adaae0 100644 --- a/pages/api/v1/migrations/index.js +++ b/pages/api/v1/migrations/index.js @@ -1,40 +1,19 @@ -import { resolve } from "node:path"; -import migrationRunner from "node-pg-migrate"; -import database from "infra/database.js"; import { createRouter } from "next-connect"; import controller from "infra/controller.js"; +import migrator from "models/migrator.js"; const router = createRouter(); router.get(getHandler); router.post(postHandler); export default router.handler(controller.errorHandlers); -const defaultMigrationsOptions = { - dryRun: true, - dir: resolve("infra", "migrations"), - direction: "up", - verbose: true, - migrationsTable: "pgmigrations", -}; - async function getHandler(request, response) { - const dbClient = await database.getNewClient(); - const pendingMigrations = await migrationRunner({ - ...defaultMigrationsOptions, - dbClient, - }); - await dbClient.end(); + const pendingMigrations = await migrator.listPendingMigrations(); return response.status(200).json(pendingMigrations); } async function postHandler(request, response) { - const dbClient = await database.getNewClient(); - const migratedMigrations = await migrationRunner({ - ...defaultMigrationsOptions, - dbClient, - dryRun: false, - }); - await dbClient.end(); + const migratedMigrations = await migrator.runPendingMigrations(); if (migratedMigrations.length > 0) { return response.status(201).json(migratedMigrations);