forked from UKSOURCE/cms.hailearning.edu.vn
180 lines
4.9 KiB
JavaScript
180 lines
4.9 KiB
JavaScript
const AuditLog = require("../models/auditLog");
|
|
const User = require("../models/User");
|
|
|
|
// Display audit logs with pagination and filtering
|
|
exports.index = async (req, res) => {
|
|
try {
|
|
const page = parseInt(req.query.page) || 1;
|
|
const limit = parseInt(req.query.limit) || 8; // Default to 8, but allow override
|
|
const skip = (page - 1) * limit;
|
|
|
|
// Build filter query
|
|
const filter = {};
|
|
|
|
if (req.query.model) {
|
|
filter.model = req.query.model;
|
|
}
|
|
|
|
if (req.query.action) {
|
|
filter.action = req.query.action;
|
|
}
|
|
|
|
if (req.query.user) {
|
|
filter.performedBy = req.query.user;
|
|
}
|
|
|
|
if (req.query.dateFrom || req.query.dateTo) {
|
|
filter.createdAt = {};
|
|
if (req.query.dateFrom) {
|
|
filter.createdAt.$gte = new Date(req.query.dateFrom);
|
|
}
|
|
|
|
if (req.query.dateTo) {
|
|
const dateTo = new Date(req.query.dateTo);
|
|
dateTo.setHours(23, 59, 59, 999); // End of day
|
|
filter.createdAt.$lte = dateTo;
|
|
}
|
|
}
|
|
|
|
// Get audit logs with user population
|
|
const auditLogs = await AuditLog.find(filter)
|
|
.populate("performedBy", "username email")
|
|
.sort({ createdAt: -1 })
|
|
.skip(skip)
|
|
.limit(limit);
|
|
|
|
// Get total count for pagination
|
|
const totalCount = await AuditLog.countDocuments(filter);
|
|
const totalPages = Math.ceil(totalCount / limit);
|
|
|
|
// Get unique models and actions for filter dropdowns
|
|
const uniqueModels = await AuditLog.distinct("model");
|
|
const uniqueActions = await AuditLog.distinct("action");
|
|
const users = await User.find({}, "username email").sort({ username: 1 });
|
|
|
|
res.render("admin/audit-log/index", {
|
|
title: "Audit Logs",
|
|
layout: "layouts/admin",
|
|
auditLogs,
|
|
pagination: {
|
|
current: page,
|
|
total: totalPages,
|
|
limit,
|
|
totalCount,
|
|
},
|
|
query: req.query,
|
|
uniqueModels,
|
|
uniqueActions,
|
|
users,
|
|
currentPath: req.path,
|
|
user: req.session.user,
|
|
});
|
|
} catch (err) {
|
|
console.error("Error loading audit logs:", err);
|
|
req.flash("error_msg", "Error loading audit logs");
|
|
res.redirect("/admin/dashboard");
|
|
}
|
|
};
|
|
|
|
// Display single audit log details
|
|
exports.show = async (req, res) => {
|
|
try {
|
|
const auditLog = await AuditLog.findById(req.params.id).populate(
|
|
"performedBy",
|
|
"username email",
|
|
);
|
|
|
|
if (!auditLog) {
|
|
req.flash("error_msg", "Audit log not found");
|
|
return res.redirect("/admin/audit-logs");
|
|
}
|
|
|
|
res.render("admin/audit-log/show", {
|
|
title: "Audit Log Details",
|
|
layout: "layouts/admin",
|
|
auditLog,
|
|
currentPath: req.path,
|
|
user: req.session.user,
|
|
});
|
|
} catch (err) {
|
|
console.error("Error loading audit log:", err);
|
|
req.flash("error_msg", "Error loading audit log");
|
|
res.redirect("/admin/audit-logs");
|
|
}
|
|
};
|
|
|
|
// API endpoint to get audit logs (for AJAX requests)
|
|
exports.api = async (req, res) => {
|
|
try {
|
|
const page = parseInt(req.query.page) || 1;
|
|
const limit = parseInt(req.query.limit) || 7; // Default to 7, but allow override
|
|
const skip = (page - 1) * limit;
|
|
|
|
const filter = {};
|
|
|
|
if (req.query.model) filter.model = req.query.model;
|
|
if (req.query.action) filter.action = req.query.action;
|
|
if (req.query.user) filter.performedBy = req.query.user;
|
|
|
|
if (req.query.dateFrom || req.query.dateTo) {
|
|
filter.createdAt = {};
|
|
if (req.query.dateFrom) {
|
|
filter.createdAt.$gte = new Date(req.query.dateFrom);
|
|
}
|
|
if (req.query.dateTo) {
|
|
const dateTo = new Date(req.query.dateTo);
|
|
dateTo.setHours(23, 59, 59, 999);
|
|
filter.createdAt.$lte = dateTo;
|
|
}
|
|
}
|
|
|
|
const auditLogs = await AuditLog.find(filter)
|
|
.populate("performedBy", "username email")
|
|
.sort({ createdAt: -1 })
|
|
.skip(skip)
|
|
.limit(limit);
|
|
|
|
const totalCount = await AuditLog.countDocuments(filter);
|
|
|
|
res.json({
|
|
success: true,
|
|
data: auditLogs,
|
|
pagination: {
|
|
current: page,
|
|
total: Math.ceil(totalCount / limit),
|
|
limit,
|
|
totalCount,
|
|
},
|
|
});
|
|
} catch (err) {
|
|
console.error("API Error:", err);
|
|
res.status(500).json({
|
|
success: false,
|
|
error: "Error loading audit logs",
|
|
});
|
|
}
|
|
};
|
|
|
|
// Delete old audit logs (cleanup)
|
|
exports.cleanup = async (req, res) => {
|
|
try {
|
|
const daysToKeep = parseInt(req.body.days) || 90;
|
|
const cutoffDate = new Date();
|
|
cutoffDate.setDate(cutoffDate.getDate() - daysToKeep);
|
|
|
|
const result = await AuditLog.deleteMany({
|
|
createdAt: { $lt: cutoffDate },
|
|
});
|
|
|
|
req.flash(
|
|
"success_msg",
|
|
`Deleted ${result.deletedCount} old audit logs (older than ${daysToKeep} days)`,
|
|
);
|
|
res.redirect("/admin/audit-logs");
|
|
} catch (err) {
|
|
console.error("Error cleaning up audit logs:", err);
|
|
req.flash("error_msg", "Error cleaning up audit logs");
|
|
res.redirect("/admin/audit-logs");
|
|
}
|
|
};
|