forked from UKSOURCE/cms.hailearning.edu.vn
feat: implement comprehensive audit logging system
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
const Home = require("../models/home");
|
||||
const writeAuditLog = require("../audit/writeAuditLog");
|
||||
const diffObject = require("../audit/diffObject");
|
||||
const AUDIT_ACTIONS = require("../constants/auditAction");
|
||||
|
||||
// Helper to get FAQ data from Home model
|
||||
const getFaqData = async () => {
|
||||
@@ -9,7 +12,7 @@ const getFaqData = async () => {
|
||||
subheading: "",
|
||||
description: "",
|
||||
items: [],
|
||||
ctaButton: { label: "", href: "" }
|
||||
ctaButton: { label: "", href: "" },
|
||||
};
|
||||
}
|
||||
return home.faq.toObject ? home.faq.toObject() : home.faq;
|
||||
@@ -41,7 +44,7 @@ exports.index = async (req, res) => {
|
||||
subheading: data.subheading || "",
|
||||
description: data.description || "",
|
||||
ctaButton: data.ctaButton || { label: "", href: "" },
|
||||
items: data.items || []
|
||||
items: data.items || [],
|
||||
};
|
||||
|
||||
const frontendUrl = process.env.FRONTEND_URL;
|
||||
@@ -64,12 +67,13 @@ exports.index = async (req, res) => {
|
||||
// Update FAQ data
|
||||
exports.update = async (req, res) => {
|
||||
try {
|
||||
const { heading, subheading, description, ctaLabel, ctaHref, items } = req.body;
|
||||
const { heading, subheading, description, ctaLabel, ctaHref, items } =
|
||||
req.body;
|
||||
|
||||
let parsedItems = [];
|
||||
if (items) {
|
||||
try {
|
||||
parsedItems = typeof items === 'string' ? JSON.parse(items) : items;
|
||||
parsedItems = typeof items === "string" ? JSON.parse(items) : items;
|
||||
} catch (e) {
|
||||
console.error("Error parsing items JSON:", e);
|
||||
parsedItems = [];
|
||||
@@ -81,22 +85,47 @@ exports.update = async (req, res) => {
|
||||
home = new Home({});
|
||||
}
|
||||
|
||||
home.faq = {
|
||||
// ✅ Capture BEFORE state
|
||||
const beforeData = home.faq
|
||||
? JSON.parse(
|
||||
JSON.stringify(home.faq.toObject ? home.faq.toObject() : home.faq),
|
||||
)
|
||||
: {};
|
||||
|
||||
const updatedFaqData = {
|
||||
heading: heading || "",
|
||||
subheading: subheading || "",
|
||||
description: description || "",
|
||||
ctaButton: {
|
||||
label: ctaLabel || "",
|
||||
href: ctaHref || ""
|
||||
href: ctaHref || "",
|
||||
},
|
||||
items: parsedItems.map(item => ({
|
||||
items: parsedItems.map((item) => ({
|
||||
question: item.question || "",
|
||||
answer: item.answer || ""
|
||||
}))
|
||||
answer: item.answer || "",
|
||||
})),
|
||||
};
|
||||
|
||||
home.faq = updatedFaqData;
|
||||
await home.save();
|
||||
|
||||
// ✅ Capture AFTER state
|
||||
const afterData = JSON.parse(JSON.stringify(updatedFaqData));
|
||||
|
||||
// ✅ AUDIT LOGGING - FAQ Updated
|
||||
const changes = diffObject(beforeData, afterData);
|
||||
if (changes.length > 0) {
|
||||
await writeAuditLog({
|
||||
model: "Home",
|
||||
documentId: home._id,
|
||||
action: AUDIT_ACTIONS.UPDATE_FAQ,
|
||||
before: beforeData,
|
||||
after: afterData,
|
||||
changes,
|
||||
req,
|
||||
});
|
||||
}
|
||||
|
||||
req.flash("success_msg", "FAQ section updated successfully");
|
||||
res.redirect("/admin/home/faq");
|
||||
} catch (err) {
|
||||
@@ -107,11 +136,19 @@ exports.update = async (req, res) => {
|
||||
};
|
||||
|
||||
// Placeholder methods to prevent route crashes if routes are not cleaned up immediately
|
||||
exports.addFAQ = (req, res) => res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.updateFAQItem = (req, res) => res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.deleteFAQItem = (req, res) => res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.addFAQSection = (req, res) => res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.updateFAQSection = (req, res) => res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.deleteFAQSection = (req, res) => res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.reorderFAQSection = (req, res) => res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.updateSidebarNav = (req, res) => res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.addFAQ = (req, res) =>
|
||||
res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.updateFAQItem = (req, res) =>
|
||||
res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.deleteFAQItem = (req, res) =>
|
||||
res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.addFAQSection = (req, res) =>
|
||||
res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.updateFAQSection = (req, res) =>
|
||||
res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.deleteFAQSection = (req, res) =>
|
||||
res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.reorderFAQSection = (req, res) =>
|
||||
res.status(404).json({ error: "Endpoint deprecated" });
|
||||
exports.updateSidebarNav = (req, res) =>
|
||||
res.status(404).json({ error: "Endpoint deprecated" });
|
||||
|
||||
Reference in New Issue
Block a user