UNPKG

create-nodeapi-backend

Version:

A powerful Node.js backend boilerplate with Express, MongoDB, Firebase, JWT auth, Nodemailer, cron jobs, input validation (Joi), and serverless support for Vercel. Scaffold a full-featured API backend in seconds.

97 lines (85 loc) 2.35 kB
const deleteNestedKeys = require("./deleteNestedKey"); const getPaginatedData = async ({ model, filters = {}, page = 1, limit = 10, includeUser = false, populateFields = null, exclude = [], sortBy = "-createdAt", populate = [] }) => { try { if (page < 1) { return { code: 404, message: "Page number cannot be less than 1" }; } const pageNumber = parseInt(page, 10); const limitNumber = parseInt(limit, 10); const skip = (pageNumber - 1) * limitNumber; let query = model.find(filters).sort(sortBy).skip(skip).limit(limitNumber); if (includeUser) { query = query.populate( "createdBy", "_id " ); } else if (populateFields && populateFields.trim() !== "") { let fields = populateFields.split(" "); fields = fields.filter((field) => field !== "password"); const populateString = fields.join(" "); if (populateString.trim() !== "") { query = query.populate("createdBy", populateString); } } if (populate && populate.length > 0) { populate.forEach((field) => { query = query.populate(field); }); } const data = await query; if (!data || data.length === 0) { return { code: 200, message: "No data found", data: { results: [], pagination: { totalItems: 0, currentPage: 0, totalPages: 0, pageSize: 0 } } }; } const filteredResults = data.map((item) => { const obj = item.toObject(); deleteNestedKeys(obj, exclude); return obj; }); const totalCount = await model.countDocuments(filters); return { code: 200, message: "Data retrieved successfully", data: { results: filteredResults || [], pagination: { totalItems: totalCount, currentPage: pageNumber, totalPages: Math.ceil(totalCount / limitNumber), pageSize: limitNumber } } }; } catch (error) { return { code: 500, message: "An error occurred while fetching data", error: error.message || error }; } }; module.exports = getPaginatedData;