@tasolutions/express-core
Version:
All libs for express
118 lines (98 loc) • 5.31 kB
JavaScript
const Response = require('../../utils/response');
const queryUtil = require('../../utils/query.util');
const _ = require('lodash');
const { mapHeadersToQuery } = require('../../utils/requestHeader');
const { DocumentMedia } = require('../modules/document/models');
module.exports = {
/**
* This crud readMany
*/
readMany: async (req, res, Collection, configs) => {
try {
if (configs.is_docs_media) {
req.query.collection_name = Collection.modelName;
Collection = DocumentMedia;
}
if (configs.onlyOwner && req.userLogin && req.userLogin.userId) {
req.query.user_id = req.userLogin.userId;
}
const sort = queryUtil.getSort(req, configs.sort);
let query = await queryUtil.getQuery(Collection, req);
if (!configs.isFilterMerchant) delete query['merchant_id'];
if (configs.query) {
query = Object.assign({}, configs.query, query);
};
let andConditions = []; // Mảng để lưu điều kiện $and cho truy vấn
// Thêm dịch vụ loại nếu có
if (req.query.service_type) {
andConditions.push({ service_type: req.query.service_type });
}
// Xử lý tìm kiếm
if (req.query.search) {
const searchQuery = queryUtil.search(Collection, req.query.search);
delete req.query.search; // Xoá search từ query
// Thêm searchQuery vào mảng điều kiện
andConditions.push(searchQuery);
}
// Kiểm tra nếu có điều kiện $and
if (andConditions.length > 0) {
query = { $and: andConditions };
}
// Trở về các thuộc tính khác nếu có
query = Object.assign(await mapHeadersToQuery(req, Collection), query);
let populate = configs.populate && !configs.is_docs_media ? configs.populate : queryUtil.populateField(Collection);
let results;
if (configs.is_docs_media) {
// Trước tiên, lấy tất cả document media không populate
const documents = await Collection.find(query).sort(sort);
// Nhóm documents theo collection_name để xử lý populate hiệu quả
const groupedByCollection = _.groupBy(documents, 'collection_name');
// Kết quả cuối cùng
results = [];
// Xử lý từng nhóm
for (const [collectionName, docs] of Object.entries(groupedByCollection)) {
if (!collectionName || collectionName === 'unknown_collection_name') {
// Thêm vào kết quả mà không populate
results = results.concat(docs);
continue;
}
try {
// Lấy tất cả ref_id từ nhóm này
const refIds = docs.map(doc => doc.ref_id).filter(id => id && id !== 'unknown_ref_id');
// Lấy dữ liệu từ collection tương ứng
const mongoose = require('mongoose');
const targetModel = mongoose.model(collectionName);
if (targetModel) {
// Lấy dữ liệu từ collection đích
const refData = await targetModel.find({ _id: { $in: refIds } });
console.log('refData', refData);
const refDataMap = _.keyBy(refData, '_id');
// Gán dữ liệu populate vào từng document
for (const doc of docs) {
const docObj = doc.toObject ? doc.toObject() : doc;
if (doc.ref_id && doc.ref_id !== 'unknown_ref_id' && refDataMap[doc.ref_id]) {
docObj.ref_data = refDataMap[doc.ref_id];
}
results.push(docObj);
}
} else {
results = results.concat(docs);
}
} catch (err) {
console.error(`Error populating collection ${collectionName}:`, err.message);
results = results.concat(docs);
}
}
} else {
// Xử lý bình thường cho các collection khác
results = await Collection.find(query).populate(populate).sort(sort);
}
if (Array.isArray(configs.includeFields) && configs.includeFields.length > 0) {
results = results.map(result => _.pick(result, configs.includeFields));
}
return Response.success(res, results);
} catch (e) {
return Response.error(res, e.message);
}
},
};