const mongoose = require("mongoose");
// Conexión a la base de datos MongoDB || podriamos cambiarlo luego a otro tipo de BD
const MONGODB_URI =
process.env.MONGODB_URI || "mongodb://localhost:27017/inventario";
class Database {
static instance = null;
static connections = new Map(); // Almacenar múltiples conexiones para un multitenanttt por ejemplo
constructor() {
if (!Database.instance) {
Database.instance = this;
this.defaultConnection = null;
}
return Database.instance;
}
async _connect() {
try {
const connection = await mongoose.connect(MONGODB_URI);
this.defaultConnection = mongoose.connection;
Database.connections.set("default", this.defaultConnection);
return connection;
} catch (err) {
throw err;
}
}
async createConnection(name, uri) {
try {
const connection = await mongoose.createConnection(uri).asPromise();
Database.connections.set(name, connection);
console.error(` Conexión '${name}' creada exitosamente`);
return connection;
} catch (err) {
console.error(` Error al crear conexión '${name}':`, err);
throw err;
}
}
getConnection(name = "default") {
return Database.connections.get(name) || this.defaultConnection;
}
getAllConnections() {
return Database.connections;
}
isConnected(name = "default") {
const connection = this.getConnection(name);
return connection ? connection.readyState === 1 : false;
}
async disconnect(name = null) {
try {
if (name) {
// Desconectar una conexión específica
const connection = Database.connections.get(name);
if (connection && connection.readyState === 1) {
await connection.close();
Database.connections.delete(name);
console.error(` Conexión '${name}' desconectada`);
}
} else {
// Desconectar todas las conexiones
for (const [connName, connection] of Database.connections.entries()) {
if (connection.readyState === 1) {
await connection.close();
console.error(` Conexión '${connName}' desconectada`);
}
}
Database.connections.clear();
}
} catch (err) {
console.error(" Error al desconectar:", err);
throw err;
}
}
async clearDatabase(name = "default") {
const connection = this.getConnection(name);
if (connection && connection.readyState === 1) {
const collections = Object.keys(connection.collections);
for (const collectionName of collections) {
const collection = connection.collections[collectionName];
await collection.deleteMany();
}
console.error(` Base de datos '${name}' limpiada`);
}
}
getModels(connectionName = "default") {
const connection = this.getConnection(connectionName);
if (!connection) {
throw new Error(`Conexión '${connectionName}' no encontrada`);
}
const { createCategoriaModel } = require("./models/categoria.model.js");
const { createItemModel } = require("./models/item.model.js");
return {
Categoria: createCategoriaModel(connection),
Item: createItemModel(connection),
};
}
// async migrateModels(){
// const connection = this.getConnection();
// if (!connection || connection.readyState !== 1) {
// throw new Error("Conexión a la base de datos no establecida");
// }
// const { createCategoriaModel } = require("./models/categoria.model.js");
// const { createItemModel } = require("./models/item.model.js");
// await createCategoriaModel(connection);
// await createItemModel(connection);
// }
}
module.exports = new Database();