퀴즈 풀기/점수
This commit is contained in:
426
internal/controllers/paper.go
Normal file
426
internal/controllers/paper.go
Normal file
@ -0,0 +1,426 @@
|
||||
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/go-cmp/cmp"
|
||||
"gorm.io/datatypes"
|
||||
)
|
||||
|
||||
type PaperController interface {
|
||||
List(*gin.Context)
|
||||
Find(*gin.Context)
|
||||
Start(*gin.Context)
|
||||
Finish(*gin.Context)
|
||||
|
||||
QuizList(*gin.Context)
|
||||
QuizFind(*gin.Context)
|
||||
QuizAnswer(*gin.Context)
|
||||
}
|
||||
|
||||
type paperController struct {
|
||||
service services.PaperService
|
||||
paperQuizService services.PaperQuizService
|
||||
userService services.UserService
|
||||
quizService services.QuizService
|
||||
quizPaperService services.QuizPaperService
|
||||
userQuizService services.UserQuizService
|
||||
}
|
||||
|
||||
func NewPaperController(
|
||||
service services.PaperService,
|
||||
paperQuizService services.PaperQuizService,
|
||||
quizService services.QuizService,
|
||||
quizPaperService services.QuizPaperService,
|
||||
userService services.UserService,
|
||||
userQuizServie services.UserQuizService,
|
||||
) PaperController {
|
||||
return &paperController{
|
||||
service: service,
|
||||
paperQuizService: paperQuizService,
|
||||
userService: userService,
|
||||
quizService: quizService,
|
||||
quizPaperService: quizPaperService,
|
||||
userQuizService: userQuizServie,
|
||||
}
|
||||
}
|
||||
|
||||
// Paper List
|
||||
//
|
||||
// @Summary 목록 가져오기
|
||||
// @Description 목록을 가져옵니다.
|
||||
// @Tags 페이퍼
|
||||
//
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
//
|
||||
// @Security Bearer
|
||||
//
|
||||
// @Param q query string false "검색어"
|
||||
// @Param page query int false "페이지"
|
||||
// @Param limit query int false "페이지 사이즈"
|
||||
//
|
||||
// @Success 200 {object} models.PaperListResponse
|
||||
// @Router /paper [get]
|
||||
func (controller *paperController) List(c *gin.Context) {
|
||||
q := c.DefaultQuery("q", "")
|
||||
page, err := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
limit, err := strconv.Atoi(c.DefaultQuery("limit", "10"))
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
user_id := c.GetInt64("sub")
|
||||
result, err := controller.service.List(user_id, q, page, limit)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
totalNumber, err := controller.service.Total(user_id, q)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
totalPage := int64(totalNumber/int64(limit) + 1)
|
||||
|
||||
response := models.PaperListResponse{
|
||||
Data: *result,
|
||||
Total: totalNumber,
|
||||
Page: page,
|
||||
TotalPage: totalPage,
|
||||
PageSize: limit,
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, response)
|
||||
}
|
||||
|
||||
// Get paper
|
||||
//
|
||||
// @Summary 페이퍼 정보 가져오기
|
||||
// @Description ID로 페이퍼 정보를 가져옵니다.
|
||||
// @Tags 페이퍼
|
||||
//
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
//
|
||||
// @Security Bearer
|
||||
//
|
||||
// @Param paper_id path int64 true "Paper ID"
|
||||
//
|
||||
// @Success 200 {object} models.PaperResponse
|
||||
// @Router /paper/{paper_id} [get]
|
||||
func (controller *paperController) Find(c *gin.Context) {
|
||||
paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
result, err := controller.service.Find(paper_id)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, result)
|
||||
}
|
||||
|
||||
// Start Paper
|
||||
//
|
||||
// @Summary 퀴즈 시작
|
||||
// @Description 퀴즈 시작합니다.
|
||||
// @Tags 페이퍼
|
||||
//
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
//
|
||||
// @Security Bearer
|
||||
//
|
||||
// @Param paper_id path int64 true "Paper ID"
|
||||
//
|
||||
// @Success 200 {object} models.Paper
|
||||
// @Router /paper/{paper_id}/start [patch]
|
||||
func (controller *paperController) Start(c *gin.Context) {
|
||||
paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
paper, err := controller.service.Get(paper_id)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
if paper.Status != "ready" {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "퀴즈를 시작할 수 없습니다."})
|
||||
return
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
paper.Status = "start"
|
||||
paper.StartAt = &now
|
||||
|
||||
result, err := controller.service.Update(paper)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, result)
|
||||
}
|
||||
|
||||
// Finish Paper
|
||||
//
|
||||
// @Summary 퀴즈 종료
|
||||
// @Description 퀴즈 종료합니다.
|
||||
// @Tags 페이퍼
|
||||
//
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
//
|
||||
// @Security Bearer
|
||||
//
|
||||
// @Param paper_id path int64 true "Paper ID"
|
||||
//
|
||||
// @Success 200 {object} models.Paper
|
||||
// @Router /paper/{paper_id}/finish [patch]
|
||||
func (controller *paperController) Finish(c *gin.Context) {
|
||||
paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
paper, err := controller.service.Get(paper_id)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
if paper.Status != "start" {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "퀴즈를 종료할 수 없습니다."})
|
||||
return
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
paper.Status = "finish"
|
||||
paper.DoneAt = &now
|
||||
|
||||
result, err := controller.service.Update(paper)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, result)
|
||||
}
|
||||
|
||||
// Quiz List
|
||||
//
|
||||
// @Summary 퀴즈페이퍼 퀴즈 목록 가져오기
|
||||
// @Description 퀴즈페이퍼 퀴즈 목록을 가져옵니다.
|
||||
// @Tags 페이퍼
|
||||
//
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
//
|
||||
// @Security Bearer
|
||||
//
|
||||
// @Param paper_id path int64 true "퀴즈페이퍼 ID"
|
||||
// @Param page query int false "페이지"
|
||||
// @Param limit query int false "페이지 사이즈"
|
||||
//
|
||||
// @Success 200 {object} models.UserQuizListResponse
|
||||
// @Router /paper/{paper_id}/quiz [get]
|
||||
func (controller *paperController) QuizList(c *gin.Context) {
|
||||
paper_id, err := strconv.ParseInt(c.Param("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.paperQuizService.List(paper_id, page, limit)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
totalNumber, err := controller.paperQuizService.Total(paper_id)
|
||||
if err != nil {
|
||||
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 Quiz
|
||||
//
|
||||
// @Summary 퀴즈페이퍼 퀴즈 가져오기
|
||||
// @Description ID로 퀴즈를 가져옵니다.
|
||||
// @Tags 페이퍼
|
||||
//
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
//
|
||||
// @Security Bearer
|
||||
//
|
||||
// @Param paper_id path string true "Paper ID"
|
||||
// @Param quiz_id path string true "사용자퀴즈 ID"
|
||||
//
|
||||
// @Success 200 {object} models.UserQuizResponse
|
||||
// @Router /paper/{paper_id}/quiz/{quiz_id} [get]
|
||||
func (controller *paperController) QuizFind(c *gin.Context) {
|
||||
paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
quiz_id, err := strconv.ParseInt(c.Param("quiz_id"), 10, 64)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
result, err := controller.paperQuizService.Find(quiz_id)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
if paper_id != result.UserQuizPaperID {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "퀴즈시트와 퀴즈가 일치하지 않습니다."})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, result)
|
||||
}
|
||||
|
||||
// Answer Quiz
|
||||
//
|
||||
// @Summary 퀴즈 답변
|
||||
// @Description 퀴즈 답변을 제출합니다..
|
||||
// @Tags 페이퍼
|
||||
//
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
//
|
||||
// @Security Bearer
|
||||
//
|
||||
// @Param paper_id path int64 true "Paper ID"
|
||||
// @Param quiz_id path int64 true "Quiz ID"
|
||||
// @Param quizBody body models.AnswerQuizRequest true "Answer Body"
|
||||
//
|
||||
// @Router /paper/{paper_id}/quiz/{quiz_id}/answer [patch]
|
||||
func (controller *paperController) QuizAnswer(c *gin.Context) {
|
||||
paper_id, err := strconv.ParseInt(c.Param("paper_id"), 10, 64)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
id, err := strconv.ParseInt(c.Param("quiz_id"), 10, 64)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
var request models.AnswerQuizRequest
|
||||
if err := c.ShouldBindJSON(&request); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
userquiz, err := controller.userQuizService.Find(id)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
if paper_id != userquiz.UserQuizPaperID {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "퀴즈시트와 퀴즈가 일치하지 않습니다."})
|
||||
return
|
||||
}
|
||||
|
||||
user_id := c.GetInt64("sub")
|
||||
if user_id != userquiz.UserID {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Wrong user"})
|
||||
return
|
||||
}
|
||||
|
||||
if userquiz.Status != "ready" {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Answered"})
|
||||
return
|
||||
}
|
||||
|
||||
quiz, err := controller.quizService.Find(userquiz.QuizID)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
var userAnswer datatypes.JSON
|
||||
userAnswer, err = json.Marshal(request.Answer)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
isCorrect := cmp.Equal(quiz.Answer.String(), userAnswer.String())
|
||||
var score float32 = 0.0
|
||||
var correction string = "wrong"
|
||||
if isCorrect {
|
||||
score = 1.0
|
||||
correction = "correct"
|
||||
}
|
||||
|
||||
userquiz.Answer = userAnswer
|
||||
userquiz.Status = "answer"
|
||||
userquiz.Result = correction
|
||||
userquiz.Score = score
|
||||
|
||||
_, err = controller.userQuizService.Update(userquiz)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
_, err = controller.service.UpdateScore(userquiz.UserQuizPaperID)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "success"})
|
||||
}
|
@ -11,6 +11,7 @@ import (
|
||||
"learnsteam/cslms-api/internal/services"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/google/uuid"
|
||||
"gorm.io/datatypes"
|
||||
)
|
||||
@ -20,15 +21,20 @@ type UserQuizController interface {
|
||||
Find(*gin.Context)
|
||||
Create(*gin.Context)
|
||||
Update(*gin.Context)
|
||||
Answer(*gin.Context)
|
||||
}
|
||||
|
||||
type userQuizController struct {
|
||||
service services.UserQuizService
|
||||
service services.UserQuizService
|
||||
quizService services.QuizService
|
||||
userquizpaperService services.UserQuizPaperService
|
||||
}
|
||||
|
||||
func NewUserQuizController(service services.UserQuizService) UserQuizController {
|
||||
func NewUserQuizController(service services.UserQuizService, quizService services.QuizService, userquizpaperService services.UserQuizPaperService) UserQuizController {
|
||||
return &userQuizController{
|
||||
service: service,
|
||||
service: service,
|
||||
quizService: quizService,
|
||||
userquizpaperService: userquizpaperService,
|
||||
}
|
||||
}
|
||||
|
||||
@ -154,7 +160,7 @@ func (controller *userQuizController) Create(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
quiz := &models.UserQuiz{
|
||||
userquiz := &models.UserQuiz{
|
||||
GUID: uuid.NewString(),
|
||||
CenterID: request.CenterID,
|
||||
UserQuizPaperID: request.UserQuizPaperID,
|
||||
@ -168,7 +174,7 @@ func (controller *userQuizController) Create(c *gin.Context) {
|
||||
CreatedAt: time.Now(),
|
||||
}
|
||||
|
||||
result, err := controller.service.Create(quiz)
|
||||
result, err := controller.service.Create(userquiz)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
@ -212,18 +218,6 @@ func (controller *userQuizController) Update(c *gin.Context) {
|
||||
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 {
|
||||
@ -256,3 +250,91 @@ func (controller *userQuizController) Update(c *gin.Context) {
|
||||
|
||||
c.JSON(http.StatusOK, result)
|
||||
}
|
||||
|
||||
// Answer Quiz
|
||||
//
|
||||
// @Summary 사용자퀴즈 답변
|
||||
// @Description 사용자퀴즈 답변을 제출합니다..
|
||||
// @Tags 사용자퀴즈
|
||||
//
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
//
|
||||
// @Security Bearer
|
||||
//
|
||||
// @Param id path int64 true "Quiz ID"
|
||||
// @Param quizBody body models.AnswerQuizRequest true "Answer Body"
|
||||
//
|
||||
// @Router /userquiz/{id} [patch]
|
||||
func (controller *userQuizController) Answer(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.AnswerQuizRequest
|
||||
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
|
||||
}
|
||||
|
||||
user_id := c.GetInt64("sub")
|
||||
if user_id != userquiz.UserID {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Wrong user"})
|
||||
return
|
||||
}
|
||||
|
||||
if userquiz.Status != "ready" {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "Answered"})
|
||||
return
|
||||
}
|
||||
|
||||
quiz, err := controller.quizService.Find(userquiz.QuizID)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
var userAnswer datatypes.JSON
|
||||
userAnswer, err = json.Marshal(request.Answer)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
isCorrect := cmp.Equal(quiz.Answer.String(), userAnswer.String())
|
||||
var score float32 = 0.0
|
||||
var correction string = "wrong"
|
||||
if isCorrect {
|
||||
score = 1.0
|
||||
correction = "correct"
|
||||
}
|
||||
|
||||
userquiz.Answer = userAnswer
|
||||
userquiz.Status = "answer"
|
||||
userquiz.Result = correction
|
||||
userquiz.Score = score
|
||||
|
||||
_, err = controller.service.Update(userquiz)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
_, err = controller.userquizpaperService.UpdateScore(userquiz.UserQuizPaperID)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
// fmt.Println("userscore : ", result.UserScore)
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "success"})
|
||||
}
|
||||
|
Reference in New Issue
Block a user