UNPKG

@tasolutions/express-core

Version:
118 lines (98 loc) 5.31 kB
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); } }, };