114 lines
3.6 KiB
Go
114 lines
3.6 KiB
Go
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,
|
|
})
|
|
}
|