package handlers import ( "Yimaru-Backend/internal/domain" "strconv" "github.com/gofiber/fiber/v2" ) // CreateAssessmentQuestion godoc // @Summary Create assessment question // @Description Creates a new assessment question with options or short answer depending on question type // @Tags assessment-question // @Accept json // @Produce json // @Param body body domain.CreateAssessmentQuestionInput true "Create question payload" // @Success 201 {object} domain.Response // @Failure 400 {object} domain.ErrorResponse // @Failure 500 {object} domain.ErrorResponse // @Router /api/v1/assessment/questions [post] func (h *Handler) CreateAssessmentQuestion(c *fiber.Ctx) error { var req domain.CreateAssessmentQuestionInput if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{ Message: "Invalid request body", Error: err.Error(), }) } // Basic validation if req.Title == "" { return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{ Message: "Validation error", Error: "title is required", }) } if err := h.assessmentSvc.CreateQuestion(c.Context(), req); err != nil { return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{ Message: "Failed to create assessment question", Error: err.Error(), }) } return c.Status(fiber.StatusCreated).JSON(domain.Response{ Message: "Assessment question created successfully", StatusCode: fiber.StatusCreated, Success: true, }) } // ListAssessmentQuestions godoc // @Summary List assessment questions // @Description Returns all active assessment questions with their options or answers // @Tags assessment-question // @Produce json // @Success 200 {array} domain.QuestionWithDetails // @Failure 500 {object} domain.ErrorResponse // @Router /api/v1/assessment/questions [get] func (h *Handler) ListAssessmentQuestions(c *fiber.Ctx) error { questions, err := h.assessmentSvc.ListQuestions(c.Context()) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{ Message: "Failed to fetch assessment questions", Error: err.Error(), }) } return c.Status(fiber.StatusOK).JSON(domain.Response{ Message: "Questions fetched successfully", Data: questions, Success: true, StatusCode: 200, }) } // GetAssessmentQuestionByID godoc // @Summary Get assessment question by ID // @Description Returns a single assessment question with its options or answer // @Tags assessment-question // @Produce json // @Param id path int true "Question ID" // @Success 200 {object} domain.QuestionWithDetails // @Failure 400 {object} domain.ErrorResponse // @Failure 404 {object} domain.ErrorResponse // @Failure 500 {object} domain.ErrorResponse // @Router /api/v1/assessment/questions/{id} [get] func (h *Handler) GetAssessmentQuestionByID(c *fiber.Ctx) error { idStr := c.Params("id") id, err := strconv.ParseInt(idStr, 10, 64) if err != nil || id <= 0 { return c.Status(fiber.StatusBadRequest).JSON(domain.ErrorResponse{ Message: "Invalid question ID", Error: "question ID must be a positive integer", }) } question, err := h.assessmentSvc.GetQuestionByID(c.Context(), id) if err != nil { // Adjust if you introduce a sentinel error (e.g. ErrQuestionNotFound) return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{ Message: "Failed to fetch assessment question", Error: err.Error(), }) } return c.Status(fiber.StatusOK).JSON(domain.Response{ Message: "Question fetched successfully", Data: question, Success: true, StatusCode: 200, }) }