forked from UKSOURCE/cms.lams
136 lines
3.3 KiB
JavaScript
136 lines
3.3 KiB
JavaScript
const Home = require("../models/home");
|
|
const { addBaseUrlToImages } = require("../utils/imageHelper");
|
|
|
|
// Helpers
|
|
const getHomeDoc = async () => Home.findOne().sort({ updatedAt: -1 });
|
|
const getHomeData = async () => (await getHomeDoc())?.toObject() || {};
|
|
|
|
const getDefaultHomeData = () => ({
|
|
hero: {
|
|
badge: "",
|
|
title: "",
|
|
description: "",
|
|
searchPlaceholder: "",
|
|
buttonLabel: "",
|
|
image: "",
|
|
imageAlt: "",
|
|
floatingBadge: {
|
|
icon: "",
|
|
value: "",
|
|
label: "",
|
|
},
|
|
},
|
|
quickLinks: [],
|
|
valueProp: {
|
|
badge: "",
|
|
title: "",
|
|
description: "",
|
|
features: [],
|
|
stats: [],
|
|
},
|
|
programs: {
|
|
heading: "",
|
|
description: "",
|
|
items: [],
|
|
},
|
|
requestInfo: {
|
|
heading: "",
|
|
description: "",
|
|
phone: "",
|
|
email: "",
|
|
programs: [],
|
|
},
|
|
});
|
|
|
|
// Admin: render management view with data from MongoDB
|
|
exports.index = async (req, res) => {
|
|
try {
|
|
let data = await getHomeData();
|
|
const defaults = getDefaultHomeData();
|
|
|
|
// Merge defaults for any missing sections
|
|
const sections = Object.keys(defaults);
|
|
sections.forEach((s) => {
|
|
data[s] = data[s] || defaults[s];
|
|
});
|
|
|
|
const frontendUrl = process.env.FRONTEND_URL || "";
|
|
|
|
return res.render("admin/home/index", {
|
|
layout: "layouts/main",
|
|
title: "Home Management",
|
|
data,
|
|
frontendUrl,
|
|
currentPath: req.path,
|
|
user: req.session.user,
|
|
});
|
|
} catch (err) {
|
|
console.error("Home index error:", err);
|
|
req.flash("error_msg", "Error loading home data");
|
|
return req.session.save(() => res.redirect("/admin/dashboard"));
|
|
}
|
|
};
|
|
|
|
// Admin: parse req.body sections and save to MongoDB
|
|
exports.update = async (req, res) => {
|
|
try {
|
|
const sections = [
|
|
"hero",
|
|
"quickLinks",
|
|
"valueProp",
|
|
"programs",
|
|
"requestInfo",
|
|
];
|
|
|
|
let doc = await getHomeDoc();
|
|
|
|
if (!doc) {
|
|
doc = new Home({});
|
|
}
|
|
|
|
let hasChanges = false;
|
|
|
|
for (const section of sections) {
|
|
if (req.body[section]) {
|
|
try {
|
|
const payload = JSON.parse(req.body[section]);
|
|
doc[section] = payload;
|
|
doc.markModified(section);
|
|
hasChanges = true;
|
|
} catch (e) {
|
|
console.error(`Invalid JSON for ${section}:`, e.message);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!hasChanges) {
|
|
req.flash("info_msg", "No changes were made");
|
|
return req.session.save(() => res.redirect("/admin/home"));
|
|
}
|
|
|
|
await doc.save();
|
|
|
|
req.flash("success_msg", "Home page configuration has been updated!");
|
|
return req.session.save(() => res.redirect("/admin/home"));
|
|
} catch (err) {
|
|
console.error("Home update error:", err);
|
|
req.flash("error_msg", `Update error: ${err.message}`);
|
|
return req.session.save(() => res.redirect("/admin/home"));
|
|
}
|
|
};
|
|
|
|
// Public API: return JSON data for frontend
|
|
exports.api = async (req, res) => {
|
|
try {
|
|
let data = await getHomeData();
|
|
if (!data || Object.keys(data).length === 0) {
|
|
data = getDefaultHomeData();
|
|
}
|
|
const baseUrl = process.env.BACKEND_URL || `${req.protocol}://${req.get("host")}`;
|
|
return res.json(addBaseUrlToImages(data, baseUrl));
|
|
} catch (err) {
|
|
console.error("Home API error:", err);
|
|
return res.status(500).json({ error: "Error loading home data" });
|
|
}
|
|
};
|