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
This commit is contained in:
Yared Yemane 2026-04-18 03:25:28 -07:00
parent 3e54b5039d
commit bbd919ca12
3 changed files with 54 additions and 2 deletions

View File

@ -89,6 +89,12 @@ WHERE sub_module_id = $1
AND is_active = TRUE AND is_active = TRUE
ORDER BY display_order ASC, id ASC; 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 -- name: GetSubModuleLessonByID :one
SELECT * SELECT *
FROM sub_module_lessons FROM sub_module_lessons

View File

@ -1469,6 +1469,46 @@ func (q *Queries) GetSubModuleLessons(ctx context.Context, subModuleID int64) ([
return items, nil 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 const GetSubModulePracticeByID = `-- name: GetSubModulePracticeByID :one
SELECT SELECT
smp.id, smp.id,

View File

@ -1817,11 +1817,12 @@ func (h *Handler) CreateSubModuleLesson(c *fiber.Ctx) error {
// GetSubModuleLessons godoc // GetSubModuleLessons godoc
// @Summary Get lessons under sub-module // @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 // @Tags course-management
// @Accept json // @Accept json
// @Produce json // @Produce json
// @Param subModuleId path int true "Sub-module ID" // @Param subModuleId path int true "Sub-module ID"
// @Param include_inactive query bool false "Include inactive lessons"
// @Success 200 {object} domain.Response // @Success 200 {object} domain.Response
// @Failure 400 {object} domain.ErrorResponse // @Failure 400 {object} domain.ErrorResponse
// @Failure 500 {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 { if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{ return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{
Message: "Failed to get sub-module lessons", Message: "Failed to get sub-module lessons",