UNPKG

@tasolutions/express-core

Version:
96 lines (82 loc) 3.75 kB
const Response = require('../../utils/response'); const httpStatus = require('../../utils/httpStatus'); const { mapHeadersAndCheckAuthorization } = require('../../utils/requestHeader'); const { parseFormData } = require('../../utils/collection.util'); const { uploadFiles } = require('../../utils/upload'); const { authInfo } = require('../../config'); const { logger } = require('../../loggers'); const { DocumentTemplate } = require('../modules/document/models'); module.exports = { /** * This crud update */ update: async (req, res, Collection, configs) => { if (configs.is_docs_template) { req.query.collection_name = Collection.modelName; Collection = DocumentTemplate; } if (req.userLogin && req.userLogin.userId) { req.body.creatorId = req.userLogin.userId; } let payloadFilter = { _id: req.params._id }; // Ánh xạ headers và kiểm tra quyền truy cập const isAuthorized = await mapHeadersAndCheckAuthorization(req, payloadFilter, Collection); if (!isAuthorized) { return Response.error(res, 'User does not have permission to update the record.', httpStatus.FORBIDDEN); } // Merchant if (authInfo.enableMerchant && !req.isSystemAdmin) { const { merchant } = req.headers; payloadFilter['merchant_id'] = merchant; req.body.merchant_id = merchant; } // Remove fields with empty string values from req.body Object.keys(req.body).forEach((key) => { if (req.body[key] === "") { req.body[key] = null; } }); // Phân tích cú pháp req.body thành cấu trúc đối tượng const parsedBody = parseFormData(req.body); try { const oldData = await Collection.findById(req.params._id); if (!oldData) { return res.status(httpStatus.NOT_FOUND).json({ statusCode: httpStatus.NOT_FOUND, success: false, message: "Entry not found", }); } // Validate key uniqueness nếu key được thay đổi (chỉ cho DocumentTemplate) if (configs.is_docs_template && parsedBody.key && parsedBody.key !== oldData.key) { const existingTemplate = await DocumentTemplate.findOne({ key: parsedBody.key, _id: { $ne: req.params._id } // Loại trừ record hiện tại }); if (existingTemplate) { return Response.error(res, `Template with key '${parsedBody.key}' already exists`, 400); } } const payload = await uploadFiles(req, Collection); const result = await Collection.updateOne(payloadFilter, { $set: { ...payload, ...parsedBody } }); if (result.nModified === 0) { return res.status(httpStatus.NOT_FOUND).json({ statusCode: httpStatus.NOT_FOUND, success: false, message: "Entry not found", }); } const changedEntry = await Collection.findById(req.params._id); logger.info({ module: Collection.collection.collectionName, action: 'UPDATE', oldData: oldData, newData: changedEntry, updatedBy: req.userLogin && req.userLogin.userId ? req.userLogin.userId : null, }); return Response.success(res, changedEntry); } catch (e) { return Response.error(res, e.message); } } }