UNPKG

express-easy-curd

Version:

A lightweight helper library for building Express.js routes, controllers, and Redis-enhanced middleware with optional Redis support.

199 lines (198 loc) 8.58 kB
"use strict"; 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 }); const mongoose_1 = require("mongoose"); const globalHelper_1 = require("../helpers/globalHelper"); const redisCacheKeyGenerator_1 = __importDefault(require("../helpers/redisCacheKeyGenerator")); const queryHelper_1 = require("../helpers/queryHelper"); const { ObjectId } = mongoose_1.Types; const delIoredisCache = (ioredis, name) => __awaiter(void 0, void 0, void 0, function* () { if (ioredis && name) { const cacheKey = `*api:v1:${name}*`.toLowerCase(); const keys = yield ioredis.keys(cacheKey); if (keys.length > 0) yield ioredis.call("DEL", ...keys); } }); const globalController = (ModelName, name, ioredis, cachedTime = 600) => { return { // create create: (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { try { if (ioredis) yield delIoredisCache(ioredis, name); const data = yield ModelName.create(req.body); (0, globalHelper_1.sendResponse)(res, 201, { success: true, message: `${name} created successfully`, data, }); } catch (error) { next(error); } }), // get all getAll: (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { try { let values = { data: [], meta: { limit: 10, page: 1, total: 0 }, }; const cacheKey = (0, redisCacheKeyGenerator_1.default)(req); if (ioredis) { const cachedData = yield ioredis.get(cacheKey); if (cachedData) { values = JSON.parse(cachedData); } } if (!values.data.length) { const pagination = (0, queryHelper_1.paginationHelper)(req.query); const filter = (0, queryHelper_1.filterHelper)(req.query, req.partialFilter || [], new ModelName()); const { page, limit, skip, sortCondition, populate } = pagination; const data = (yield ModelName.find(filter) .limit(limit) .skip(skip) .sort(sortCondition) .populate(populate || "") .lean()); const total = yield ModelName.countDocuments(filter); values = { data, meta: { page, limit, total } }; if (ioredis && values.data.length) { yield ioredis.set(cacheKey, JSON.stringify(values), "EX", cachedTime); } } (0, globalHelper_1.sendResponse)(res, 200, { success: true, message: `${name}s fetched successfully`, data: values.data, meta: values.meta, }); } catch (error) { next(error); } }), // get single getSingle: (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { try { let data = null; const cacheKey = (0, redisCacheKeyGenerator_1.default)(req); if (ioredis) { const cachedData = yield ioredis.get(cacheKey); if (cachedData) { data = JSON.parse(cachedData); } } if (!data) { if (!ObjectId.isValid(req.params.id)) throw new globalHelper_1.ApiError(400, "Invalid ID format"); data = (yield ModelName.findById(req.params.id).lean()); if (ioredis && data) { yield ioredis.set(cacheKey, JSON.stringify(data), "EX", cachedTime); } } (0, globalHelper_1.sendResponse)(res, 200, { success: true, message: `${name} fetched successfully`, data, }); } catch (error) { next(error); } }), // update update: (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { try { if (ioredis) yield delIoredisCache(ioredis, name); if (!ObjectId.isValid(req.params.id)) throw new globalHelper_1.ApiError(400, "Invalid ID format"); const data = yield ModelName.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true, }); if (!data) { throw new globalHelper_1.ApiError(500, "Server Error"); } (0, globalHelper_1.sendResponse)(res, 200, { success: true, message: `${name} updated successfully`, data, }); } catch (error) { next(error); } }), // update updateMany: (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { try { if (ioredis) yield delIoredisCache(ioredis, name); const filter = (0, queryHelper_1.filterHelper)(req.query, req.partialFilter || [], new ModelName()); const result = yield ModelName.updateMany(filter, req.body, { runValidators: true }); if (result.modifiedCount === 0) { throw new globalHelper_1.ApiError(404, "No documents updated"); } const data = yield ModelName.find(filter); (0, globalHelper_1.sendResponse)(res, 200, { success: true, message: `${name}s updated successfully`, data, }); } catch (error) { next(error); } }), // remove remove: (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { try { if (ioredis) yield delIoredisCache(ioredis, name); if (!ObjectId.isValid(req.params.id)) throw new globalHelper_1.ApiError(400, "Invalid ID format"); const data = yield ModelName.findByIdAndDelete(req.params.id); (0, globalHelper_1.sendResponse)(res, 200, { success: true, message: `${name} deleted successfully`, data, }); } catch (error) { next(error); } }), // removeMany removeMany: (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { try { if (ioredis) yield delIoredisCache(ioredis, name); const filter = (0, queryHelper_1.filterHelper)(req.query, req.partialFilter || [], new ModelName()); const data = yield ModelName.deleteMany(filter); (0, globalHelper_1.sendResponse)(res, 200, { success: true, message: `${name}s deleted successfully`, data, }); } catch (error) { next(error); } }), }; }; exports.default = globalController;