mongo-base-crud
Version:
Class to handler access and handler database
266 lines • 12 kB
JavaScript
;
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