forked from UKSOURCE/cms.hailearning.edu.vn
first commit
This commit is contained in:
181
controllers/contactController.js
Normal file
181
controllers/contactController.js
Normal file
@@ -0,0 +1,181 @@
|
||||
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");
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user