pushy

Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
2026-06-28 11:29:07 +08:00
parent 463a8d3978
commit 89acdfc239
67 changed files with 2736 additions and 306 deletions
+3 -1
View File
@@ -30,7 +30,8 @@ const groupsRoutes = require('./groups.routes');
const assetsRoutes = require('./assets.routes');
const coursesRoutes = require('./courses.routes');
const taskRoutes = require('./task.routes');
const tiersRoutes = require('./tiers.routes');
const tiersRoutes = require('./tiers.routes');
const tierCategoriesRoutes = require('./tier_categories.routes');
const categoriesRoutes = require('./categories.routes');
const productsRoutes = require('./products.routes');
const advertisementRoutes = require('./advertisements.routes');
@@ -49,6 +50,7 @@ router.use('/groups', groupsRoutes);
router.use('/assets', assetsRoutes);
router.use('/courses', coursesRoutes);
router.use('/task-lists', taskRoutes);
router.use('/tiers/categories', tierCategoriesRoutes);
router.use('/tiers', tiersRoutes);
router.use('/categories', categoriesRoutes);
router.use('/products', productsRoutes);
+1
View File
@@ -21,6 +21,7 @@ router.delete("/bulk", ctrl.bulkArchiveCourses);
router.get("/archives", ctrl.getArchivedCourses);
router.patch("/restore/bulk", ctrl.bulkRestoreCourses);
router.get("/flat", ctrl.getCoursesFlat);
router.get("/by-subscription", ctrl.getCoursesBySubscription);
router.get("/units-flat", ctrl.getUnitsFlat);
router.get("/lessons-flat", ctrl.getLessonsFlat);
+2 -1
View File
@@ -10,6 +10,7 @@ const router = require("express").Router();
const ctrl = require("../../controllers/admin/media.controller");
// Auth + requireAdmin are already applied by admin.routes.js before reaching here.
router.post("/token", ctrl.issueToken);
router.post("/token", ctrl.issueToken);
router.post("/tokens", ctrl.issueTokensBatch);
module.exports = router;
+14
View File
@@ -0,0 +1,14 @@
'use strict';
const router = require('express').Router();
const ctrl = require('../../controllers/admin/tier_categories.controller');
// Auth + requireAdmin applied by admin.routes.js
router.get ('/', ctrl.getCategories);
router.post ('/', ctrl.createCategory);
router.get ('/:id', ctrl.getCategory);
router.put ('/:id', ctrl.updateCategory);
router.delete('/:id', ctrl.deleteCategory);
module.exports = router;
+19
View File
@@ -0,0 +1,19 @@
const express = require('express');
const router = express.Router();
const ctrl = require('../../controllers/admin/tier_policies.controller');
// ─── Plan Policies ────────────────────────────────────────────────────────────
// GET /admin/tiers/plans/:planId/policy
// PUT /admin/tiers/plans/:planId/policy — JSON: { badge_asset_id, badge_label, access_rules, … }
router.get('/plans/:planId/policy', ctrl.getPlanPolicy);
router.put('/plans/:planId/policy', ctrl.upsertPlanPolicy);
// ─── System Badges ────────────────────────────────────────────────────────────
// GET /admin/tiers/system-badges
// GET /admin/tiers/system-badges/:key
// PUT /admin/tiers/system-badges/:key — JSON: { asset_id, label, active_from, active_until, … }
router.get('/system-badges', ctrl.getSystemBadges);
router.get('/system-badges/:key', ctrl.getSystemBadge);
router.put('/system-badges/:key', ctrl.upsertSystemBadge);
module.exports = router;
+7
View File
@@ -16,6 +16,13 @@ router.put('/:id', sensitiveOpsLimiter, usersCtrl.updateUser);
router.delete('/:id', sensitiveOpsLimiter, usersCtrl.deactivateUser);
router.post('/:id/restore', sensitiveOpsLimiter, usersCtrl.restoreUser);
// ── Bans ──────────────────────────────────────────────────────────────────────
router.post('/bulk/ban', sensitiveOpsLimiter, usersCtrl.bulkBanUsers);
router.post('/bulk/unban', sensitiveOpsLimiter, usersCtrl.bulkUnbanUsers);
router.get('/:id/bans', usersCtrl.getUserBans);
router.post('/:id/ban', sensitiveOpsLimiter, usersCtrl.banUser);
router.post('/:id/unban', sensitiveOpsLimiter, usersCtrl.unbanUser);
// ── Sessions ──────────────────────────────────────────────────────────────────
router.get('/:id/sessions', usersCtrl.getUserSessions);
router.delete('/:id/sessions/:sid', sensitiveOpsLimiter, usersCtrl.terminateSession);
+1 -1
View File
@@ -40,7 +40,7 @@ router.post('/register', ...registerValidator, validate, authCtrl.register);
router.post('/verify-otp', otpLimiter, ...verifyOTPValidator, validate, authCtrl.verifyOTP);
router.post('/resend-otp', otpLimiter, ...resendOTPValidator, validate, authCtrl.resendOTP);
router.post('/login', ...loginValidator, validate, authCtrl.login);
router.post('/refresh', authCtrl.refreshToken);
router.post('/refresh', authLimiter, authCtrl.refreshToken);
router.post('/logout', authenticate, authLimiter, authCtrl.logout);
router.post('/change-password', authenticate, sensitiveOpsLimiter, ...changePassValidator, validate, authCtrl.changePassword);
+2
View File
@@ -6,6 +6,7 @@
* Route Map:
* GET /api/client/profile → view own profile
* PUT /api/client/profile → update own profile
* DELETE /api/client/profile → delete own account (soft-delete)
* GET /api/client/sessions → view own active sessions
* DELETE /api/client/sessions/:id → revoke own session
*
@@ -48,6 +49,7 @@ router.use(authenticate, requireClient());
router.get('/profile', profileCtrl.getProfile);
router.put('/profile', ...updateProfileValidator, validate, profileCtrl.updateProfile);
router.delete('/profile', profileCtrl.deleteAccount);
router.post('/profile/avatar', handleAvatarUpload, profileCtrl.uploadAvatar);
router.delete('/profile/avatar', profileCtrl.deleteAvatar);
router.get('/sessions', profileCtrl.getSessions);
+2
View File
@@ -31,12 +31,14 @@ router.post('/:courseId/assessment/:assessmentId/start', ctrl.startCour
router.get( '/:courseId/assessment/:assessmentId/session', ctrl.getAssessmentSession);
router.patch('/:courseId/assessment/:assessmentId/draft', ctrl.saveDraft);
router.patch('/:courseId/units/:unitId/quiz/:quizId/draft', ctrl.saveQuizDraft);
router.post('/:courseId/units/:unitId/quiz/:quizId/submit', ctrl.submitUnitQuiz);
router.post('/:courseId/assessment/:assessmentId/submit', ctrl.submitCourseAssessment);
// Reading progress
router.get( '/:courseId/progress/summary', progressCtrl.getCourseProgressSummary);
router.get( '/:courseId/progress', progressCtrl.getCourseProgress);
router.get( '/:courseId/task-context', progressCtrl.getCourseTaskContext);
router.post('/:courseId/units/:unitId/lessons/:lessonId/progress', progressCtrl.upsertLessonProgress);
module.exports = router;
+5
View File
@@ -88,6 +88,11 @@ router.post(
sensitiveOpsLimiter,
progressController.visitLink
);
router.delete(
'/:groupId/task-lists/:taskListId/tasks/:taskId/requirements/:requirementId/visit',
sensitiveOpsLimiter,
progressController.unvisitLink
);
router.post(
'/:groupId/task-lists/:taskListId/tasks/:taskId/requirements/:requirementId/progress',
sensitiveOpsLimiter,
+6
View File
@@ -20,4 +20,10 @@ router.post('/checkout/refund', ctrl.refundOrder);
// My payments
router.get ('/me/payments', ctrl.getMyPayments);
// Tier categories (public — for course badge display)
router.get ('/categories', ctrl.getCategories);
// System badges (public read for profile display)
router.get ('/system-badges', ctrl.getSystemBadges);
module.exports = router;