FactuGES_ERP/apps/server/src/config/database.ts
2026-02-12 15:46:47 +01:00

90 lines
2.5 KiB
TypeScript

import { Sequelize } from "sequelize";
import { logger } from "../lib/logger";
import type { ConfigType } from "./index";
/**
* Crea la instancia de Sequelize según ENV (DATABASE_URL o parámetros sueltos),
* autentica la conexión y devuelve la instancia lista para usar.
*/
export async function tryConnectToDatabase(config: ConfigType): Promise<Sequelize> {
const sequelize = buildSequelize(config);
try {
await sequelize.authenticate();
logger.info("✔️ Database connection established", {
label: "database",
// Info no sensible:
dialect: sequelize.getDialect(),
host: (sequelize.config.host ?? "url") as string,
database: (sequelize.config.database ?? "url") as string,
});
return sequelize;
} catch (error: any) {
logger.error(`❌ Unable to connect to the database: ${error?.message ?? error}`, {
label: "database",
});
// Cerramos por si quedó algo abierto
try {
await sequelize.close();
} catch {
/* noop */
}
throw error;
}
}
/**
* Cierra la instancia de Sequelize (para integrar con el shutdown).
*/
export async function closeDatabase(sequelize: Sequelize): Promise<void> {
try {
await sequelize.close();
logger.info("Database connection closed", { label: "database" });
} catch (error: any) {
logger.error(`Error while closing database: ${error?.message ?? error}`, {
label: "database",
});
}
}
function buildSequelize(config: ConfigType): Sequelize {
const common = {
logging: config.database.logging
? (msg: any) => logger.debug(String(msg), { label: "sequelize" })
: false,
timezone: config.server.timezone,
pool: {
max: 10,
min: 0,
idle: 10000,
acquire: 30000,
},
dialectOptions: {
timezone: config.server.timezone,
},
} as const;
/*if (ENV.DATABASE_URL && ENV.DATABASE_URL.trim() !== "") {
// URL completa (recomendada p.ej. en Postgres/MariaDB)
return new Sequelize(ENV.DATABASE_URL, common);
}*/
// Parámetros sueltos (asegurar requeridos mínimos)
if (!config.database.dialect) {
throw new Error("DB_DIALECT is required when DATABASE_URL is not provided");
}
if (!(config.database.name && config.database.user)) {
throw new Error("DB_NAME and DB_USER are required when DATABASE_URL is not provided");
}
return new Sequelize(config.database.name, config.database.user, config.database.password, {
host: config.database.host,
port: config.database.port,
dialect: config.database.dialect,
...common,
});
}