UNPKG

mongo-base-crud

Version:

Class to handler access and handler database

266 lines 12 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MongoDbAccess = void 0; const mongoose_1 = require("mongoose"); const typescript_singleton_1 = require("typescript-singleton"); const mongoose_2 = __importDefault(require("mongoose")); const prepare_1 = require("./prepare"); const md5_1 = __importDefault(require("md5")); const dotenv = __importStar(require("dotenv")); const crypto_1 = require("crypto"); const transformData_1 = require("../../utils/transformData"); dotenv.config(); const mongoConnections = new Map(); function getDefaultMongoConfig() { return { prefixName: process.env.MONGO_PREFIX_NAME || "dev_", fullUrl: process.env.MONGO_URL || "mongodb://localhost:27017", database: process.env.MONGO_DB || "db", disablePlural: process.env.MONGO_DISABLE_PLURAL ? !!process.env.MONGO_DISABLE_PLURAL : false, }; } function getMongoConnection(config, customDbName) { return __awaiter(this, void 0, void 0, function* () { const configOrDefault = config || getDefaultMongoConfig(); const prefixName = (config === null || config === void 0 ? void 0 : config.prefixName) || ""; const dbName = prefixName + (customDbName || prefixName + (configOrDefault === null || configOrDefault === void 0 ? void 0 : configOrDefault.database)); const connectionString = (0, md5_1.default)(configOrDefault.fullUrl) + "_" + customDbName; if (!mongoConnections.has(connectionString)) { const connection = yield mongoose_2.default.createConnection(configOrDefault.fullUrl, { dbName, }); mongoConnections.set(connectionString, connection); } return mongoConnections.get(connectionString); }); } class MongoDbAccess { static getCollectionInfoOrDefault(collectionName, indexes = {}) { const key = `${collectionName}`; let collectionInfo = MongoDbAccess.collectionsInfo.get(`${key}`); if (collectionInfo) { return collectionInfo; } const flexibleSchema = new mongoose_1.Schema({ _id: String, }, { strict: false, collation: { locale: "pt", strength: 1 }, timestamps: true, }); flexibleSchema.index(Object.assign({ id: 1 }, indexes)); return flexibleSchema; } static getInstance(collectionName_1, databaseName_1) { return __awaiter(this, arguments, void 0, function* (collectionName, databaseName, indexes = {}, connectionTryingTimes = 1, defaultConfig) { const configOrDefault = defaultConfig || getDefaultMongoConfig(); let dbName = databaseName || configOrDefault.database || "db"; if (!configOrDefault.fullUrl) { throw new Error("MongoDB host is required or fullUrl is required. Check your env.MONGO_URL"); } const connectionString = (0, md5_1.default)(JSON.stringify(configOrDefault)); try { const connectedMongoose = yield getMongoConnection(configOrDefault, databaseName); const keyCollection = `${connectionString}.${dbName}.${collectionName}`; if (!MongoDbAccess.models.has(keyCollection)) { const schema = this.getCollectionInfoOrDefault(collectionName, indexes); if (configOrDefault.disablePlural) { schema.set("collection", collectionName); } connectedMongoose.model(collectionName, schema); MongoDbAccess.models.set(keyCollection, connectedMongoose.model(collectionName)); } return typescript_singleton_1.Singleton.getInstance(`mongo-base-crud_${collectionName}_${connectionString}_${dbName}`, MongoDbAccess, configOrDefault, collectionName, connectedMongoose, MongoDbAccess.models.get(keyCollection)); } catch (e) { if (connectionTryingTimes > 10) { throw new Error("Connection error max time exceed"); } console.error(`db error (${connectionTryingTimes}):`, e); yield new Promise((resolve, reject) => { setTimeout(resolve, 200 * connectionTryingTimes); }); return this.getInstance(collectionName, databaseName, indexes, connectionTryingTimes + 1, defaultConfig); } }); } constructor(config, collectionName, mongo, _model) { this.config = config; this.mongoose = mongo; if (!this.mongoose) { throw new Error("Mongo Connection Error"); } this.collection = collectionName; this.model = _model; } formatDoc(doc) { if (doc) { const data = doc.toObject(); if (data === null || data === void 0 ? void 0 : data._id) { data.id = data._id; delete data._id; } return data; } return null; } aggregate(pipeline) { return __awaiter(this, void 0, void 0, function* () { const result = yield this.model.aggregate(pipeline).exec(); return result; }); } getById(id) { return __awaiter(this, void 0, void 0, function* () { const document = yield this.model.findById(id).exec(); return this.formatDoc(document); }); } handleFilter(filter, search, searchFields) { if (!filter) { filter = {}; } if (filter === null || filter === void 0 ? void 0 : filter.id) { filter._id = filter.id; delete filter.id; } if (searchFields && search) { if (!Array.isArray(searchFields)) { searchFields = [searchFields]; } const searchValue = (0, prepare_1.stringToRegex)(search); const or = []; searchFields.map((val) => { or.push({ [`${val}`]: searchValue, }); }); filter["$or"] = or; } return Object.assign({}, filter); } findAll(filterOffset) { return __awaiter(this, void 0, void 0, function* () { var _a; if ((_a = filterOffset.filter) === null || _a === void 0 ? void 0 : _a.id) { filterOffset.filter._id = filterOffset.filter.id; delete filterOffset.filter.id; } const query = this.model .find(this.handleFilter(filterOffset.filter, filterOffset.searchValue, filterOffset.searchFields), filterOffset.select) .select(" -__v"); if (filterOffset.orderBy) { query.sort({ [filterOffset.orderBy]: filterOffset.direction ? filterOffset.direction : "asc", }); } const result = yield query.exec(); return result.map(this.formatDoc); }); } find(filterOffset) { return __awaiter(this, void 0, void 0, function* () { var _a, _b, _c; if ((_a = filterOffset.filter) === null || _a === void 0 ? void 0 : _a.id) { filterOffset.filter._id = filterOffset.filter.id; delete filterOffset.filter.id; } const limit = ((_b = filterOffset.offset) === null || _b === void 0 ? void 0 : _b.limit) || 20; const skip = ((_c = filterOffset.offset) === null || _c === void 0 ? void 0 : _c.skip) || 0; const query = this.model.find(this.handleFilter(filterOffset.filter, filterOffset.searchValue, filterOffset.searchFields), filterOffset.select); if (filterOffset.orderBy) { query.sort({ [filterOffset.orderBy]: filterOffset.direction ? filterOffset.direction : "asc", }); } if (filterOffset.offset) { query.skip(skip).limit(limit); } let preparedFilter = this.handleFilter(filterOffset.filter, filterOffset.searchValue, filterOffset.searchFields); const count = yield this.model.countDocuments(preparedFilter); const result = yield query.exec(); const resultList = { total: count, skipped: skip, limited: limit, list: result.map(this.formatDoc), }; return resultList; }); } insert(data) { return __awaiter(this, void 0, void 0, function* () { if (data.id) { return this.update(Object.assign(Object.assign({}, data), { id: data.id })); } const document = yield this.model.create(Object.assign(Object.assign({}, data), { _id: (0, crypto_1.randomUUID)() })); return { id: document === null || document === void 0 ? void 0 : document._id.toString() }; }); } update(data) { return __awaiter(this, void 0, void 0, function* () { const { id } = data; const updatedDocument = yield this.model.findOneAndUpdate({ _id: id }, data, { upsert: true, new: true, }); return { id: updatedDocument === null || updatedDocument === void 0 ? void 0 : updatedDocument.id.toString() }; }); } partialUpdate(id, updates) { return __awaiter(this, void 0, void 0, function* () { return this.update(Object.assign({ id }, (0, transformData_1.transformDataToUpdate)(updates))); }); } delete(id) { return __awaiter(this, void 0, void 0, function* () { yield this.model.findByIdAndDelete(id); return { success: true }; }); } } exports.MongoDbAccess = MongoDbAccess; MongoDbAccess.collectionsInfo = new Map(); MongoDbAccess.models = new Map(); //# sourceMappingURL=index.js.map