183 lines
5.7 KiB
TypeScript
183 lines
5.7 KiB
TypeScript
/**
|
|
* Education Routes
|
|
* Course, lesson, and enrollment management
|
|
*/
|
|
|
|
import { Router, RequestHandler } from 'express';
|
|
import * as educationController from './controllers/education.controller';
|
|
import { requireAuth } from '../../core/guards/auth.guard';
|
|
|
|
const router = Router();
|
|
|
|
// Type cast helper for authenticated routes
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
const authHandler = (fn: Function): RequestHandler => fn as RequestHandler;
|
|
|
|
// ============================================================================
|
|
// Public Routes
|
|
// ============================================================================
|
|
|
|
/**
|
|
* GET /api/v1/education/categories
|
|
* Get all course categories
|
|
*/
|
|
router.get('/categories', educationController.getCategories);
|
|
|
|
/**
|
|
* GET /api/v1/education/courses
|
|
* List published courses with filters and pagination
|
|
* Query params: categoryId, level, isFree, search, minRating, page, pageSize, sortBy, sortOrder
|
|
*/
|
|
router.get('/courses', educationController.getCourses);
|
|
|
|
/**
|
|
* GET /api/v1/education/courses/popular
|
|
* Get popular courses
|
|
* Query params: limit
|
|
*/
|
|
router.get('/courses/popular', educationController.getPopularCourses);
|
|
|
|
/**
|
|
* GET /api/v1/education/courses/new
|
|
* Get newest courses
|
|
* Query params: limit
|
|
*/
|
|
router.get('/courses/new', educationController.getNewCourses);
|
|
|
|
/**
|
|
* GET /api/v1/education/courses/:courseId
|
|
* Get course by ID with full details
|
|
*/
|
|
router.get('/courses/:courseId', educationController.getCourseById);
|
|
|
|
/**
|
|
* GET /api/v1/education/courses/slug/:slug
|
|
* Get course by slug with full details
|
|
*/
|
|
router.get('/courses/slug/:slug', educationController.getCourseBySlug);
|
|
|
|
/**
|
|
* GET /api/v1/education/courses/:courseId/modules
|
|
* Get course modules with lessons
|
|
*/
|
|
router.get('/courses/:courseId/modules', educationController.getCourseModules);
|
|
|
|
/**
|
|
* GET /api/v1/education/courses/:courseId/stats
|
|
* Get course enrollment statistics
|
|
*/
|
|
router.get('/courses/:courseId/stats', educationController.getCourseStats);
|
|
|
|
/**
|
|
* GET /api/v1/education/modules/:moduleId/lessons
|
|
* Get module lessons
|
|
*/
|
|
router.get('/modules/:moduleId/lessons', educationController.getModuleLessons);
|
|
|
|
/**
|
|
* GET /api/v1/education/lessons/:lessonId
|
|
* Get lesson by ID
|
|
*/
|
|
router.get('/lessons/:lessonId', educationController.getLessonById);
|
|
|
|
// ============================================================================
|
|
// Authenticated User Routes
|
|
// ============================================================================
|
|
|
|
/**
|
|
* GET /api/v1/education/my/enrollments
|
|
* Get current user's course enrollments
|
|
*/
|
|
router.get('/my/enrollments', authHandler(requireAuth), authHandler(educationController.getMyEnrollments));
|
|
|
|
/**
|
|
* GET /api/v1/education/my/stats
|
|
* Get current user's learning statistics
|
|
*/
|
|
router.get('/my/stats', authHandler(requireAuth), authHandler(educationController.getMyLearningStats));
|
|
|
|
/**
|
|
* POST /api/v1/education/courses/:courseId/enroll
|
|
* Enroll in a free course
|
|
*/
|
|
router.post('/courses/:courseId/enroll', authHandler(requireAuth), authHandler(educationController.enrollInCourse));
|
|
|
|
/**
|
|
* GET /api/v1/education/courses/:courseId/enrollment
|
|
* Get enrollment status for a course
|
|
*/
|
|
router.get('/courses/:courseId/enrollment', authHandler(requireAuth), authHandler(educationController.getEnrollmentStatus));
|
|
|
|
/**
|
|
* POST /api/v1/education/lessons/:lessonId/progress
|
|
* Update lesson progress
|
|
* Body: { videoWatchedSeconds?, videoCompleted?, userNotes? }
|
|
*/
|
|
router.post('/lessons/:lessonId/progress', authHandler(requireAuth), authHandler(educationController.updateLessonProgress));
|
|
|
|
/**
|
|
* POST /api/v1/education/lessons/:lessonId/complete
|
|
* Mark lesson as complete
|
|
*/
|
|
router.post('/lessons/:lessonId/complete', authHandler(requireAuth), authHandler(educationController.markLessonComplete));
|
|
|
|
// ============================================================================
|
|
// Instructor/Admin Routes (Course Management)
|
|
// ============================================================================
|
|
|
|
/**
|
|
* POST /api/v1/education/categories
|
|
* Create a new category (admin only)
|
|
*/
|
|
router.post('/categories', authHandler(requireAuth), authHandler(educationController.createCategory));
|
|
|
|
/**
|
|
* POST /api/v1/education/courses
|
|
* Create a new course (instructor/admin)
|
|
*/
|
|
router.post('/courses', authHandler(requireAuth), authHandler(educationController.createCourse));
|
|
|
|
/**
|
|
* PATCH /api/v1/education/courses/:courseId
|
|
* Update course details
|
|
*/
|
|
router.patch('/courses/:courseId', authHandler(requireAuth), authHandler(educationController.updateCourse));
|
|
|
|
/**
|
|
* DELETE /api/v1/education/courses/:courseId
|
|
* Delete a course
|
|
*/
|
|
router.delete('/courses/:courseId', authHandler(requireAuth), authHandler(educationController.deleteCourse));
|
|
|
|
/**
|
|
* POST /api/v1/education/courses/:courseId/publish
|
|
* Publish a course
|
|
*/
|
|
router.post('/courses/:courseId/publish', authHandler(requireAuth), authHandler(educationController.publishCourse));
|
|
|
|
/**
|
|
* POST /api/v1/education/courses/:courseId/modules
|
|
* Create a module in a course
|
|
*/
|
|
router.post('/courses/:courseId/modules', authHandler(requireAuth), authHandler(educationController.createModule));
|
|
|
|
/**
|
|
* DELETE /api/v1/education/modules/:moduleId
|
|
* Delete a module
|
|
*/
|
|
router.delete('/modules/:moduleId', authHandler(requireAuth), authHandler(educationController.deleteModule));
|
|
|
|
/**
|
|
* POST /api/v1/education/modules/:moduleId/lessons
|
|
* Create a lesson in a module
|
|
*/
|
|
router.post('/modules/:moduleId/lessons', authHandler(requireAuth), authHandler(educationController.createLesson));
|
|
|
|
/**
|
|
* DELETE /api/v1/education/lessons/:lessonId
|
|
* Delete a lesson
|
|
*/
|
|
router.delete('/lessons/:lessonId', authHandler(requireAuth), authHandler(educationController.deleteLesson));
|
|
|
|
export { router as educationRouter };
|