From 4ada90855550a7b873700ac6331b8305807bc834 Mon Sep 17 00:00:00 2001 From: Yared Yemane Date: Wed, 13 May 2026 03:43:50 -0700 Subject: [PATCH] Allow completion for existing practice sets. Treat existing PRACTICE sets as completable even when not published, while keeping sequence enforcement only for published practices. Co-authored-by: Cursor --- internal/web_server/handlers/questions.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/internal/web_server/handlers/questions.go b/internal/web_server/handlers/questions.go index 3141599..c693bbe 100644 --- a/internal/web_server/handlers/questions.go +++ b/internal/web_server/handlers/questions.go @@ -1563,15 +1563,18 @@ func (h *Handler) CompletePractice(c *fiber.Ctx) error { Error: setErr.Error(), }) } - if !strings.EqualFold(set.SetType, string(domain.QuestionSetTypePractice)) || !strings.EqualFold(set.Status, "PUBLISHED") { + if !strings.EqualFold(set.SetType, string(domain.QuestionSetTypePractice)) { return c.Status(fiber.StatusNotFound).JSON(domain.ErrorResponse{Message: "Practice not found"}) } - if err := h.enforcePracticeSequenceForStudent(c, set); err != nil { - return c.Status(fiber.StatusForbidden).JSON(domain.ErrorResponse{ - Message: "You must complete previous practices first", - Error: err.Error(), - }) + // Enforce sequential gating only for published practices. + if strings.EqualFold(set.Status, "PUBLISHED") { + if err := h.enforcePracticeSequenceForStudent(c, set); err != nil { + return c.Status(fiber.StatusForbidden).JSON(domain.ErrorResponse{ + Message: "You must complete previous practices first", + Error: err.Error(), + }) + } } if err := h.lmsProgressSvc.CompletePracticeForUser(c.Context(), userID, set.ID); err != nil {