Added audit field for all create and updae API

This commit is contained in:
unknown 2025-11-20 19:26:17 +05:30
parent c31eabd96f
commit d7e4d58406
26 changed files with 98 additions and 54 deletions

View File

@ -51,7 +51,7 @@ exports.login = async (req, res) => {
}else{
const establishment_data = await Establishment.findByPk(userData.establishment_id);
tokenData = { id: userData.id, email: userData.email , name: userData.name , role : userRole , establishment_id: userData.establishment_id , establishment_data , last_login : userData.last_login }
await EstablishmentUser.update({ last_login : Date() }, { where: { id: userData.id } });
await EstablishmentUser.update({ last_login : Date(), updated_by: req.user.id, updated_at: new Date() }, { where: { id: userData.id } });
}
const token = jwt.sign(tokenData, process.env.JWT_SECRET, {

View File

@ -26,7 +26,7 @@ exports.updateDeadlineData = async (req, res) => {
first_reminder_days_before_deadline,
second_reminder_days_before_deadline,
updated_at: new Date(),
updated_by,
updated_by: req.body.updated_by || req.user.id,
});
res.status(200).json({ status: "success", message: "Deadline updated successfully", data: existing });
@ -39,7 +39,7 @@ exports.updateDeadlineData = async (req, res) => {
first_reminder_days_before_deadline,
second_reminder_days_before_deadline,
created_at: new Date(),
created_by,
created_by: req.body.created_by || req.user.id,
});
res.status(201).json({ status: "success", message: "Deadline created successfully", data: newRecord });

View File

@ -132,7 +132,7 @@ exports.createEstablishment = async (req, res) => {
non_emirati_female,
total_emirati,
total_employees,
created_by,
created_by: req.body.created_by || req.user.id,
created_at: new Date(),
});
@ -145,6 +145,7 @@ exports.createEstablishment = async (req, res) => {
name: establishment_user.name,
email: establishment_user.email,
password: hashedPassword,
created_by: req.body.created_by || req.user.id,
});
//send email to user
@ -513,7 +514,8 @@ exports.updateEstablishment = async (req, res) => {
return res.status(400).json({ status:"failed", message:"establishment_code already exists" });
}
}
estData.updated_by = estData.updated_by || req.user.id;
estData.updated_at = estData.updated_at || new Date();
// update establishment
await establishment.update(estData);
@ -528,6 +530,8 @@ exports.updateEstablishment = async (req, res) => {
if (establishment_user.password) {
updateUser.password = await bcrypt.hash(establishment_user.password,10);
}
updateUser.updated_by = updateUser.updated_by || req.user.id;
updateUser.updated_at = updateUser.updated_at || new Date();
await user.update(updateUser);
}
}
@ -549,7 +553,7 @@ exports.updateEstablishment = async (req, res) => {
const newIds = incomingIds.filter(v => !oldIds.includes(v));
for (let pid of newIds) {
await EstablishmentProduct.create({ establishment_id:id, product_id:pid });
await EstablishmentProduct.create({ establishment_id:id, product_id:pid, created_by: req.user.id});
}
}
@ -701,6 +705,7 @@ exports.createRequest = async (req, res) => {
additional_notes,
establishment_user_id: user.id,
establishment_id: establishment.id,
created_by: req.user.id,
});
// Trigger Email
@ -795,13 +800,7 @@ exports.forgotPasswordRequestOTP = async (req, res) => {
"Password Reset OTP",
`<p>Dear ${adminUser.name},</p><p>Your OTP for password reset is <b>${otp}</b>. It is valid for 10 minutes.</p>`
);
}
logger.info(`OTP sent to ${registered_email}`);
return res.status(200).json({
@ -1234,8 +1233,6 @@ exports.establishmentBulkUpload = async (req, res) => {
}
};
// exports.establishmentBulkUpload = async (req, res) => {
// try {
// // Basic file & user validations

View File

@ -5,7 +5,7 @@ const Product = db.Product;
const UnitMaster = db.UnitMaster;
exports.createEstablishmentProduct = async (req, res) => {
try {
req.body.created_by = req.body.created_by || req.user.id;
const data = await EstablishmentProduct.create(req.body);
res.status(201).send({'status':"success",'message':"Creation successful",'data': data });
@ -64,6 +64,9 @@ exports.getEstablishmentProductById = async (req, res) => {
exports.updateEstablishmentProduct = async (req, res) => {
try {
req.body.updated_by = req.body.updated_by || req.user.id;
req.body.updated_at = req.body.updated_at || new Date();
const [updated] = await EstablishmentProduct.update(req.body, { where: { id: req.params.id } });
if (!updated) res.status(404).send({'status':"failed",'message':"Record not found",'data': "" });

View File

@ -23,6 +23,7 @@ exports.createUser = async (req, res) => {
email,
password: hashed,
gender,
created_by: req.user.id,
});
//send email to user
@ -83,6 +84,8 @@ exports.updateUser = async (req, res) => {
if (email !== undefined && email !== null) data.email = email;
if (is_active !== undefined && is_active !== null) data.is_active = is_active;
if (password && password.trim() !== "") data.password = await bcrypt.hash(password, 10);
data.updated_by = req.body.updated_by || req.user.id;
data.updated_at = req.body.updated_at || new Date();
const [updated] = await EstablishmentUser.update(data, {
where: { id: req.params.id },
@ -127,7 +130,7 @@ exports.changeUserPassword = async (req, res) => {
// Hash and update new password
const hashedPassword = await bcrypt.hash(new_password, 10);
await EstablishmentUser.update(
{ password: hashedPassword },
{ password: hashedPassword, updated_by: req.user.id, updated_at: new Date() },
{ where: { id: userId } }
);

View File

@ -4,6 +4,7 @@ const NotificationTemplate = db.NotificationTemplate;
// Create template
exports.createTemplate = async (req, res) => {
try {
req.body.created_by = req.body.created_by || req.user.id;
const template = await NotificationTemplate.create(req.body);
res.status(201).send({
status: "success",
@ -50,7 +51,10 @@ exports.getTemplateById = async (req, res) => {
// Update template
exports.updateTemplate = async (req, res) => {
try {
try {
req.body.updated_by = req.body.updated_by || req.user.id;
req.body.updated_at = req.body.updated_at || new Date();
const [updated] = await NotificationTemplate.update(req.body, {
where: { id: req.params.id },
});

View File

@ -25,7 +25,7 @@ exports.createProduct = async (req, res) => {
}
req.body.created_by = req.user.id;
const data = await Product.create(req.body);
const data = await Product.create(req.body);
res.status(201).send({'status':"success",'message':"created successfully",'data': data });
} catch (error) {
res.status(500).send({'status':"failed",'message':error.message });
@ -84,7 +84,8 @@ exports.updateProduct = async (req, res) => {
const object = {
...req.body,
updated_at: Sequelize.literal("NOW()")
updated_by: req.user.id,
updated_at: new Date()
};
const [updated] = await Product.update(object, { where: { id: req.params.id } });

View File

@ -26,6 +26,7 @@ exports.createConfig = async (req, res) => {
req.body.assigned = assignedCount;
req.body.responded = 0;
req.body.not_responded = assignedCount;
req.body.created_by = req.body.created_by || req.user.id;
const data = await QuarterlyWindowsConfiguration.create(req.body);
res.status(201).send({
@ -83,6 +84,8 @@ exports.getConfigById = async (req, res) => {
// Update configuration
exports.updateConfig = async (req, res) => {
try {
req.body.updated_by = req.body.updated_by || req.user.id;
req.body.updated_at = req.body.updated_at || new Date();
const [updated] = await QuarterlyWindowsConfiguration.update(req.body, {
where: { id: req.params.id },
});

View File

@ -35,7 +35,7 @@ exports.createSubmission = async (req, res) => {
if (exists) {
return res.status(400).json({status: "failed", message: `Submission already exists for establishment_id: ${establishment_id}, quarter: ${quarter}, year: ${year}`});
}
submissionData.created_by = submissionData.created_by || req.user.id;
const submission = await Submission.create({establishment_id, quarter, year, ...submissionData});
@ -45,11 +45,8 @@ exports.createSubmission = async (req, res) => {
const currentResponded = config.responded ?? 0;
const currentNotResponded = config.not_responded ?? 0;
// respond increase, not responded decrease
await QuarterlyWindowsConfiguration.update({responded: currentResponded + 1, not_responded: currentNotResponded - 1 }, {where: { id: config.id }} );
await QuarterlyWindowsConfiguration.update({responded: currentResponded + 1, not_responded: currentNotResponded - 1, updated_by: req.user.id, updated_at: new Date() }, {where: { id: config.id }} );
}
if (products.length) {
// products.forEach((p) => (p.submission_id = submission.id));
@ -212,6 +209,9 @@ exports.updateSubmission = async (req, res) => {
if (!submission)
return res.status(404).json({ status: "failed", message: "Submission not found" });
submissionData.updated_by = submissionData.updated_by || req.user.id;
submissionData.updated_at = submissionData.updated_at || new Date();
// Update main submission record
await submission.update(submissionData);
@ -270,11 +270,15 @@ exports.updateSubmission = async (req, res) => {
});
if (existingProduct) {
updatedProductData.updated_by = updatedProductData.updated_by || req.user.id;
updatedProductData.updated_at = updatedProductData.updated_at || new Date();
await existingProduct.update(updatedProductData);
} else {
updatedProductData.created_by = updatedProductData.created_by || req.user.id;
await SubmissionProduct.create(updatedProductData);
}
} else {
updatedProductData.created_by = updatedProductData.created_by || req.user.id;
await SubmissionProduct.create(updatedProductData);
}
}
@ -675,7 +679,7 @@ exports.submissionEditRequest = async (req, res) => {
return res.status(404).json({ status: "failed", message: "Submission not found" });
// Update submission main data
await submission.update({ edit_request });
await submission.update({ edit_request, updated_by: req.user.id, updated_at: new Date() });
res.status(200).json({
status: "success",
@ -701,7 +705,7 @@ exports.enableOrDisableSubmissionEditAccess = async (req, res) => {
return res.status(404).json({ status: "failed", message: "Submission not found" });
// Update submission main data
const result = await submission.update({ edit_request : 0 , edit_access : edit_access});
const result = await submission.update({ edit_request : 0 , edit_access : edit_access, updated_by: req.user.id, updated_at: new Date()});
res.status(200).json({
status: "success",
@ -736,7 +740,7 @@ exports.approveOrRejectSubmission = async (req, res) => {
return res.status(404).json({ status: "failed", message: "Submission not found" });
// Update submission main data
const result = await submission.update({ approve_reject_status : approve_reject_status , status : statusString, reject_reason, approve_or_reject_by });
const result = await submission.update({ approve_reject_status : approve_reject_status , status : statusString, reject_reason, approve_or_reject_by, updated_by: req.user.id, updated_at: new Date() });
//send email to establishment user

View File

@ -89,6 +89,7 @@ exports.createUnit = async (req, res) => {
});
}
req.body.uom_short_name = uomShort;
req.body.created_by = req.body.created_by || req.user.id;
const unit = await UnitMaster.create(req.body);
res.status(201).json({ status: "success", data: unit });
@ -137,6 +138,9 @@ exports.updateUnit = async (req, res) => {
const unit = await UnitMaster.findByPk(req.params.id);
if (!unit) return res.status(404).json({ status: "error", message: "Unit not found" });
req.body.updated_by = req.body.updated_by || req.user.id;
req.body.updated_at = req.body.updated_at || new Date();
await unit.update(req.body);
res.status(200).json({ status: "success", data: unit });
} catch (err) {

View File

@ -10,7 +10,7 @@ exports.createReason = async (req, res) => {
if (!reason)
return res.status(400).send({ status: "failed", message: "Reason is required" });
const newReason = await VariationReasonMaster.create({ reason, high_or_low });
const newReason = await VariationReasonMaster.create({ reason, high_or_low, created_by: req.body.created_by || req.user.id });
res.status(201).send({ status: "success", message: "Reason created successfully", data: newReason });
} catch (err) {
res.status(500).send({ status: "failed", message: err.message });
@ -43,7 +43,7 @@ exports.updateReason = async (req, res) => {
try {
const { reason, high_or_low, is_active } = req.body;
const updated = await VariationReasonMaster.update(
{ reason, high_or_low, is_active, updated_at: new Date(), updated_on: new Date() },
{ reason, high_or_low, is_active, updated_at: new Date(), updated_on: new Date(), updated_by: req.user.id },
{ where: { id: req.params.id } }
);

View File

@ -1,20 +1,20 @@
const db = require("../models");
const ZeroTargetReasonMaster = db.ZeroTargetReasonMaster;
// Create
// Create
exports.create = async (req, res) => {
try {
const { reason, is_active } = req.body;
if (!reason) return res.status(400).send({ status: "failed", message: "Reason is required" });
const data = await ZeroTargetReasonMaster.create({ reason, is_active });
const data = await ZeroTargetReasonMaster.create({ reason, is_active, created_by: req.user.id });
res.status(201).send({ status: "success", data });
} catch (err) {
res.status(500).send({ status: "failed", message: err.message });
}
};
// Get All
// Get All
exports.getAll = async (req, res) => {
try {
const data = await ZeroTargetReasonMaster.findAll();
@ -24,7 +24,7 @@ exports.getAll = async (req, res) => {
}
};
// Get By ID
// Get By ID
exports.getById = async (req, res) => {
try {
const { id } = req.params;
@ -36,10 +36,12 @@ exports.getById = async (req, res) => {
}
};
// Update
// Update
exports.update = async (req, res) => {
try {
const { id } = req.params;
req.body.updated_by = req.body.updated_by || req.user.id;
req.body.updated_at = req.body.updated_at || new Date();
const [updated] = await ZeroTargetReasonMaster.update(req.body, { where: { id } });
if (!updated) return res.status(404).send({ status: "failed", message: "Not found" });
const data = await ZeroTargetReasonMaster.findByPk(id);
@ -49,7 +51,7 @@ exports.update = async (req, res) => {
}
};
// Delete
// Delete
exports.delete = async (req, res) => {
try {
const { id } = req.params;

View File

@ -38,7 +38,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_by: {
type: DataTypes.INTEGER,
@ -48,8 +48,14 @@ module.exports = (sequelize, DataTypes) => {
{
tableName: "unit_master",
timestamps: true,
createdAt: "created_at",
updatedAt: "updated_at",
createdAt: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
},
updatedAt: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
},
}
);

View File

@ -61,7 +61,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_at: {
type: DataTypes.DATE,

View File

@ -15,7 +15,8 @@ module.exports = (sequelize, DataTypes) => {
},
created_at: { type: DataTypes.DATE, defaultValue: DataTypes.NOW },
updated_at: { type: DataTypes.DATE, defaultValue: DataTypes.NOW },
updated_by: { type: DataTypes.INTEGER },
created_by: {type: DataTypes.INTEGER, allowNull: false },
updated_by: { type: DataTypes.INTEGER, allowNull: true },
establishment_user_id: { type: DataTypes.INTEGER },
establishment_id: { type: DataTypes.INTEGER },
},

View File

@ -23,7 +23,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_at: {
type: DataTypes.DATE,

View File

@ -38,7 +38,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_at: {
type: DataTypes.DATE,

View File

@ -40,6 +40,8 @@ module.exports = (sequelize, DataTypes) => {
type: DataTypes.DATE,
allowNull: true,
},
created_by: {type: DataTypes.INTEGER, allowNull: false },
updated_by: { type: DataTypes.INTEGER, allowNull: true },
},
{
tableName: "notification_templates",

View File

@ -31,7 +31,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_at: {
type: DataTypes.DATE,

View File

@ -41,7 +41,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_at: {
type: DataTypes.DATE,

View File

@ -45,7 +45,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_by: {
type: DataTypes.INTEGER,

View File

@ -33,7 +33,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_by: {
type: DataTypes.INTEGER,

View File

@ -28,13 +28,21 @@ module.exports = (sequelize, DataTypes) => {
type: DataTypes.STRING,
allowNull: true,
},
updated_by: {
type: DataTypes.INTEGER,
allowNull: true,
},
created_at: {
type: DataTypes.DATE,
allowNull: true,
},
created_by: {
type: DataTypes.INTEGER,
allowNull: false,
},
updated_at: {
type: DataTypes.DATE,
allowNull: true,
},
updated_by: {
type: DataTypes.INTEGER,
allowNull: true,
}
},
{

View File

@ -51,8 +51,14 @@ module.exports = (sequelize, DataTypes) => {
zero_target_reason_master_id: DataTypes.INTEGER,
other_zero_target_reason: DataTypes.STRING(255),
remarks: DataTypes.STRING(255),
created_by: DataTypes.INTEGER,
updated_by: DataTypes.INTEGER,
created_by: {
type: DataTypes.INTEGER,
allowNull: false,
},
updated_by: {
type: DataTypes.INTEGER,
allowNull: true,
},
is_active: {
type: DataTypes.BOOLEAN,
defaultValue: true,

View File

@ -24,7 +24,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_at: {
type: DataTypes.DATE,

View File

@ -19,7 +19,7 @@ module.exports = (sequelize, DataTypes) => {
},
created_by: {
type: DataTypes.INTEGER,
allowNull: true,
allowNull: false,
},
updated_at: {
type: DataTypes.DATE,