forked from UKSOURCE/cms.hailearning.edu.vn
feat: Implement admin management for FAQ, Testimonial, and Video Gallery sections with new controllers, views, and routing.
This commit is contained in:
103
controllers/testimonialController.js
Normal file
103
controllers/testimonialController.js
Normal file
@@ -0,0 +1,103 @@
|
||||
const { addBaseUrlToImages } = require("../utils/imageHelper");
|
||||
const Home = require("../models/home");
|
||||
|
||||
// Get testimonial data from Home model
|
||||
const getTestimonialData = async () => {
|
||||
const home = await Home.findOne().sort({ updatedAt: -1 });
|
||||
if (!home || !home.testimonials) {
|
||||
return null;
|
||||
}
|
||||
return home.testimonials.toObject ? home.testimonials.toObject() : home.testimonials;
|
||||
};
|
||||
|
||||
// API to get testimonial data
|
||||
exports.api = async (req, res) => {
|
||||
try {
|
||||
const testimonial = await getTestimonialData();
|
||||
if (!testimonial) {
|
||||
return res.status(404).json({ error: "Testimonial data not found" });
|
||||
}
|
||||
const baseUrl =
|
||||
process.env.BACKEND_URL || `${req.protocol}://${req.get("host")}`;
|
||||
const processedData = addBaseUrlToImages(testimonial, baseUrl);
|
||||
res.json(processedData);
|
||||
} catch (err) {
|
||||
console.error("API Error:", err);
|
||||
res.status(500).json({ error: "Error loading testimonial data" });
|
||||
}
|
||||
};
|
||||
|
||||
// Render admin view
|
||||
exports.index = async (req, res) => {
|
||||
try {
|
||||
const data = (await getTestimonialData()) || {
|
||||
heading: "Student Reviews & Testimonials",
|
||||
subheading: "What Our Students Say",
|
||||
videoUrl: "",
|
||||
videoThumbnail: "",
|
||||
items: [],
|
||||
};
|
||||
|
||||
const frontendUrl = process.env.FRONTEND_URL;
|
||||
|
||||
res.render("admin/home/testimonial/index", {
|
||||
title: "Testimonials Management",
|
||||
layout: "layouts/main",
|
||||
data,
|
||||
frontendUrl,
|
||||
currentPath: req.path,
|
||||
user: req.session.user,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error in testimonial index:", error);
|
||||
req.flash("error_msg", "An error occurred while loading the page");
|
||||
res.redirect("/admin/dashboard");
|
||||
}
|
||||
};
|
||||
|
||||
// Cập nhật dữ liệu testimonial (chỉ update phần testimonials của Home)
|
||||
exports.update = async (req, res) => {
|
||||
try {
|
||||
const { heading, subheading, videoUrl, videoThumbnail, items } = 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 itemsData = parseJson(items);
|
||||
|
||||
// Tìm hoặc tạo Home document
|
||||
let home = await Home.findOne().sort({ updatedAt: -1 });
|
||||
|
||||
if (!home) {
|
||||
home = new Home({});
|
||||
}
|
||||
|
||||
// Cập nhật chỉ phần testimonials
|
||||
home.testimonials = {
|
||||
heading: heading || "Student Reviews & Testimonials",
|
||||
subheading: subheading || "What Our Students Say",
|
||||
videoUrl: videoUrl || "",
|
||||
videoThumbnail: videoThumbnail || "",
|
||||
items: itemsData || [],
|
||||
};
|
||||
|
||||
await home.save();
|
||||
|
||||
req.flash("success_msg", "Testimonials updated successfully");
|
||||
res.redirect("/admin/home/testimonials");
|
||||
} catch (err) {
|
||||
console.error("Error updating testimonials:", err);
|
||||
req.flash("error_msg", err.message || "Error updating testimonials");
|
||||
res.redirect("/admin/home/testimonials");
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user