@tasolutions/express-core
Version:
All libs for express
90 lines (74 loc) • 3.23 kB
JavaScript
const Response = require('../../utils/v1Response');
const queryUtil = require('../../utils/query.util');
const _ = require('lodash');
const { mapHeadersToQuery } = require('../../utils/requestHeader');
module.exports = {
/**
* This crud readMany
*/
readMany: async (req, res, Collection, configs) => {
try {
const moduleName = Collection.collection.collectionName;
const sort = queryUtil.getSort(req, configs);
let query = await queryUtil.getQuery(Collection, req);
if (configs.query) {
query = { ...configs.query, ...query };
}
if (req.query.search) {
const searchQuery = queryUtil.search(Collection, req.query.search);
delete query.search;
query = { ...query, $or: [searchQuery] };
}
query = { ...await mapHeadersToQuery(req, Collection), ...query }; // Ánh xạ header vào query
const populateFields = req.headers['x-populate'] ? req.headers['x-populate'].split(',') : [];
const limit = parseInt(req.query.limit, 10);
if (limit === -1) {
delete query.limit;
delete query.page;
let results = await Collection.find(query).lean().sort(sort);
if (populateFields.length > 0) {
results = await Collection.populate(results, populateFields.map(field => ({ path: field })));
}
const crudOptions = {
type: 'CRUD',
action: 'LIST_ALL',
typeName: moduleName,
options: {
lean: true,
page: req.query.page || 1,
sort: sort,
},
};
return Response.success(req, res, results, {}, crudOptions);
} else {
const options = {
lean: true,
page: req.query.page || 1,
limit: limit || 10,
sort: sort,
populate: populateFields.length > 0 ? populateFields : queryUtil.populateField(Collection),
};
delete query.page;
delete query.limit;
let results;
if (configs.callbackLIST) {
results = await Collection.paginate(query, options).then(configs.callbackLIST);
} else {
results = await Collection.paginate(query, options);
}
if (Array.isArray(configs.includeFields) && configs.includeFields.length > 0) {
results.docs = results.docs.map(result => _.pick(result, configs.includeFields));
}
const crudOptions = {
type: 'CRUD',
action: 'LIST',
typeName: moduleName,
options,
};
return Response.success(req, res, results, {}, crudOptions);
}
} catch (e) {
return Response.error(req, res, e);
}
},
};