2025-05-14 21:45:16 +02:00

62 lines
2.3 KiB
TypeScript

import { MongoClient, Db } from 'mongodb';
import _, { difference } from 'lodash';
import { differenceBetweenObject } from '@seed/helpers/Utils';
export const createSetRequest = <T>(field: string, data: object, oldObject?: any): Partial<T> => {
let dataToChange;
if (oldObject) dataToChange = differenceBetweenObject(data, oldObject);
else dataToChange = data;
const req: any = {};
for (const key in dataToChange) {
if (dataToChange.hasOwnProperty(key)) {
if (_.isPlainObject(dataToChange[key])) {
if (field != '') req[`${field}.${key}`] = createSetRequest(key, dataToChange[key]);
else req[`${key}`] = createSetRequest('', dataToChange[key]);
} else {
if (field != '') req[`${field}.${key}`] = dataToChange[key];
else req[`${key}`] = dataToChange[key];
}
}
}
return req;
};
export default class DB {
private static instance: DB;
public mongoClient!: MongoClient;
public db!: Db;
// eslint-disable-next-line @typescript-eslint/no-empty-function
private constructor() {}
public static async getInstance(): Promise<DB> {
if (!this.instance || !this.instance.mongoClient || !this.instance.mongoClient.isConnected) {
this.instance = new DB();
let mongoUrl;
if (process.env.MONGO_USER && process.env.MONGO_PWD)
mongoUrl = `mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PWD}@${process.env.MONGO_URL}`;
else mongoUrl = process.env.MONGO_URL || '';
const mongoDb = process.env.MONGO_DB || '';
try {
this.instance.mongoClient = await MongoClient.connect(mongoUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
// loggerLevel: 'debug',
});
this.instance.db = this.instance.mongoClient.db(mongoDb);
if (process.env.NODE_ENV != 'production') console.log('[MongoDB] New Connect');
} catch (error) {
throw error;
}
} else {
if (process.env.NODE_ENV != 'production') console.log('[MongoDB] Existing Connect');
}
return DB.instance;
}
}