55 lines
1.3 KiB
JavaScript
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;
|