forked from UKSOURCE/cms.hailearning.edu.vn
refactor(about): remove blog section and decouple from blog module
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
const { addBaseUrlToImages } = require("../utils/imageHelper");
|
||||
const AboutUs = require("../models/aboutUs");
|
||||
const Blog = require("../models/blog");
|
||||
const jsonHelper = require("../utils/jsonHelper");
|
||||
|
||||
/**
|
||||
@@ -9,22 +10,67 @@ const jsonHelper = require("../utils/jsonHelper");
|
||||
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');
|
||||
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')}`;
|
||||
// === Dynamic Blog News Section ===
|
||||
const news = rawData.news || {};
|
||||
let blogs = [];
|
||||
|
||||
// Nếu có chọn blog cụ thể
|
||||
if (news.selectedBlogIds && news.selectedBlogIds.length > 0) {
|
||||
blogs = await Blog.find({
|
||||
_id: { $in: news.selectedBlogIds },
|
||||
status: "published",
|
||||
}).lean();
|
||||
|
||||
// Sắp xếp theo thứ tự đã chọn trong selectedBlogIds
|
||||
blogs.sort((a, b) => {
|
||||
return news.selectedBlogIds.indexOf(a._id.toString()) - news.selectedBlogIds.indexOf(b._id.toString());
|
||||
});
|
||||
}
|
||||
|
||||
// Nếu không chọn hoặc chọn nhưng không đủ, lấy thêm 3 bài mới nhất
|
||||
if (blogs.length === 0) {
|
||||
blogs = await Blog.find({ status: "published" }).sort({ createdAt: -1 }).limit(3).lean();
|
||||
}
|
||||
|
||||
// Map dữ liệu blog sang format mà frontend mong đợi
|
||||
news.items = blogs.map((blog) => ({
|
||||
title: blog.title,
|
||||
category: blog.category && blog.category[0] ? blog.category[0] : "Visa",
|
||||
date:
|
||||
blog.publishedAt ||
|
||||
new Date(blog.createdAt).toLocaleDateString("en-GB", {
|
||||
day: "numeric",
|
||||
month: "long",
|
||||
year: "numeric",
|
||||
}),
|
||||
comments: blog.commentsCount || 0,
|
||||
author: {
|
||||
name: blog.author || "Admin",
|
||||
avatar: "/assets/img/home-1/news/client.png", // Default avatar
|
||||
},
|
||||
link: `/blog/${blog.slug}`,
|
||||
thumbnail: blog.featuredImage,
|
||||
}));
|
||||
|
||||
rawData.news = news;
|
||||
// ===============================
|
||||
|
||||
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"
|
||||
error: "Failed to get about data",
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -44,7 +90,7 @@ exports.updateAbout = async (req, res) => {
|
||||
} catch (e) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: "Invalid JSON in aboutJson"
|
||||
message: "Invalid JSON in aboutJson",
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -55,9 +101,7 @@ exports.updateAbout = async (req, res) => {
|
||||
await doc.save();
|
||||
|
||||
// Fetch fresh data for syncing and returning
|
||||
const finalData = await AboutUs.findOne()
|
||||
.select('-_id -__v -createdAt -updatedAt')
|
||||
.lean();
|
||||
const finalData = await AboutUs.findOne().select("-_id -__v -createdAt -updatedAt").lean();
|
||||
|
||||
// Update about.json file to keep it in sync
|
||||
jsonHelper.writeJsonFile("about", finalData);
|
||||
@@ -65,13 +109,13 @@ exports.updateAbout = async (req, res) => {
|
||||
res.json({
|
||||
success: true,
|
||||
message: "About Us updated successfully",
|
||||
data: finalData
|
||||
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
|
||||
error: "Failed to update about data: " + error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -84,15 +128,20 @@ exports.index = async (req, res) => {
|
||||
const data = await AboutUs.getSingle();
|
||||
const rawData = data.toObject();
|
||||
|
||||
// Lấy tất cả blog để chọn trong CMS
|
||||
const allBlogs = await Blog.find({ status: "published" }).sort({ createdAt: -1 }).lean();
|
||||
|
||||
const activeTab = req.query.activeTab || "hero";
|
||||
res.render("admin/aboutUs/index", {
|
||||
layout: "layouts/main",
|
||||
title: "About Us Management",
|
||||
data: rawData,
|
||||
allBlogs,
|
||||
activeTab,
|
||||
user: req.session.user,
|
||||
currentPath: req.path,
|
||||
frontendUrl: process.env.FRONTEND_URL || 'http://localhost:3000'
|
||||
frontendUrl: process.env.FRONTEND_URL || "http://localhost:3000",
|
||||
backendUrl: process.env.BACKEND_URL || "http://localhost:3001",
|
||||
});
|
||||
} catch (err) {
|
||||
console.error("Error in about index:", err);
|
||||
@@ -120,9 +169,7 @@ exports.update = async (req, res) => {
|
||||
doc.set(updateData);
|
||||
await doc.save();
|
||||
|
||||
const finalData = await AboutUs.findOne()
|
||||
.select('-_id -__v -createdAt -updatedAt')
|
||||
.lean();
|
||||
const finalData = await AboutUs.findOne().select("-_id -__v -createdAt -updatedAt").lean();
|
||||
jsonHelper.writeJsonFile("about", finalData);
|
||||
|
||||
req.flash("success_msg", "About Us updated successfully");
|
||||
|
||||
Reference in New Issue
Block a user