feat: add programme module and blog integration

- Add Programme Mongoose model with sub-schemas and migrateFromJson static method
- Add programme CRUD controller with audit logging and icon sanitization
- Add programme admin views (index, edit) with tabbed form and dynamic arrays
- Add seed migration script for programmes
- Add /api/programmes and /api/programmes/:id public API endpoints
- Register programme routes in admin and public router
- Update dashboard with Programmes card and API endpoint entries
- Update admin sidebar layout to include Programmes nav link
This commit is contained in:
2026-04-20 18:40:29 +07:00
parent ac5fa14c97
commit 30b90051c9
12 changed files with 1311 additions and 2 deletions
+8
View File
@@ -26,6 +26,7 @@ const activityController = require("../controllers/activityController");
const bookingSubmissionController = require("../controllers/bookingSubmissionController");
const serviceController = require("../controllers/serviceController");
const headerMenuController = require("../controllers/headerMenuController");
const programmeController = require("../controllers/programmeController");
// Blog controllers
const blogController = require("../controllers/blogController");
@@ -523,6 +524,13 @@ router.delete(
ensureAuthenticated,
visaController.deleteCountry,
);
// Programme Management
router.get("/programme", ensureAuthenticated, programmeController.index);
router.get("/programme/edit/:id", ensureAuthenticated, programmeController.edit);
router.post("/programme/update/:id", ensureAuthenticated, upload.single('heroImage'), programmeController.update);
router.post("/programme/delete/:id", ensureAuthenticated, programmeController.delete);
// Blog routes
// Blog Management Routes
router.get("/blog", ensureAuthenticated, blogController.index);
+5
View File
@@ -15,6 +15,7 @@ const headerMenuController = require("../controllers/headerMenuController");
const safetyController = require("../controllers/safetyController");
// Booking flow removed
const programmeController = require("../controllers/programmeController");
const insuranceController = require("../controllers/insuranceController");
const termsController = require("../controllers/termsController"); // <-- IMPORT ĐÃ CÓ
const activityController = require("../controllers/activityController");
@@ -183,6 +184,10 @@ router.get("/api/service-slugs", serviceController.getServiceSlugs);
router.get("/api/visa", visaController.api);
router.get("/api/visa/country", visaController.apiCountries);
// Programmes API
router.get("/api/programmes", programmeController.api);
router.get("/api/programmes/:id", programmeController.apiDetail);
// Testimonials API
const testimonialController = require("../controllers/testimonialController");
router.get("/api/testimonials", testimonialController.api);