forked from UKSOURCE/cms.hailearning.edu.vn
198 lines
5.7 KiB
JavaScript
198 lines
5.7 KiB
JavaScript
const Safety = require("../models/safety");
|
|
const { addBaseUrlToImages } = require("../utils/imageHelper");
|
|
const writeAuditLog = require("../audit/writeAuditLog");
|
|
const diffObject = require("../audit/diffObject");
|
|
const AUDIT_ACTIONS = require("../constants/auditAction");
|
|
|
|
// Lấy dữ liệu Safety từ MongoDB
|
|
const getSafetyData = async () => {
|
|
const safety = await Safety.findOne().sort({ updatedAt: -1 });
|
|
if (!safety) {
|
|
return null;
|
|
}
|
|
return safety.toObject();
|
|
};
|
|
|
|
// API endpoint cho frontend
|
|
exports.api = async (req, res) => {
|
|
try {
|
|
const safety = await getSafetyData();
|
|
if (!safety) {
|
|
return res.status(404).json({ error: "Safety data not found" });
|
|
}
|
|
const baseUrl =
|
|
process.env.BACKEND_URL || `${req.protocol}://${req.get("host")}`;
|
|
const processedData = addBaseUrlToImages(safety, baseUrl);
|
|
res.json(processedData);
|
|
} catch (err) {
|
|
console.error("Safety API error:", err);
|
|
res.status(500).json({ error: "Error loading safety data" });
|
|
}
|
|
};
|
|
|
|
// Hiển thị danh sách Safety cho admin
|
|
exports.index = async (req, res) => {
|
|
try {
|
|
const items = await Safety.find().sort({ updatedAt: -1 }).limit(10);
|
|
// Lấy bản ghi mới nhất hoặc object rỗng nếu chưa có dữ liệu
|
|
const latest = items && items.length > 0 ? items[0] : null;
|
|
const data = latest
|
|
? latest.toObject
|
|
? latest.toObject()
|
|
: latest
|
|
: {
|
|
hero: { title: "", banner: "" },
|
|
approach: {},
|
|
approachImgs: [],
|
|
approachStats: [],
|
|
approachFeatures: [],
|
|
approachCards: [],
|
|
philosophy: {},
|
|
philosophyCards: [],
|
|
security: {},
|
|
securityCards: [],
|
|
};
|
|
res.render("admin/safety/index", {
|
|
layout: "layouts/main",
|
|
title: "Safety Management",
|
|
items,
|
|
data,
|
|
frontendUrl:
|
|
process.env.FRONTEND_URL || req.protocol + "://" + req.get("host"),
|
|
currentPath: req.path,
|
|
user: req.session.user,
|
|
});
|
|
} catch (err) {
|
|
console.error(err);
|
|
req.flash("error_msg", "Error loading Safety data");
|
|
res.redirect("/admin/dashboard");
|
|
}
|
|
};
|
|
|
|
// Hiển thị form tạo mới Safety
|
|
exports.createForm = async (req, res) => {
|
|
try {
|
|
res.render("admin/safety/create", {
|
|
layout: "layouts/main",
|
|
title: "Create Safety",
|
|
currentPath: req.path,
|
|
user: req.session.user,
|
|
});
|
|
} catch (err) {
|
|
console.error(err);
|
|
req.flash("error_msg", "Error loading create form");
|
|
res.redirect("/admin/safety");
|
|
}
|
|
};
|
|
|
|
// Tạo mới Safety
|
|
exports.create = async (req, res) => {
|
|
try {
|
|
const safetyData = req.body; // Tùy chỉnh parse nếu cần
|
|
const newSafety = new Safety(safetyData);
|
|
await newSafety.save();
|
|
req.flash("success_msg", "Safety created successfully");
|
|
res.redirect("/admin/safety");
|
|
} catch (err) {
|
|
console.error("Create error:", err);
|
|
req.flash("error_msg", `Create error: ${err.message || "Unknown"}`);
|
|
res.redirect("/admin/safety/create");
|
|
}
|
|
};
|
|
|
|
// Cập nhật Safety
|
|
exports.update = async (req, res) => {
|
|
try {
|
|
const { hero, approach, philosophy, security } = req.body;
|
|
|
|
// Parse JSON strings
|
|
const parseJson = (data) => {
|
|
if (!data) return null;
|
|
if (typeof data === "string") {
|
|
try {
|
|
return JSON.parse(data);
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
return data;
|
|
};
|
|
|
|
const heroData = parseJson(hero);
|
|
const approachData = parseJson(approach);
|
|
const philosophyData = parseJson(philosophy);
|
|
const securityData = parseJson(security);
|
|
|
|
// Tìm hoặc tạo safety record
|
|
const items = await Safety.find().sort({ updatedAt: -1 }).limit(1);
|
|
let safety = items && items.length > 0 ? items[0] : null;
|
|
|
|
// ✅ Capture BEFORE state
|
|
const beforeData = safety
|
|
? JSON.parse(JSON.stringify(safety.toObject ? safety.toObject() : safety))
|
|
: {};
|
|
|
|
if (!safety) {
|
|
// Tạo mới
|
|
safety = new Safety({
|
|
hero: heroData || { title: "", banner: "" },
|
|
approach: approachData || {},
|
|
philosophy: philosophyData || {},
|
|
security: securityData || {},
|
|
});
|
|
} else {
|
|
// Cập nhật
|
|
if (heroData) safety.hero = heroData;
|
|
if (approachData) safety.approach = approachData;
|
|
if (philosophyData) safety.philosophy = philosophyData;
|
|
if (securityData) safety.security = securityData;
|
|
}
|
|
|
|
await safety.save();
|
|
|
|
// ✅ Capture AFTER state
|
|
const afterData = JSON.parse(
|
|
JSON.stringify(safety.toObject ? safety.toObject() : safety),
|
|
);
|
|
|
|
// ✅ AUDIT LOGGING - Safety Updated
|
|
const changes = diffObject(beforeData, afterData);
|
|
if (changes.length > 0) {
|
|
await writeAuditLog({
|
|
model: "Safety",
|
|
documentId: safety._id,
|
|
action: AUDIT_ACTIONS.UPDATE_SAFETY,
|
|
before: beforeData,
|
|
after: afterData,
|
|
changes,
|
|
req,
|
|
});
|
|
}
|
|
|
|
req.flash("success_msg", "Safety updated successfully");
|
|
res.redirect("/admin/safety");
|
|
} catch (err) {
|
|
console.error("Update error:", err);
|
|
req.flash("error_msg", `Update error: ${err.message || "Unknown"}`);
|
|
res.redirect("/admin/safety");
|
|
}
|
|
};
|
|
|
|
// Xóa Safety
|
|
exports.delete = async (req, res) => {
|
|
try {
|
|
const safety = await Safety.findById(req.params.id);
|
|
if (!safety) {
|
|
req.flash("error_msg", "Safety record not found");
|
|
return res.redirect("/admin/safety");
|
|
}
|
|
await Safety.findByIdAndDelete(req.params.id);
|
|
req.flash("success_msg", "Safety record deleted successfully");
|
|
res.redirect("/admin/safety");
|
|
} catch (err) {
|
|
console.error("Delete error:", err);
|
|
req.flash("error_msg", `Delete error: ${err.message || "Unknown"}`);
|
|
res.redirect("/admin/safety");
|
|
}
|
|
};
|