package controllers import ( "encoding/json" "fmt" "net/http" "strconv" "time" "learnsteam/cslms-api/internal/models" "learnsteam/cslms-api/internal/services" "github.com/gin-gonic/gin" "github.com/google/uuid" "gorm.io/datatypes" ) type UserQuizController interface { List(*gin.Context) Find(*gin.Context) Create(*gin.Context) Update(*gin.Context) } type userQuizController struct { service services.UserQuizService } func NewUserQuizController(service services.UserQuizService) UserQuizController { return &userQuizController{ service: service, } } // UserQuiz List // // @Summary 사용자퀴즈 목록 가져오기 // @Description 사용자퀴즈 목록을 가져옵니다. // @Tags 사용자퀴즈 // // @Accept json // @Produce json // // @Security Bearer // // @Param user_quiz_paper_id query string true "사용자퀴즈페이퍼 ID" // @Param q query string false "검색어" // @Param page query int false "페이지" // @Param limit query int false "페이지 사이즈" // // @Success 200 {object} models.UserQuizListResponse // @Router /userquiz [get] func (controller *userQuizController) List(c *gin.Context) { quiz_paper_id, err := strconv.ParseInt(c.DefaultQuery("user_quiz_paper_id", ""), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } page, err := strconv.Atoi(c.DefaultQuery("page", "1")) if err != nil { fmt.Println("error : page") c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } limit, err := strconv.Atoi(c.DefaultQuery("limit", "10")) if err != nil { fmt.Println("error : limit") c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } result, err := controller.service.List(quiz_paper_id, page, limit) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } totalNumber, err := controller.service.Total(quiz_paper_id) if err != nil { fmt.Println("error : list") c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } totalPage := int64(totalNumber/int64(limit) + 1) c.JSON(http.StatusOK, gin.H{"data": result, "total": totalNumber, "page": page, "totalPage": totalPage, "pageSize": limit}) } // Get UserQuiz // // @Summary 사용자퀴즈 가져오기 // @Description ID로 사용자퀴즈를 가져옵니다. // @Tags 사용자퀴즈 // // @Accept json // @Produce json // // @Security Bearer // // @Param id path string true "사용자퀴즈 ID" // // @Success 200 {object} models.UserQuizResponse // @Router /userquiz/{id} [get] func (controller *userQuizController) Find(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } result, err := controller.service.Find(id) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, result) } // Create Quiz // // @Summary 사용자퀴즈 생성 // @Description 사용자퀴즈를 만듭니다. // @Tags 사용자퀴즈 // // @Accept json // @Produce json // // @Security Bearer // // @Param quizBody body models.UserQuizRequest true "UserQuiz Body" // // @Success 200 {object} models.UserQuizResponse // @Router /userquiz [post] func (controller *userQuizController) Create(c *gin.Context) { var request models.UserQuizRequest if err := c.ShouldBindJSON(&request); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var content datatypes.JSON content, err := json.Marshal(request.Content) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var answer datatypes.JSON answer, err = json.Marshal([]string{}) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } quiz := &models.UserQuiz{ GUID: uuid.NewString(), CenterID: request.CenterID, UserQuizPaperID: request.UserQuizPaperID, No: request.No, QuizID: request.QuizID, QuestionType: request.QuestionType, Question: request.Question, Content: content, Answer: answer, UpdatedAt: time.Now(), CreatedAt: time.Now(), } result, err := controller.service.Create(quiz) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, result) } // Update Quiz // // @Summary 사용자퀴즈 수정 // @Description 사용자퀴즈를 수정합니다. // @Tags 사용자퀴즈 // // @Accept json // @Produce json // // @Security Bearer // // @Param id path int64 true "Quiz ID" // @Param quizBody body models.UserQuizRequest true "Quiz Body" // // @Success 200 {object} models.UserQuizResponse // @Router /userquiz/{id} [put] func (controller *userQuizController) Update(c *gin.Context) { id, err := strconv.ParseInt(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var request models.UserQuizRequest if err := c.ShouldBindJSON(&request); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } userquiz, err := controller.service.Find(id) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // CenterID int64 `json:"center_id" example:"1000001"` // UserQuizPaperID int64 `json:"quiz_paper_id" example:"1000001"` // UserID int64 `json:"user_id" example:"1000001"` // No int `json:"vol_no" example:"1"` // QuestionType string `json:"question_type" example:"choice"` // Question string `json:"question" example:"질문입니다."` // Content datatypes.JSON `json:"content"` // Answer datatypes.JSON `json:"answer"` // Status string `json:"status" example:"waiting"` // Result string `json:"result" example:"success"` // Score float32 `json:"score" example:"10"` var content datatypes.JSON content, err = json.Marshal(request.Content) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var answer datatypes.JSON answer, err = json.Marshal([]string{}) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } userquiz.CenterID = request.CenterID userquiz.UserQuizPaperID = request.UserQuizPaperID userquiz.No = request.No userquiz.QuestionType = request.QuestionType userquiz.Question = request.Question userquiz.Content = content userquiz.Answer = answer userquiz.Status = request.Status userquiz.Score = request.Score result, err := controller.service.Update(userquiz) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, result) }