const { addBaseUrlToImages } = require("../utils/imageHelper"); const AboutUs = require("../models/aboutUs"); const jsonHelper = require("../utils/jsonHelper"); /** * GET /api/about * Lấy dữ liệu About Us (Public API cho website và CMS load dữ liệu) */ exports.getAbout = async (req, res) => { try { // Force no-cache headers res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); res.setHeader('Pragma', 'no-cache'); res.setHeader('Expires', '0'); const data = await AboutUs.getSingle(); const rawData = data.toObject(); const baseUrl = process.env.BACKEND_URL || `${req.protocol}://${req.get('host')}`; const processedData = addBaseUrlToImages(rawData, baseUrl); res.json(processedData); } catch (error) { console.error("Error getting about data:", error); res.status(500).json({ success: false, error: "Failed to get about data" }); } }; /** * PUT /api/about * Cập nhật dữ liệu About Us (Dùng cho AJAX từ CMS) */ exports.updateAbout = async (req, res) => { try { let updateData = req.body; // Nếu dữ liệu gửi qua trường aboutJson (dạng string JSON) if (updateData.aboutJson && typeof updateData.aboutJson === "string") { try { updateData = JSON.parse(updateData.aboutJson); } catch (e) { return res.status(400).json({ success: false, message: "Invalid JSON in aboutJson" }); } } const doc = await AboutUs.getSingle(); // Use .set() for better handling of nested objects/arrays in Mongoose doc.set(updateData); await doc.save(); // Fetch fresh data for syncing and returning const finalData = await AboutUs.findOne() .select('-_id -__v -createdAt -updatedAt') .lean(); // Update about.json file to keep it in sync jsonHelper.writeJsonFile("about", finalData); res.json({ success: true, message: "About Us updated successfully", data: finalData }); } catch (error) { console.error("Error updating about data:", error); res.status(500).json({ success: false, error: "Failed to update about data: " + error.message }); } }; /** * Render admin page (Dùng cho Admin UI) */ exports.index = async (req, res) => { try { const data = await AboutUs.getSingle(); const rawData = data.toObject(); const activeTab = req.query.activeTab || "hero"; res.render("admin/aboutUs/index", { layout: "layouts/main", title: "About Us Management", data: rawData, activeTab, user: req.session.user, currentPath: req.path, frontendUrl: process.env.FRONTEND_URL || 'http://localhost:3000' }); } catch (err) { console.error("Error in about index:", err); req.flash("error_msg", "Error loading About Us page"); res.redirect("/admin/dashboard"); } }; /** * Update method cho form-based submission (Admin UI - Post fallback) */ exports.update = async (req, res) => { try { let updateData = req.body; if (updateData.aboutJson && typeof updateData.aboutJson === "string") { try { updateData = JSON.parse(updateData.aboutJson); } catch (e) { req.flash("error_msg", "Invalid JSON data"); return res.redirect("/admin/about-us"); } } const doc = await AboutUs.getSingle(); doc.set(updateData); await doc.save(); const finalData = await AboutUs.findOne() .select('-_id -__v -createdAt -updatedAt') .lean(); jsonHelper.writeJsonFile("about", finalData); req.flash("success_msg", "About Us updated successfully"); const activeTab = req.query.activeTab || "hero"; res.redirect(`/admin/about-us?activeTab=${activeTab}`); } catch (err) { console.error("Update error:", err); req.flash("error_msg", "Error updating About Us: " + err.message); res.redirect("/admin/about-us"); } }; // Aliases for compatibility exports.api = exports.getAbout; exports.page = exports.getAbout; exports.updateAboutUs = exports.updateAbout;