feat(admin): implement unified submission and newsletter management

Introduce a centralized system to manage all website form submissions and newsletter subscriptions.
- Add `Submission` and `NewsletterSubscription` models with MongoDB schema validation
- Implement `submissionController` and `newsletterSubscriptionController` for CRUD operations and filtering
- Create a unified admin UI for reviewing submissions across different sources (home, request, contact, partnership, newsletter)
- Add database migration scripts for creating collections and indexes
- Refactor partnership inquiry forms to use a fixed field structure
- Update admin navigation and server CORS settings to support PATCH requests
This commit is contained in:
Tống Thành Đạt
2026-04-24 17:11:23 +07:00
parent caf38e8750
commit f6f2e0e03b
18 changed files with 1534 additions and 54 deletions
+23
View File
@@ -19,6 +19,8 @@ const formController = require("../controllers/formController");
const contactController = require("../controllers/contactController");
const studentSupportController = require("../controllers/studentSupportController");
const requestInfoController = require("../controllers/requestInfoController");
const submissionController = require("../controllers/submissionController");
const newsletterSubscriptionController = require("../controllers/newsletterSubscriptionController");
const pageController = require("../controllers/pageController");
const settingController = require("../controllers/settingController");
@@ -199,6 +201,27 @@ router.put(
contactController.updateSubmissionStatus,
);
// Unified submission management
router.get("/submissions", ensureAuthenticated, submissionController.index);
router.get("/submissions/data", ensureAuthenticated, submissionController.list);
router.get("/submissions/:id", ensureAuthenticated, submissionController.detail);
router.patch("/submissions/:id", ensureAuthenticated, submissionController.update);
router.get(
"/newsletter-subscriptions/data",
ensureAuthenticated,
newsletterSubscriptionController.list,
);
router.get(
"/newsletter-subscriptions/:id",
ensureAuthenticated,
newsletterSubscriptionController.detail,
);
router.patch(
"/newsletter-subscriptions/:id",
ensureAuthenticated,
newsletterSubscriptionController.update,
);
// Student Support (LAMS static page)
router.get(
"/student-support",
+4
View File
@@ -14,6 +14,8 @@ const footerController = require("../controllers/footerController");
const contactController = require("../controllers/contactController");
const studentSupportController = require("../controllers/studentSupportController");
const requestInfoController = require("../controllers/requestInfoController");
const submissionController = require("../controllers/submissionController");
const newsletterSubscriptionController = require("../controllers/newsletterSubscriptionController");
const headerMenuController = require("../controllers/headerMenuController");
const programmeController = require("../controllers/programmeController");
@@ -64,6 +66,8 @@ router.get("/api/request-info", requestInfoController.api);
// Contact form submission (public)
router.post("/api/contact/submit", contactController.submitForm);
router.post("/api/submissions", submissionController.create);
router.post("/api/newsletter/subscribe", newsletterSubscriptionController.subscribe);
// Blog API Routes
router.get("/api/blog", blogController.api);