coryas-formation-api/shared/middleware/advanced-result.js

76 lines
2.1 KiB
JavaScript
Raw Normal View History

2024-08-20 17:14:47 +00:00
const advancedResult =(model)=> async (req, res, next) => {
//search : l'information que je cherche
//fields : les colonnes je veux utiliser pour la recherche
2024-08-22 11:09:30 +00:00
const fields = req.query.fields; //Permet de récupérer les champs qu'on va effectuer la recherche du front.
const search = req.query.search; //Permet de récupérer la recherche
let page = req.query.page; //Permet de récupérer la page actuelle
let limit = req.query.limit; //Permet de récupérer la page de limite
2024-08-20 17:14:47 +00:00
let find = {}
//Recherche
if (fields) {
//Recherche l'element search dans le tableau de propriété fields
const query = {
2024-08-22 11:09:30 +00:00
//$or: c'est pour faire la recherche sur plusieurs champs, $regex : permet de stocker la recherche
//i : c'est pour mettre le texte insensible à la casse.
//-i: sensible à la casse.
2024-08-20 17:14:47 +00:00
$or: fields.map(property => ({
[property]: {$regex: search, $options: 'i'}
}))
};
find = {
$and: [
find,
query,
]
};
}
//Pagination
page = parseInt(page, 10) || 1;
limit = parseInt(limit, 10) || 3000;
const startIndex = (page - 1) * limit; //1, 1-1 = 0
const endIndex = page * limit;
const total = await model.find(find).countDocuments();
//declaration
let query = model.find(find);
query = query.skip(startIndex).limit(limit); // (5,8) 5,6,7,8,9,10,11, 12
//exécuté
let results = await query;
const pagination = {};
if (endIndex < total) {
pagination.next = {
page: page + 1,
limit
};
}
if (startIndex > 0) {
pagination.prev = {
page: page - 1,
limit
};
}
res.advancedResults = {
success: true,
count: results.length,
pagination: pagination,
data: results,
startIndex: startIndex + 1,
endIndex: results.length,
totalRecords: total,
limit: Number(limit),
page: page
};
next();
};
module.exports = advancedResult;