From 83f55416508dab2130ad0378fee85ef42eda2b8d Mon Sep 17 00:00:00 2001 From: Yared Yemane Date: Tue, 14 Apr 2026 06:22:36 -0700 Subject: [PATCH] add course category deletion endpoint Expose delete support for top-level course categories and cascade removal of linked sub-categories/courses for content-management cleanup. Made-with: Cursor --- gen/db/compat_course_management.go | 15 +++++++++++++++ internal/web_server/handlers/hierarchy_handler.go | 13 +++++++++++++ internal/web_server/routes.go | 1 + 3 files changed, 29 insertions(+) diff --git a/gen/db/compat_course_management.go b/gen/db/compat_course_management.go index 8d3e78e..3b1d8cb 100644 --- a/gen/db/compat_course_management.go +++ b/gen/db/compat_course_management.go @@ -181,3 +181,18 @@ func (q *Queries) DeleteCourseSubCategoryCompat(ctx context.Context, subCategory _, err = q.db.Exec(ctx, `DELETE FROM course_sub_categories WHERE id = $1`, subCategoryID) return err } + +func (q *Queries) DeleteCourseCategoryCompat(ctx context.Context, categoryID int64) error { + _, err := q.db.Exec(ctx, `DELETE FROM courses WHERE category_id = $1`, categoryID) + if err != nil { + return err + } + + _, err = q.db.Exec(ctx, `DELETE FROM course_sub_categories WHERE category_id = $1`, categoryID) + if err != nil { + return err + } + + _, err = q.db.Exec(ctx, `DELETE FROM course_categories WHERE id = $1`, categoryID) + return err +} diff --git a/internal/web_server/handlers/hierarchy_handler.go b/internal/web_server/handlers/hierarchy_handler.go index abfa101..a9f5a41 100644 --- a/internal/web_server/handlers/hierarchy_handler.go +++ b/internal/web_server/handlers/hierarchy_handler.go @@ -219,6 +219,19 @@ func (h *Handler) CreateCourseCategory(c *fiber.Ctx) error { return c.Status(fiber.StatusCreated).JSON(domain.Response{Message: "Course category created", Data: created}) } +func (h *Handler) DeleteCourseCategory(c *fiber.Ctx) error { + categoryID, err := strconv.ParseInt(c.Params("categoryId"), 10, 64) + if err != nil || categoryID <= 0 { + return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{Message: "Invalid category ID", Error: "categoryId must be a positive integer"}) + } + + if err := h.analyticsDB.DeleteCourseCategoryCompat(c.Context(), categoryID); err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{Message: "Failed to delete category", Error: err.Error()}) + } + + return c.JSON(domain.Response{Message: "Course category deleted"}) +} + // CreateCourse godoc // @Summary Create course // @Description Legacy-compatible endpoint for creating a course diff --git a/internal/web_server/routes.go b/internal/web_server/routes.go index 15b1af7..3accf3e 100644 --- a/internal/web_server/routes.go +++ b/internal/web_server/routes.go @@ -81,6 +81,7 @@ func (a *App) initAppRoutes() { // Unified Course Management (single hierarchy model) groupV1.Get("/course-management/categories", a.authMiddleware, a.RequirePermission("learning_tree.get"), h.ListCourseCategories) groupV1.Post("/course-management/categories", a.authMiddleware, a.RequirePermission("course_categories.create"), h.CreateCourseCategory) + groupV1.Delete("/course-management/categories/:categoryId", a.authMiddleware, a.RequirePermission("course_categories.delete"), h.DeleteCourseCategory) groupV1.Post("/course-management/courses", a.authMiddleware, a.RequirePermission("courses.create"), h.CreateCourse) groupV1.Put("/course-management/courses/:courseId", a.authMiddleware, a.RequirePermission("courses.update"), h.UpdateCourse) groupV1.Delete("/course-management/courses/:courseId", a.authMiddleware, a.RequirePermission("courses.delete"), h.DeleteCourse)