From bbd919ca121948fe93e316168765f50ab1fe741d Mon Sep 17 00:00:00 2001 From: Yared Yemane Date: Sat, 18 Apr 2026 03:25:28 -0700 Subject: [PATCH] feat: optional include_inactive for sub-module lessons list GET .../sub-modules/:id/lessons?include_inactive=true returns all lessons; default remains active-only. Made-with: Cursor --- db/query/hierarchy.sql | 6 +++ gen/db/hierarchy.sql.go | 40 +++++++++++++++++++ .../web_server/handlers/hierarchy_handler.go | 10 ++++- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/db/query/hierarchy.sql b/db/query/hierarchy.sql index 81f85a3..a9956c9 100644 --- a/db/query/hierarchy.sql +++ b/db/query/hierarchy.sql @@ -89,6 +89,12 @@ WHERE sub_module_id = $1 AND is_active = TRUE ORDER BY display_order ASC, id ASC; +-- name: GetSubModuleLessonsAll :many +SELECT * +FROM sub_module_lessons +WHERE sub_module_id = $1 +ORDER BY display_order ASC, id ASC; + -- name: GetSubModuleLessonByID :one SELECT * FROM sub_module_lessons diff --git a/gen/db/hierarchy.sql.go b/gen/db/hierarchy.sql.go index 67b4de6..a48d1ac 100644 --- a/gen/db/hierarchy.sql.go +++ b/gen/db/hierarchy.sql.go @@ -1469,6 +1469,46 @@ func (q *Queries) GetSubModuleLessons(ctx context.Context, subModuleID int64) ([ return items, nil } +const GetSubModuleLessonsAll = `-- name: GetSubModuleLessonsAll :many +SELECT id, sub_module_id, display_order, is_active, created_at, title, description, thumbnail, teaching_text, teaching_image_url, teaching_audio_url, teaching_video_url +FROM sub_module_lessons +WHERE sub_module_id = $1 +ORDER BY display_order ASC, id ASC +` + +func (q *Queries) GetSubModuleLessonsAll(ctx context.Context, subModuleID int64) ([]SubModuleLesson, error) { + rows, err := q.db.Query(ctx, GetSubModuleLessonsAll, subModuleID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []SubModuleLesson + for rows.Next() { + var i SubModuleLesson + if err := rows.Scan( + &i.ID, + &i.SubModuleID, + &i.DisplayOrder, + &i.IsActive, + &i.CreatedAt, + &i.Title, + &i.Description, + &i.Thumbnail, + &i.TeachingText, + &i.TeachingImageUrl, + &i.TeachingAudioUrl, + &i.TeachingVideoUrl, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const GetSubModulePracticeByID = `-- name: GetSubModulePracticeByID :one SELECT smp.id, diff --git a/internal/web_server/handlers/hierarchy_handler.go b/internal/web_server/handlers/hierarchy_handler.go index 26a4468..0aa925d 100644 --- a/internal/web_server/handlers/hierarchy_handler.go +++ b/internal/web_server/handlers/hierarchy_handler.go @@ -1817,11 +1817,12 @@ func (h *Handler) CreateSubModuleLesson(c *fiber.Ctx) error { // GetSubModuleLessons godoc // @Summary Get lessons under sub-module -// @Description Returns all active lessons for a sub-module (teaching content metadata) +// @Description Returns lessons for a sub-module. By default only active lessons; pass include_inactive=true to include inactive rows (e.g. admin / CMS). // @Tags course-management // @Accept json // @Produce json // @Param subModuleId path int true "Sub-module ID" +// @Param include_inactive query bool false "Include inactive lessons" // @Success 200 {object} domain.Response // @Failure 400 {object} domain.ErrorResponse // @Failure 500 {object} domain.ErrorResponse @@ -1835,7 +1836,12 @@ func (h *Handler) GetSubModuleLessons(c *fiber.Ctx) error { }) } - lessons, err := h.analyticsDB.GetSubModuleLessons(c.Context(), subModuleID) + var lessons []dbgen.SubModuleLesson + if c.QueryBool("include_inactive", false) { + lessons, err = h.analyticsDB.GetSubModuleLessonsAll(c.Context(), subModuleID) + } else { + lessons, err = h.analyticsDB.GetSubModuleLessons(c.Context(), subModuleID) + } if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{ Message: "Failed to get sub-module lessons",