const { addBaseUrlToImages } = require("../utils/imageHelper"); const Contact = require("../models/contact"); // Get contact data from MongoDB const getContactData = async () => { const contact = await Contact.findOne({ name: "default" }); if (!contact) { return null; } return contact.toObject(); }; // API to get contact data exports.api = async (req, res) => { try { const contact = await getContactData(); if (!contact) { return res.status(404).json({ error: "Contact data not found" }); } const baseUrl = process.env.BACKEND_URL || `${req.protocol}://${req.get("host")}`; const processedData = addBaseUrlToImages(contact, baseUrl); res.json(processedData); } catch (err) { console.error("API Error:", err); res.status(500).json({ error: "Error loading contact data" }); } }; // API để lấy toàn bộ contact data exports.getContactData = async (req, res) => { try { const contactData = await getContactData(); if (!contactData) { return res.status(404).json({ error: "Contact data not found" }); } res.json(contactData); } catch (error) { console.error("Error getting contact data:", error); res.status(500).json({ error: "Error loading contact data" }); } }; // Render admin view exports.index = async (req, res) => { try { const data = (await getContactData()) || { hero: { title: "Contact Us", backgroundImage: "", overlayColor: "rgba(0, 0, 0, 0)", sectionClass: "", titleClass: "", enableScrollspy: false, backgroundPosition: "center", }, contactCards: [], map: { coordinates: { lat: 0, lng: 0 }, zoom: 15, location: "", markerTitle: "", tileLayer: { url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", attribution: "", maxZoom: 18, minZoom: 0, }, }, form: { sectionLabel: "", heading: "", fields: [], submitButton: { text: "Send Message" }, }, }; const frontendUrl = process.env.FRONTEND_URL || "http://localhost:3000"; res.render("admin/contact/index", { title: "Contact Management", layout: "layouts/main", data, frontendUrl, currentPath: req.path, user: req.session.user, }); } catch (error) { console.error("Error in contact index:", error); req.flash("error_msg", "An error occurred while loading the page"); res.redirect("/admin/dashboard"); } }; // Cập nhật dữ liệu contact exports.update = async (req, res) => { try { const { hero, contactCards, map, form } = req.body; // Parse JSON strings nếu cần 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 contactCardsData = parseJson(contactCards); const mapData = parseJson(map); const formData = parseJson(form); // Tìm hoặc tạo contact let contact = await Contact.findOne({ name: "default" }); if (!contact) { // Tạo mới với default values contact = new Contact({ name: "default", hero: heroData || { title: "Contact Us", backgroundImage: "", overlayColor: "rgba(0, 0, 0, 0)", sectionClass: "", titleClass: "", enableScrollspy: false, backgroundPosition: "center", }, contactCards: (contactCardsData || []).map((card) => ({ ...card, iconType: card.iconType || "", iconSource: card.iconSource || (card.iconType && card.iconType.startsWith('/uploads/') ? 'image' : 'fontawesome'), })), map: mapData || { coordinates: { lat: 0, lng: 0 }, zoom: 15, location: "", markerTitle: "", tileLayer: { url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", attribution: "", maxZoom: 18, minZoom: 0, }, }, form: formData || { sectionLabel: "", heading: "", fields: [], submitButton: { text: "Send Message" }, }, }); } else { // Cập nhật dữ liệu if (heroData) contact.hero = heroData; if (contactCardsData && Array.isArray(contactCardsData)) { // Đảm bảo mỗi card có iconType và iconSource contact.contactCards = contactCardsData.map((card) => ({ ...card, iconType: card.iconType || "", iconSource: card.iconSource || (card.iconType && card.iconType.startsWith('/uploads/') ? 'image' : 'fontawesome'), })); } if (mapData) contact.map = mapData; if (formData) contact.form = formData; } await contact.save(); req.flash("success_msg", "Contact updated successfully"); res.redirect("/admin/contact"); } catch (err) { console.error("Error updating contact:", err); req.flash("error_msg", err.message || "Error updating contact"); res.redirect("/admin/contact"); } };