Merge pull request 'fix/huy-04022026-fix-headermenu' (#19) from fix/huy-04022026-fix-headermenu into main

Reviewed-on: UKSOURCE/cms.hailearning.edu.vn#19
This commit is contained in:
2026-02-05 02:18:52 +00:00
4 changed files with 25 additions and 26 deletions

View File

@@ -42,8 +42,8 @@ const deleteRecursive = async (parentId) => {
} }
}; };
// 1. Render Menu Tab logic (called from Header index or directly if route allows) // 1. Render Menu Tab logic
exports.renderMenuTab = async (req, res) => { exports.index = async (req, res) => {
try { try {
const items = await HeaderMenu.find().sort({ order: 1 }); const items = await HeaderMenu.find().sort({ order: 1 });
const menuTree = buildMenuTree(items); const menuTree = buildMenuTree(items);
@@ -55,9 +55,9 @@ exports.renderMenuTab = async (req, res) => {
}; };
// 2. Create Menu Item // 2. Create Menu Item
exports.createMenu = async (req, res) => { exports.store = async (req, res) => {
try { try {
console.log('=== BACKEND: createMenu hit ==='); console.log('=== BACKEND: store hit ===');
console.log('Body:', req.body); console.log('Body:', req.body);
const { title, url, parentId, order, status, type } = req.body; const { title, url, parentId, order, status, type } = req.body;
const slug = slugify(title, { lower: true, strict: true }); const slug = slugify(title, { lower: true, strict: true });
@@ -84,10 +84,10 @@ exports.createMenu = async (req, res) => {
}; };
// 3. Update Menu Item // 3. Update Menu Item
exports.updateMenu = async (req, res) => { exports.update = async (req, res) => {
try { try {
const { id } = req.params; const { id } = req.params;
console.log('=== BACKEND: updateMenu hit ===', { id }); console.log('=== BACKEND: update hit ===', { id });
console.log('Body:', req.body); console.log('Body:', req.body);
const { title, url, parentId, order, status, type } = req.body; const { title, url, parentId, order, status, type } = req.body;
@@ -122,11 +122,11 @@ exports.updateMenu = async (req, res) => {
}; };
// 4. Delete Menu Item (Cascade delete children) // 4. Delete Menu Item (Cascade delete children)
exports.deleteMenu = async (req, res) => { exports.destroy = async (req, res) => {
try { try {
const { id } = req.body; const { id } = req.body;
const menuId = id || req.params.id; const menuId = id || req.params.id;
console.log('=== BACKEND: deleteMenu hit ===', { menuId, body: req.body }); console.log('=== BACKEND: destroy hit ===', { menuId, body: req.body });
await deleteRecursive(menuId); await deleteRecursive(menuId);
await HeaderMenu.findByIdAndDelete(menuId); await HeaderMenu.findByIdAndDelete(menuId);
@@ -142,7 +142,7 @@ exports.deleteMenu = async (req, res) => {
}; };
// 5. Reorder Menu // 5. Reorder Menu
exports.reorderMenu = async (req, res) => { exports.reorder = async (req, res) => {
try { try {
const { items } = req.body; // Array of { id, order, parentId } const { items } = req.body; // Array of { id, order, parentId }

View File

@@ -1,7 +1,7 @@
const Header = require("../models/header"); const Header = require("../models/header");
// Get all social links // Get all social links
exports.getAll = async (req, res) => { exports.index = async (req, res) => {
try { try {
const header = await Header.findOne({ status: "active" }).sort({ order: 1 }); const header = await Header.findOne({ status: "active" }).sort({ order: 1 });
@@ -262,7 +262,7 @@ exports.destroy = async (req, res) => {
}; };
// Bulk update social links (used for reordering and batch updates) // Bulk update social links (used for reordering and batch updates)
exports.bulkUpdate = async (req, res) => { exports.reorder = async (req, res) => {
try { try {
const { socialLinks } = req.body; const { socialLinks } = req.body;

View File

@@ -30,6 +30,7 @@ const headerMenuController = require("../controllers/headerMenuController");
const blogController = require("../controllers/blogController"); const blogController = require("../controllers/blogController");
const blogCategoryController = require("../controllers/blogCategoryController"); const blogCategoryController = require("../controllers/blogCategoryController");
const blogTagController = require("../controllers/blogTagController"); const blogTagController = require("../controllers/blogTagController");
const socialLinkController = require("../controllers/socialLinkController");
// Dashboard // Dashboard
router.get("/dashboard", ensureAuthenticated, dashboardController.getDashboard); router.get("/dashboard", ensureAuthenticated, dashboardController.getDashboard);
@@ -76,23 +77,25 @@ router.post("/upload/video", ensureAuthenticated, uploadVideo.single("video"), u
router.post("/upload/update-path", ensureAuthenticated, uploadController.updateImagePath); router.post("/upload/update-path", ensureAuthenticated, uploadController.updateImagePath);
router.post("/upload/delete", ensureAuthenticated, uploadController.deleteImage); router.post("/upload/delete", ensureAuthenticated, uploadController.deleteImage);
// Header routes
// Header routes // Header routes
router.get("/header", ensureAuthenticated, headerController.index); router.get("/header", ensureAuthenticated, headerController.index);
router.post("/header/update", ensureAuthenticated, headerController.update); router.post("/header/update", ensureAuthenticated, headerController.update);
router.post("/header/update-menu", ensureAuthenticated, headerController.updateMenu); router.get("/header/data", ensureAuthenticated, headerController.api); // Normalized from getHeaderData
router.get("/header/menu-tree", ensureAuthenticated, headerController.getMenuTree);
router.get("/header/programmes/:menuId", ensureAuthenticated, headerController.getProgrammesByMenuId);
router.get("/header/menu-item/:menuId", ensureAuthenticated, headerController.getMenuItem);
router.get("/header/data", ensureAuthenticated, headerController.getHeaderData);
router.patch("/header/:id/status", ensureAuthenticated, headerController.updateStatus); router.patch("/header/:id/status", ensureAuthenticated, headerController.updateStatus);
router.delete("/header/:id", ensureAuthenticated, headerController.destroy); router.delete("/header/:id", ensureAuthenticated, headerController.destroy);
// Header Menu INTEGRATED routes // Header Menu INTEGRATED routes
router.post("/header/menu/create", ensureAuthenticated, headerMenuController.createMenu); router.post("/header/menu/create", ensureAuthenticated, headerMenuController.store);
router.post("/header/menu/update/:id", ensureAuthenticated, headerMenuController.updateMenu); router.post("/header/menu/update/:id", ensureAuthenticated, headerMenuController.update);
router.post("/header/menu/delete", ensureAuthenticated, headerMenuController.deleteMenu); router.post("/header/menu/delete", ensureAuthenticated, headerMenuController.destroy);
router.post("/header/menu/reorder", ensureAuthenticated, headerMenuController.reorderMenu); router.post("/header/menu/reorder", ensureAuthenticated, headerMenuController.reorder);
// Social Links routes
router.get("/social-links", ensureAuthenticated, socialLinkController.index);
router.post("/social-links", ensureAuthenticated, socialLinkController.store);
router.put("/social-links/:platform", ensureAuthenticated, socialLinkController.update);
router.delete("/social-links/:platform", ensureAuthenticated, socialLinkController.destroy);
router.post("/social-links/reorder", ensureAuthenticated, socialLinkController.reorder);
// Footer routes // Footer routes
router.get("/footer", ensureAuthenticated, footerController.index); router.get("/footer", ensureAuthenticated, footerController.index);

View File

@@ -56,12 +56,8 @@ router.get("/api/menu-tree", headerController.getMenuTreeAPI);
router.get("/api/header-menu", headerMenuController.api); router.get("/api/header-menu", headerMenuController.api);
// Social Links API routes // Social Links API routes
router.get("/api/social-links", socialLinkController.getAll); router.get("/api/social-links", socialLinkController.index);
router.get("/api/social-links/:platform", socialLinkController.show); router.get("/api/social-links/:platform", socialLinkController.show);
router.post("/api/social-links", socialLinkController.store);
router.put("/api/social-links/:platform", socialLinkController.update);
router.delete("/api/social-links/:platform", socialLinkController.destroy);
router.post("/api/social-links/bulk-update", socialLinkController.bulkUpdate);
// Footer API route // Footer API route
router.get("/api/footer", footerController.api); router.get("/api/footer", footerController.api);