@tasolutions/express-core
Version:
All libs for express
96 lines (82 loc) • 3.75 kB
JavaScript
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);
}
}
}