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 { 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 { 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, }); }