import { MongoClient, Db } from 'mongodb'; import _, { difference } from 'lodash'; import { differenceBetweenObject } from '@seed/helpers/Utils'; export const createSetRequest = (field: string, data: object, oldObject?: any): Partial => { 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 { 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; } }