class APIFeatures { constructor(query, queryString) { this.query = query; this.queryString = queryString; } filter() { const queryObjects = { ...this.queryString }; const excludedFields = ["page", "sort", "fields", "limit"]; excludedFields.forEach((ele) => delete queryObjects[ele]); let queryString = JSON.stringify(queryObjects); queryString = queryString.replace( /\b(gte|gt|lte|lt|eq)\b/g, (match) => `$${match}` ); this.query = this.query.find(JSON.parse(queryString)); return this; } sort() { if (this.queryString.sort) { const sortBy = this.queryString.sort.split(",").join(" "); this.query = this.query.sort(sortBy); } else { this.query = this.query.sort("-createdAt"); } return this; } fieldLimit() { if (this.queryString.fields) { const fields = this.queryString.fields.split(",").join(" "); this.query = this.query.select(fields); } else { this.query = this.query.select("-__v"); } return this; } pagination() { const page = this.queryString.page * 1 || 1; const limit = this.queryString.limit * 1 || 100; // page=3&limit=10, 1-10 page 1, 11-20 page 2, 21-30 page 3 const skip = (page - 1) * limit; this.query = this.query.skip(skip).limit(limit); return this; } } module.exports = APIFeatures;