From 47ab75f2647bf498ce68279950015cbc9b9181f6 Mon Sep 17 00:00:00 2001 From: silverpro89 Date: Wed, 25 Feb 2026 20:05:00 +0700 Subject: [PATCH] Update backend 2 --- controllers/contextController.js | 6 ++++-- controllers/lessonController.js | 8 ++++++++ models/Story.js | 5 +++++ routes/lessonRoutes.js | 34 ++++++++++++++++++++++++++++---- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/controllers/contextController.js b/controllers/contextController.js index 52c06e1..9effb1a 100644 --- a/controllers/contextController.js +++ b/controllers/contextController.js @@ -11,7 +11,7 @@ class ContextController { */ async createContext(req, res, next) { try { - const { title, desc, grade, type } = req.body; + const { title, desc, grade, type, type_image , reference_id } = req.body; // Validate required fields if (!title || !desc || !grade) { @@ -35,9 +35,11 @@ class ContextController { desc, grade: gradeNum, type: type || 'general', + type_image: type_image || null, status: 0, // Draft context: '', - knowledge: '' + knowledge: '', + reference_id: reference_id || null }); res.status(201).json({ diff --git a/controllers/lessonController.js b/controllers/lessonController.js index c82bb12..444d92f 100644 --- a/controllers/lessonController.js +++ b/controllers/lessonController.js @@ -17,6 +17,8 @@ class LessonController { is_published, is_free, lesson_type, + lesson_content_type, + chapter_id, search } = req.query; @@ -24,6 +26,9 @@ class LessonController { const where = {}; // Filters + if (chapter_id) { + where.chapter_id = chapter_id; + } if (is_published !== undefined) { where.is_published = is_published === 'true'; } @@ -33,6 +38,9 @@ class LessonController { if (lesson_type) { where.lesson_type = lesson_type; } + if (lesson_content_type) { + where.lesson_content_type = lesson_content_type; + } if (search) { where.lesson_title = { [Op.like]: `%${search}%` }; } diff --git a/models/Story.js b/models/Story.js index 916a106..c1f35ae 100644 --- a/models/Story.js +++ b/models/Story.js @@ -19,6 +19,11 @@ const Story = sequelize.define('stories', { allowNull: false, comment: 'Story title/name' }, + thumbnail: { + type: DataTypes.TEXT, + allowNull: true, + comment: 'URL to story thumbnail image' + }, logo: { type: DataTypes.TEXT, allowNull: true, diff --git a/routes/lessonRoutes.js b/routes/lessonRoutes.js index e4f7e9f..8c3aac1 100644 --- a/routes/lessonRoutes.js +++ b/routes/lessonRoutes.js @@ -51,6 +51,32 @@ const { authenticateToken } = require('../middleware/auth'); */ router.get('/', lessonController.getAllLessons); +/** + * @swagger + * /api/lessons/chapter/{chapter_id}: + * get: + * tags: [Lessons] + * summary: Lấy tất cả bài học trong một chapter + * parameters: + * - in: path + * name: chapter_id + * required: true + * schema: + * type: string + * format: uuid + * description: UUID của chapter + * - in: query + * name: include_unpublished + * schema: + * type: boolean + * default: false + * description: Bao gồm cả bài chưa publish + * responses: + * 200: + * description: Danh sách bài học trong chapter + */ +router.get('/chapter/:chapter_id', lessonController.getLessonsByChapter); + /** * @swagger * /api/lessons/{id}: @@ -138,7 +164,7 @@ router.get('/:id/games', lessonController.getMatchingGames); * 201: * description: Tạo bài học thành công */ -router.post('/', authenticateToken, lessonController.createLesson); +router.post('/', lessonController.createLesson); /** * @swagger @@ -165,7 +191,7 @@ router.post('/', authenticateToken, lessonController.createLesson); * 200: * description: Cập nhật thành công */ -router.put('/:id', authenticateToken, lessonController.updateLesson); +router.put('/:id', lessonController.updateLesson); /** * @swagger @@ -186,7 +212,7 @@ router.put('/:id', authenticateToken, lessonController.updateLesson); * 200: * description: Xóa thành công */ -router.delete('/:id', authenticateToken, lessonController.deleteLesson); +router.delete('/:id', lessonController.deleteLesson); /** * @swagger @@ -219,6 +245,6 @@ router.delete('/:id', authenticateToken, lessonController.deleteLesson); * 200: * description: Hoàn thành bài học */ -router.post('/:id/complete', authenticateToken, lessonController.completeLesson); +router.post('/:id/complete', lessonController.completeLesson); module.exports = router;