import { MongoClient, Db } from "mongodb"; import { setDb } from "./index"; import { validateConfig, validateMongoUri } from "../utils/validation"; import { configurationDbConfig } from "../config"; class ConfigurationMongoDBClient { private client: MongoClient | null = null; private db: Db | null = null; private readonly defaultDbName = "configuration"; async connect(uri?: string, dbName?: string): Promise { if (this.client) { return; } const mongodbUri = uri || configurationDbConfig.mongoUri; validateConfig("MONGO_URI", mongodbUri); validateMongoUri(mongodbUri!); try { this.client = new MongoClient(mongodbUri!); await this.client.connect(); const targetDbName = dbName || configurationDbConfig.configurationDbName || this.defaultDbName; this.db = this.client.db(targetDbName); setDb(this.db); console.info(`[core-db] Configuration MongoDB connected: ${targetDbName}`); } catch (error) { console.error("[core-db] Configuration connection failed", error); throw error; } } async disconnect(): Promise { if (this.client) { try { await this.client.close(); this.client = null; this.db = null; console.info("Configuration MongoDB disconnected successfully"); } catch (error) { console.error("[core-db] Configuration disconnection failed", error); throw error; } } } getDb(): Db { if (!this.db) { throw new Error( "Configuration database not initialized. Call connect() first.", ); } return this.db; } isConnected(): boolean { return this.client !== null && this.client !== undefined; } } export const configurationMongodbClient = new ConfigurationMongoDBClient();