2026-03-03 12:36:05 +00:00

55 lines
1.3 KiB
JavaScript

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;