const Books = require("Books.js")
async getBooks(req, res, next) {
let query;
// Copy req.query
let reqQuery = { ...req.query };
// Fields to exclude
const removeFields = ["select", "sort"];
// Loop over removeFields and delete them from reqQuery
removeFields.forEach(param => delete reqQuery[param]);
// Create query string
let queryStr = JSON.stringify(reqQuery);
// Create operators ($gt, $gte, etc)
queryStr = queryStr.replace(
/(gt|gte|lt|lte|in)/g,
match => `$${match}`
);
// Find resource
query = Books.findQuery(JSON.parse(queryStr));
// Select Fields
if (req.query.select) {
const fields = req.query.select.split(",").join(" ");
query = query.select(fields);
}
// Sort
if (req.query.sort) {
const sortBy = req.query.sort.split(",").join(" ");
query = query.sort(sortBy);
} else {
query = query.sort("-createdAt");
}
// Pagination
const page = parseInt(req.query.page, 10) || 1;
const limit = parseInt(req.query.limit, 10) || 10;
const startIndex = (page - 1) * limit;
const endIndex = page * limit;
const total = await Books.countDocuments();
query = query.skip(startIndex).limit(limit);
// Executing query
let books = await query;
// Pagination result
const pagination = {};
if (endIndex < total) {
pagination.next = {
page: page + 1,
limit,
};
}
if (startIndex > 0) {
pagination.prev = {
page: page - 1,
limit,
};
}
res.status(200).json({
success: true,
count: books.length,
pagination,
data: books,
});
}