const { readJsonFile, writeJsonFile } = require('../utils/jsonHelper'); const slugify = require('slugify'); // Hiển thị tất cả các trang exports.getAllPages = async (req, res) => { try { const content = readJsonFile('content'); const pages = content.pages || []; res.render('admin/pages/index', { title: 'Quản lý trang', pages }); } catch (err) { console.error(err); req.flash('error_msg', 'Error loading page list'); res.redirect('/admin/dashboard'); } }; // Hiển thị form tạo trang mới exports.getAddPage = (req, res) => { res.render('admin/pages/add', { title: 'Thêm trang mới' }); }; // Xử lý tạo trang mới exports.addPage = async (req, res) => { try { const { title, content } = req.body; // Kiểm tra dữ liệu if (!title || !content) { req.flash('error_msg', 'Please fill in all required fields'); return res.redirect('/admin/pages/add'); } // Tạo slug từ tiêu đề const slug = slugify(title, { lower: true, strict: true, locale: 'vi' }); // Lấy dữ liệu hiện tại const contentData = readJsonFile('content'); const pages = contentData.pages || []; // Kiểm tra slug đã tồn tại chưa const existingPage = pages.find(page => page.slug === slug); if (existingPage) { req.flash('error_msg', 'This title is already in use. Please choose a different title.'); return res.redirect('/admin/pages/add'); } // Tạo trang mới const newPage = { id: Date.now().toString(), // Sử dụng timestamp làm ID title, slug, content, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }; // Thêm trang mới vào danh sách pages.push(newPage); contentData.pages = pages; // Lưu lại dữ liệu writeJsonFile('content', contentData); req.flash('success_msg', 'New page created successfully'); res.redirect('/admin/pages'); } catch (err) { console.error(err); req.flash('error_msg', 'Error creating new page'); res.redirect('/admin/pages/add'); } }; // Hiển thị form chỉnh sửa trang exports.getEditPage = async (req, res) => { try { const pageId = req.params.id; const contentData = readJsonFile('content'); const pages = contentData.pages || []; const page = pages.find(p => p.id === pageId); if (!page) { req.flash('error_msg', 'Page not found'); return res.redirect('/admin/pages'); } res.render('admin/pages/edit', { title: 'Chỉnh sửa trang', page }); } catch (err) { console.error(err); req.flash('error_msg', 'Error loading page'); res.redirect('/admin/pages'); } }; // Xử lý chỉnh sửa trang exports.updatePage = async (req, res) => { try { const pageId = req.params.id; const { title, content } = req.body; // Kiểm tra dữ liệu if (!title || !content) { req.flash('error_msg', 'Please fill in all required fields'); return res.redirect(`/admin/pages/edit/${pageId}`); } // Lấy dữ liệu hiện tại const contentData = readJsonFile('content'); const pages = contentData.pages || []; // Tìm trang cần cập nhật const pageIndex = pages.findIndex(p => p.id === pageId); if (pageIndex === -1) { req.flash('error_msg', 'Page not found'); return res.redirect('/admin/pages'); } const page = pages[pageIndex]; // Kiểm tra nếu tiêu đề thay đổi thì cập nhật slug let newSlug = page.slug; if (page.title !== title) { newSlug = slugify(title, { lower: true, strict: true, locale: 'vi' }); // Kiểm tra slug đã tồn tại chưa (trừ trang hiện tại) const existingPage = pages.find(p => p.slug === newSlug && p.id !== pageId); if (existingPage) { req.flash('error_msg', 'This title is already in use. Please choose a different title.'); return res.redirect(`/admin/pages/edit/${pageId}`); } } // Cập nhật thông tin trang pages[pageIndex] = { ...page, title, slug: newSlug, content, updatedAt: new Date().toISOString() }; // Lưu lại dữ liệu contentData.pages = pages; writeJsonFile('content', contentData); req.flash('success_msg', 'Page updated successfully'); res.redirect('/admin/pages'); } catch (err) { console.error(err); req.flash('error_msg', 'Error updating page'); res.redirect(`/admin/pages/edit/${req.params.id}`); } }; // Xử lý xóa trang exports.deletePage = async (req, res) => { try { const pageId = req.params.id; // Lấy dữ liệu hiện tại const contentData = readJsonFile('content'); const pages = contentData.pages || []; // Lọc bỏ trang cần xóa contentData.pages = pages.filter(p => p.id !== pageId); // Lưu lại dữ liệu writeJsonFile('content', contentData); req.flash('success_msg', 'Page deleted successfully'); res.redirect('/admin/pages'); } catch (err) { console.error(err); req.flash('error_msg', 'Error deleting page'); res.redirect('/admin/pages'); } }; // Hiển thị trang theo slug exports.getPageBySlug = async (req, res) => { try { const { slug } = req.params; // Lấy dữ liệu từ content.json const contentData = readJsonFile('content'); const pages = contentData.pages || []; // Tìm trang theo slug const page = pages.find(p => p.slug === slug); if (!page) { return res.status(404).render('page/not-found', { title: 'Page Not Found', message: 'The page you are looking for does not exist or has been deleted.' }); } // Hiển thị trang res.render('page/view', { title: page.title, page }); } catch (err) { console.error(err); res.status(500).render('page/error', { title: 'Error', message: 'An error occurred while loading the page. Please try again later.' }); } };