first commit
This commit is contained in:
		
							
								
								
									
										122
									
								
								internal/controllers/auth.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								internal/controllers/auth.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,122 @@
 | 
			
		||||
package controllers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
	"learnsteam/cslms-api/internal/services"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type AuthController interface {
 | 
			
		||||
	Register(*gin.Context)
 | 
			
		||||
	Login(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type authController struct {
 | 
			
		||||
	service      services.AuthService
 | 
			
		||||
	tokenService services.TokenService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewAuthController(service services.AuthService, tokenService services.TokenService) AuthController {
 | 
			
		||||
	return &authController{
 | 
			
		||||
		service:      service,
 | 
			
		||||
		tokenService: tokenService,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Register
 | 
			
		||||
//
 | 
			
		||||
// @Summary     회원가입
 | 
			
		||||
// @Description  회원가입
 | 
			
		||||
// @Tags        회원가입
 | 
			
		||||
// @Accept      json
 | 
			
		||||
// @Produce      json
 | 
			
		||||
//
 | 
			
		||||
// @Param registerBody body models.RegisterRequest true "Register Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success      200    {object} models.RegisterResponse
 | 
			
		||||
// @Router        /auth/register [post]
 | 
			
		||||
func (controller *authController) Register(c *gin.Context) {
 | 
			
		||||
	var params models.RegisterRequest
 | 
			
		||||
	if c.BindJSON(¶ms) != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "bad request"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user, err := controller.service.Register(¶ms)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	token, err := controller.tokenService.Create(user.ID, user.UserRole)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"user": user, "token": token.Token, "refresh_token": token.RefreshToken})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Login 사용자 로그인
 | 
			
		||||
//
 | 
			
		||||
// @Summary       사용자 로그인 로그인
 | 
			
		||||
// @Description    사용자가 로그인합니다.
 | 
			
		||||
// @Tags          로그인
 | 
			
		||||
//
 | 
			
		||||
// @Accept        json
 | 
			
		||||
// @Produce        json
 | 
			
		||||
//
 | 
			
		||||
// @Param loginBody body models.LoginRequest true "Login Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success      200    {object} models.LoginResponse
 | 
			
		||||
// @Router        /auth/login [post]
 | 
			
		||||
func (controller *authController) Login(c *gin.Context) {
 | 
			
		||||
	var request models.LoginRequest
 | 
			
		||||
	if err := c.BindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user, err := controller.service.Login(&request)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	token, err := controller.tokenService.Create(user.ID, user.UserRole)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"user":          user,
 | 
			
		||||
		"token":         token.Token,
 | 
			
		||||
		"refresh_token": token.RefreshToken,
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Logout
 | 
			
		||||
func (controller *authController) Logout(c *gin.Context) {
 | 
			
		||||
	token := c.GetHeader("Authorization")
 | 
			
		||||
	if token == "" {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "bad request"})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := controller.tokenService.Delete(token)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	c.SetCookie("Authorization", "", -1, "/", "localhost", false, true)
 | 
			
		||||
	c.SetCookie("RefreshToken", "", -1, "/", "localhost", false, true)
 | 
			
		||||
	c.SetCookie("ExpiresAt", "", -1, "/", "localhost", false, true)
 | 
			
		||||
	c.SetCookie("RefreshExpiresAt", "", -1, "/", "localhost", false, true)
 | 
			
		||||
	c.SetCookie("RefreshTokenExpiresAt", "", -1, "/", "localhost", false, true)
 | 
			
		||||
	c.SetCookie("RefreshTokenExpiresAt", "", -1, "/", "localhost", false, true)
 | 
			
		||||
	c.SetCookie("RefreshTokenExpiresAt", "", -1, "/", "localhost", false, true)
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"message": "logout"})
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										220
									
								
								internal/controllers/center.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								internal/controllers/center.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,220 @@
 | 
			
		||||
package controllers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
	"learnsteam/cslms-api/internal/services"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"github.com/google/uuid"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CenterController interface {
 | 
			
		||||
	List(*gin.Context)
 | 
			
		||||
	Find(*gin.Context)
 | 
			
		||||
	Create(*gin.Context)
 | 
			
		||||
	Update(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type centerController struct {
 | 
			
		||||
	service      services.CenterService
 | 
			
		||||
	tokenService services.TokenService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewCenterController(service services.CenterService, tokenService services.TokenService) CenterController {
 | 
			
		||||
	return ¢erController{
 | 
			
		||||
		service:      service,
 | 
			
		||||
		tokenService: tokenService,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Center 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.CenterListResponse
 | 
			
		||||
// @Router /center  [get]
 | 
			
		||||
func (controller *centerController) List(c *gin.Context) {
 | 
			
		||||
	q := c.DefaultQuery("q", "")
 | 
			
		||||
	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(q, page, limit)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	totalNumber, err := controller.service.Total(q)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("error : list")
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	totalPage := int64(totalNumber/int64(limit) + 1)
 | 
			
		||||
 | 
			
		||||
	response := models.CenterListResponse{
 | 
			
		||||
		Data:      *result,
 | 
			
		||||
		Total:     totalPage,
 | 
			
		||||
		Page:      page,
 | 
			
		||||
		TotalPage: totalPage,
 | 
			
		||||
		PageSize:  limit,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, response)
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, response)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get Center
 | 
			
		||||
//
 | 
			
		||||
// @Summary 		센터 정보 가져오기
 | 
			
		||||
// @Description	ID로 센터 정보를 가져옵니다.
 | 
			
		||||
// @Tags        센터
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path string true "센터 ID"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.Center
 | 
			
		||||
// @Router /center/{id} [get]
 | 
			
		||||
func (controller *centerController) 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 Center
 | 
			
		||||
//
 | 
			
		||||
// @Summary 센터 생성
 | 
			
		||||
// @Description 센터를 만듭니다.
 | 
			
		||||
// @Tags    센터
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param quizBody body models.CenterRequest true "Center Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.Center
 | 
			
		||||
// @Router /quiz [post]
 | 
			
		||||
func (controller *centerController) Create(c *gin.Context) {
 | 
			
		||||
	var request models.CenterRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	center := &models.Center{
 | 
			
		||||
		GUID:      uuid.NewString(),
 | 
			
		||||
		Title:     request.Title,
 | 
			
		||||
		Name:      request.Name,
 | 
			
		||||
		OwnerID:   request.OwnerID,
 | 
			
		||||
		Content:   request.Content,
 | 
			
		||||
		Info:      request.Info,
 | 
			
		||||
		Memo:      request.Memo,
 | 
			
		||||
		Status:    request.Status,
 | 
			
		||||
		UpdatedAt: time.Now(),
 | 
			
		||||
		CreatedAt: time.Now(),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Create(center)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Update Center
 | 
			
		||||
//
 | 
			
		||||
// @Summary 센터 수정
 | 
			
		||||
// @Description 센터를 수정합니다.
 | 
			
		||||
// @Tags    센터
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path int64 true "Center ID"
 | 
			
		||||
// @Param centerBody body models.CenterRequest true "Center Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.Center
 | 
			
		||||
// @Router /center/{id} [put]
 | 
			
		||||
func (controller *centerController) 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.CenterRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	center, err := controller.service.Find(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	center.OwnerID = request.OwnerID
 | 
			
		||||
	center.Title = request.Title
 | 
			
		||||
	center.Name = request.Name
 | 
			
		||||
	center.Content = request.Content
 | 
			
		||||
	center.Info = request.Info
 | 
			
		||||
	center.Memo = request.Memo
 | 
			
		||||
	center.Status = request.Status
 | 
			
		||||
	center.UpdatedAt = time.Now()
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Update(center)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										243
									
								
								internal/controllers/quiz.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								internal/controllers/quiz.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,243 @@
 | 
			
		||||
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 QuizController interface {
 | 
			
		||||
	List(*gin.Context)
 | 
			
		||||
	Find(*gin.Context)
 | 
			
		||||
	Create(*gin.Context)
 | 
			
		||||
	Update(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type quizController struct {
 | 
			
		||||
	service services.QuizService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewQuizController(service services.QuizService) QuizController {
 | 
			
		||||
	return &quizController{
 | 
			
		||||
		service: service,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Quiz List
 | 
			
		||||
//
 | 
			
		||||
// @Summary     퀴즈 목록 가져오기
 | 
			
		||||
// @Description 퀴즈 목록을 가져옵니다.
 | 
			
		||||
// @Tags        퀴즈
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param 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.QuizListResponse
 | 
			
		||||
// @Router /quiz  [get]
 | 
			
		||||
func (controller *quizController) List(c *gin.Context) {
 | 
			
		||||
	quiz_paper_id, err := strconv.ParseInt(c.DefaultQuery("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 Quiz
 | 
			
		||||
//
 | 
			
		||||
// @Summary 퀴즈 가져오기
 | 
			
		||||
// @Description ID로 퀴즈를 가져옵니다.
 | 
			
		||||
// @Tags    퀴즈
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path string true "퀴즈 ID"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.QuizResponse
 | 
			
		||||
// @Router /quiz/{id} [get]
 | 
			
		||||
func (controller *quizController) 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.QuizRequest true "Quiz Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.QuizResponse
 | 
			
		||||
// @Router /quiz [post]
 | 
			
		||||
func (controller *quizController) Create(c *gin.Context) {
 | 
			
		||||
	var request models.QuizRequest
 | 
			
		||||
	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(request.Answer)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quiz := &models.Quiz{
 | 
			
		||||
		GUID:         uuid.NewString(),
 | 
			
		||||
		CenterID:     request.CenterID,
 | 
			
		||||
		QuizPaperID:  request.QuizPaperID,
 | 
			
		||||
		No:           request.No,
 | 
			
		||||
		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.QuizRequest true "Quiz Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.QuizResponse
 | 
			
		||||
// @Router /quiz/{id} [put]
 | 
			
		||||
func (controller *quizController) 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.QuizRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quiz, err := controller.service.Find(id)
 | 
			
		||||
	if 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(request.Answer)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quiz.QuizPaperID = request.QuizPaperID
 | 
			
		||||
	quiz.No = request.No
 | 
			
		||||
	quiz.QuestionType = request.QuestionType
 | 
			
		||||
	quiz.Question = request.Question
 | 
			
		||||
	quiz.Content = content
 | 
			
		||||
	quiz.Answer = answer
 | 
			
		||||
	quiz.UpdatedAt = time.Now()
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Update(quiz)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										314
									
								
								internal/controllers/quizpaper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										314
									
								
								internal/controllers/quizpaper.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,314 @@
 | 
			
		||||
package controllers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
	"learnsteam/cslms-api/internal/services"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	"github.com/google/uuid"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type QuizPaperController interface {
 | 
			
		||||
	List(*gin.Context)
 | 
			
		||||
	Find(*gin.Context)
 | 
			
		||||
	Create(*gin.Context)
 | 
			
		||||
	Update(*gin.Context)
 | 
			
		||||
	Copy(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type quizPaperController struct {
 | 
			
		||||
	service     services.QuizPaperService
 | 
			
		||||
	quizService services.QuizService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewQuizPaperController(service services.QuizPaperService, quizService services.QuizService) QuizPaperController {
 | 
			
		||||
	return &quizPaperController{
 | 
			
		||||
		service:     service,
 | 
			
		||||
		quizService: quizService,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// QuizPaper List
 | 
			
		||||
//
 | 
			
		||||
// @Summary			퀴즈페이퍼 목록 가져오기
 | 
			
		||||
// @Description	퀴즈페이퍼 목록을 가져옵니다.
 | 
			
		||||
// @Tags        퀴즈페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param tag query string false "태그"
 | 
			
		||||
// @Param q query string false "검색어"
 | 
			
		||||
// @Param page query int false "페이지"
 | 
			
		||||
// @Param limit query int false "페이지 사이즈"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.QuizPaperListResponse
 | 
			
		||||
// @Router /quizpaper  [get]
 | 
			
		||||
func (controller *quizPaperController) List(c *gin.Context) {
 | 
			
		||||
	tag := c.DefaultQuery("tag", "")
 | 
			
		||||
	q := c.DefaultQuery("q", "")
 | 
			
		||||
	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(q, tag, page, limit)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	totalNumber, err := controller.service.Total(q, tag)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("error : list")
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	totalPage := int64(totalNumber/int64(limit) + 1)
 | 
			
		||||
 | 
			
		||||
	response := models.QuizPaperListResponse{
 | 
			
		||||
		Data:      *result,
 | 
			
		||||
		Total:     totalPage,
 | 
			
		||||
		Page:      page,
 | 
			
		||||
		TotalPage: totalPage,
 | 
			
		||||
		PageSize:  limit,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, response)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get quizPaper
 | 
			
		||||
//
 | 
			
		||||
// @Summary 		퀴즈 퀴즈페이퍼 가져오기
 | 
			
		||||
// @Description	ID로 퀴즈 퀴즈페이퍼을 가져옵니다.
 | 
			
		||||
// @Tags        퀴즈페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path string true "퀴즈 퀴즈페이퍼 ID"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.QuizPaperResponse
 | 
			
		||||
// @Router /quizpaper/{id} [get]
 | 
			
		||||
func (controller *quizPaperController) 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 QuizPaper
 | 
			
		||||
//
 | 
			
		||||
// @Summary 		퀴즈 퀴즈페이퍼 생성
 | 
			
		||||
// @Description	퀴즈 퀴즈페이퍼을 만듭니다.
 | 
			
		||||
// @Tags        퀴즈페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param quizPaperBody body models.QuizPaperRequest true "QuizPaper Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.QuizPaperResponse
 | 
			
		||||
// @Router /quizpaper [post]
 | 
			
		||||
func (controller *quizPaperController) Create(c *gin.Context) {
 | 
			
		||||
	var request models.QuizPaperRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user_id := c.GetInt64("sub")
 | 
			
		||||
 | 
			
		||||
	quizPaper := &models.QuizPaper{
 | 
			
		||||
		GUID:      uuid.NewString(),
 | 
			
		||||
		CenterID:  request.CenterID,
 | 
			
		||||
		ManagerID: user_id,
 | 
			
		||||
		Title:     request.Title,
 | 
			
		||||
		Content:   request.Content,
 | 
			
		||||
		Category:  request.Category,
 | 
			
		||||
		Tag:       request.Tag,
 | 
			
		||||
		Status:    request.Status,
 | 
			
		||||
		CreatedAt: time.Now(),
 | 
			
		||||
		UpdatedAt: time.Now(),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Create(quizPaper)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Update QuizPaper
 | 
			
		||||
//
 | 
			
		||||
// @Summary			퀴즈 퀴즈페이퍼 수정
 | 
			
		||||
// @Description 퀴즈 퀴즈페이퍼을 수정합니다.
 | 
			
		||||
// @Tags        퀴즈페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path string true "퀴즈 퀴즈페이퍼 ID"
 | 
			
		||||
// @Param quizPaperUpdateBody body models.QuizPaperRequest true "QuizPaper Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.QuizPaperResponse
 | 
			
		||||
// @Router /quizpaper/{id} [put]
 | 
			
		||||
func (controller *quizPaperController) 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.QuizPaperRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quizPaper, err := controller.service.Find(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user_id := c.GetInt64("sub")
 | 
			
		||||
	quizPaper.ManagerID = user_id
 | 
			
		||||
	quizPaper.CenterID = request.CenterID
 | 
			
		||||
	quizPaper.Title = request.Title
 | 
			
		||||
	quizPaper.Content = request.Content
 | 
			
		||||
	quizPaper.Category = request.Category
 | 
			
		||||
	quizPaper.Tag = request.Tag
 | 
			
		||||
	quizPaper.Status = request.Status
 | 
			
		||||
	quizPaper.UpdatedAt = time.Now()
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Update(quizPaper)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Copy QuizPaper
 | 
			
		||||
//
 | 
			
		||||
// @Summary			퀴즈 퀴즈페이퍼 복사
 | 
			
		||||
// @Description 퀴즈 퀴즈페이퍼와 퀴즈를 복사합니다.
 | 
			
		||||
// @Tags        퀴즈페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path string true "퀴즈페이퍼 ID"
 | 
			
		||||
// @Param quizPaperCopyBody body models.QuizPaperCopyRequest true "QuizPaper Copy Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.QuizPaperCopyResponse
 | 
			
		||||
// @Router /quizpaper/{id}/copy [post]
 | 
			
		||||
func (controller *quizPaperController) Copy(c *gin.Context) {
 | 
			
		||||
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
 | 
			
		||||
	fmt.Println("id : ", c.Param("id"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("id convert err")
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var request models.QuizPaperCopyRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		fmt.Println("req err")
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user_id := c.GetInt64("sub")
 | 
			
		||||
	template, err := controller.service.Find(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newQuizPaper := &models.QuizPaper{
 | 
			
		||||
		GUID:      uuid.NewString(),
 | 
			
		||||
		CenterID:  request.CenterID,
 | 
			
		||||
		ManagerID: user_id,
 | 
			
		||||
		Title:     request.Title,
 | 
			
		||||
		Content:   template.Content,
 | 
			
		||||
		Category:  template.Category,
 | 
			
		||||
		Tag:       template.Tag,
 | 
			
		||||
		Status:    template.Status,
 | 
			
		||||
		CreatedAt: time.Now(),
 | 
			
		||||
		UpdatedAt: time.Now(),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quizPaper, err := controller.service.Create(newQuizPaper)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	quizTemplates, err := controller.quizService.List(id, 1, 10000)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// iterate quizTemplate
 | 
			
		||||
	var quizzes []*models.Quiz
 | 
			
		||||
	for _, quiz := range *quizTemplates {
 | 
			
		||||
		newQuiz := &models.Quiz{
 | 
			
		||||
			GUID:         uuid.NewString(),
 | 
			
		||||
			CenterID:     request.CenterID,
 | 
			
		||||
			QuizPaperID:  quizPaper.ID,
 | 
			
		||||
			No:           quiz.No,
 | 
			
		||||
			QuestionType: quiz.QuestionType,
 | 
			
		||||
			Question:     quiz.Question,
 | 
			
		||||
			Content:      quiz.Content,
 | 
			
		||||
			Answer:       quiz.Answer,
 | 
			
		||||
			UpdatedAt:    time.Now(),
 | 
			
		||||
			CreatedAt:    time.Now(),
 | 
			
		||||
		}
 | 
			
		||||
		result, err := controller.quizService.Create(newQuiz)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		quizzes = append(quizzes, result)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"quiz_paper": quizPaper, "quiz": quizzes})
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								internal/controllers/swagger.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								internal/controllers/swagger.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
package controllers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SwaggerController interface {
 | 
			
		||||
	Get(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type swaggerController struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewSwaggerController() SwaggerController {
 | 
			
		||||
	return &swaggerController{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (controller *swaggerController) Get(c *gin.Context) {
 | 
			
		||||
	c.Redirect(http.StatusFound, "/swagger/index.html")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								internal/controllers/token.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								internal/controllers/token.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
package controllers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
	"learnsteam/cslms-api/internal/services"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type TokenController interface {
 | 
			
		||||
	Refresh(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type tokenController struct {
 | 
			
		||||
	service services.TokenService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewTokenController(service services.TokenService) TokenController {
 | 
			
		||||
	return &tokenController{
 | 
			
		||||
		service: service,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Refresh Token
 | 
			
		||||
//
 | 
			
		||||
// @Summary 		AccessToken Refresh
 | 
			
		||||
// @Description	AccessToken을 RefreshToken으로 갱신합니다.
 | 
			
		||||
// @Tags 				Token
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Param refresh_token body string true "RefreshToken"
 | 
			
		||||
//
 | 
			
		||||
// @Router /token/refresh [post]
 | 
			
		||||
// @Success 200 {object} models.Token
 | 
			
		||||
func (controller *tokenController) Refresh(c *gin.Context) {
 | 
			
		||||
	var request models.RefreshTokenRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Refresh(request.RefreshToken)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										131
									
								
								internal/controllers/user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								internal/controllers/user.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,131 @@
 | 
			
		||||
package controllers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"learnsteam/cslms-api/internal/models"
 | 
			
		||||
	"learnsteam/cslms-api/internal/services"
 | 
			
		||||
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type UserController interface {
 | 
			
		||||
	List(*gin.Context)
 | 
			
		||||
	Find(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type userController struct {
 | 
			
		||||
	service      services.UserService
 | 
			
		||||
	tokenService services.TokenService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewUserController(service services.UserService, tokenService services.TokenService) UserController {
 | 
			
		||||
	return &userController{
 | 
			
		||||
		service:      service,
 | 
			
		||||
		tokenService: tokenService,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// User 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.UserListResponse
 | 
			
		||||
// @Router /user  [get]
 | 
			
		||||
func (controller *userController) List(c *gin.Context) {
 | 
			
		||||
	q := c.DefaultQuery("q", "")
 | 
			
		||||
	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(q, page, limit)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	totalNumber, err := controller.service.Total(q)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("error : list")
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	totalPage := int64(totalNumber/int64(limit) + 1)
 | 
			
		||||
 | 
			
		||||
	response := models.UserListResponse{
 | 
			
		||||
		Data:      *result,
 | 
			
		||||
		Total:     totalPage,
 | 
			
		||||
		Page:      page,
 | 
			
		||||
		TotalPage: totalPage,
 | 
			
		||||
		PageSize:  limit,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, response)
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, response)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get User
 | 
			
		||||
//
 | 
			
		||||
// @Summary 		사용자 정보 가져오기
 | 
			
		||||
// @Description	ID로 사용자 정보를 가져옵니다.
 | 
			
		||||
// @Tags        사용자
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path string true "사용자 ID"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.User
 | 
			
		||||
// @Router /user/{id} [get]
 | 
			
		||||
func (controller *userController) 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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sub := c.GetString("sub")
 | 
			
		||||
	user_id, err := strconv.ParseInt(sub, 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if user_id != id {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": "Wrong user"})
 | 
			
		||||
		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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										236
									
								
								internal/controllers/userquiz.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								internal/controllers/userquiz.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,236 @@
 | 
			
		||||
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) QuizController {
 | 
			
		||||
	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,
 | 
			
		||||
		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"`
 | 
			
		||||
 | 
			
		||||
	userquiz.CenterID = request.CenterID
 | 
			
		||||
	userquiz.UserQuizPaperID = request.UserQuizPaperID
 | 
			
		||||
 | 
			
		||||
	result, err := controller.service.Update(userquiz)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										331
									
								
								internal/controllers/userquizpaper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								internal/controllers/userquizpaper.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,331 @@
 | 
			
		||||
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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type UserQuizPaperController interface {
 | 
			
		||||
	List(*gin.Context)
 | 
			
		||||
	Find(*gin.Context)
 | 
			
		||||
	Create(*gin.Context)
 | 
			
		||||
	Update(*gin.Context)
 | 
			
		||||
	Patch(*gin.Context)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type userQuizPaperController struct {
 | 
			
		||||
	service          services.UserQuizPaperService
 | 
			
		||||
	userService      services.UserService
 | 
			
		||||
	quizPaperService services.QuizPaperService
 | 
			
		||||
	userQuizService  services.UserQuizService
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewUserQuizPaperController(
 | 
			
		||||
	service services.UserQuizPaperService,
 | 
			
		||||
	userService services.UserService,
 | 
			
		||||
	quizPaperService services.QuizPaperService,
 | 
			
		||||
	userQuizService services.UserQuizService,
 | 
			
		||||
) UserQuizPaperController {
 | 
			
		||||
	return &userQuizPaperController{
 | 
			
		||||
		service:          service,
 | 
			
		||||
		userService:      userService,
 | 
			
		||||
		quizPaperService: quizPaperService,
 | 
			
		||||
		userQuizService:  userQuizService,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UserQuizPaper 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.UserQuizPaperListResponse
 | 
			
		||||
// @Router /userquizpaper  [get]
 | 
			
		||||
func (controller *userQuizPaperController) List(c *gin.Context) {
 | 
			
		||||
	q := c.DefaultQuery("q", "")
 | 
			
		||||
	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(q, page, limit)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	totalNumber, err := controller.service.Total(q)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("error : list")
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	totalPage := int64(totalNumber/int64(limit) + 1)
 | 
			
		||||
 | 
			
		||||
	response := models.UserQuizPaperListResponse{
 | 
			
		||||
		Data:      *result,
 | 
			
		||||
		Total:     totalNumber,
 | 
			
		||||
		Page:      page,
 | 
			
		||||
		TotalPage: totalPage,
 | 
			
		||||
		PageSize:  limit,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, response)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get userQuizPaper
 | 
			
		||||
//
 | 
			
		||||
// @Summary 		응시 정보 가져오기
 | 
			
		||||
// @Description	ID로 응시 정보를 가져옵니다.
 | 
			
		||||
// @Tags        사용자퀴즈페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path string true "응시 ID"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.UserQuizPaperResponse
 | 
			
		||||
// @Router /userquizpaper/{id} [get]
 | 
			
		||||
func (controller *userQuizPaperController) 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 UserQuizPaper
 | 
			
		||||
//
 | 
			
		||||
// @Summary 		응시 매칭 생성
 | 
			
		||||
// @Description	응시 매칭을 만듭니다.
 | 
			
		||||
// @Tags        사용자퀴즈페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param userQuizPaperBody body models.UserQuizPaperRequest true "UserQuizPaper Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} []models.UserQuizPaper
 | 
			
		||||
// @Router /userquizpaper [post]
 | 
			
		||||
func (controller *userQuizPaperController) Create(c *gin.Context) {
 | 
			
		||||
	var request models.UserQuizPaperRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("users", request.Users)
 | 
			
		||||
 | 
			
		||||
	quizPaper, err := controller.quizPaperService.Find(request.QuizPaperID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var users []int64
 | 
			
		||||
	err = json.Unmarshal(request.Users, &users)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	templates := controller.service.Generate(users, quizPaper)
 | 
			
		||||
	userQuizPapers, err := controller.service.Insert(templates)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var userquizzes []models.UserQuiz
 | 
			
		||||
	for _, userQuizPaper := range userQuizPapers {
 | 
			
		||||
		items, err := controller.userQuizService.Generate(request.QuizPaperID, &userQuizPaper)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			userquizzes = append(userquizzes, items...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = controller.userQuizService.Insert(userquizzes)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{"userQuizPaper": userQuizPapers})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Update UserQuizPaper
 | 
			
		||||
//
 | 
			
		||||
// @Summary			응시 수정
 | 
			
		||||
// @Description 응시를 수정합니다.
 | 
			
		||||
// @Tags        사용자퀴즈페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path int64 true "UserQuizPaper ID"
 | 
			
		||||
// @Param userQuizPaperUpdateBody body models.UserQuizPaperUpdateRequest true "UserQuizPaper Update Body"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.UserQuizPaperResponse
 | 
			
		||||
// @Router /userquizpaper/{id} [put]
 | 
			
		||||
func (controller *userQuizPaperController) 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.UserQuizPaperUpdateRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("request", request)
 | 
			
		||||
	userQuizPaper, err := controller.service.Find(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userQuizPaper.QuizPaperID = request.QuizPaperID
 | 
			
		||||
	userQuizPaper.UserID = request.UserID
 | 
			
		||||
	userQuizPaper.Status = request.Status
 | 
			
		||||
	userQuizPaper.UserScore = request.UserScore
 | 
			
		||||
	userQuizPaper.TotalScore = request.TotalScore
 | 
			
		||||
 | 
			
		||||
	if request.StartAt != "" {
 | 
			
		||||
		fmt.Println("request.StartAt", request.StartAt)
 | 
			
		||||
		start_at, err := time.Parse("2006-01-02T15:04:05-07:00", request.StartAt)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			userQuizPaper.StartAt = &start_at
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Println("start_at", start_at)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if request.DoneAt != "" {
 | 
			
		||||
		fmt.Println("request.EndAt", request.DoneAt)
 | 
			
		||||
		done_at, err := time.Parse("2006-01-02T15:04:05-07:00", request.DoneAt)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			userQuizPaper.DoneAt = &done_at
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Println("done_at", done_at)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("userQuizPaper", userQuizPaper)
 | 
			
		||||
	result, err := controller.service.Update(userQuizPaper)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("result", result)
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Patch UserQuizPaper
 | 
			
		||||
//
 | 
			
		||||
// @Summary			응시 정보 변경
 | 
			
		||||
// @Description 응시 정보를 변경합니다.
 | 
			
		||||
// @Tags        사용자퀴즈페이퍼
 | 
			
		||||
//
 | 
			
		||||
// @Accept json
 | 
			
		||||
// @Produce json
 | 
			
		||||
//
 | 
			
		||||
// @Security Bearer
 | 
			
		||||
//
 | 
			
		||||
// @Param id path int64 true "UserQuizPaper ID"
 | 
			
		||||
// @Param userQuizPaperPatchBody body models.UserQuizPaperPatchRequest true "UserQuizPaper Patch Body (변경할 필드만 입력)"
 | 
			
		||||
//
 | 
			
		||||
// @Success 200 {object} models.UserQuizPaperResponse
 | 
			
		||||
// @Router /userquizpaper/{id} [patch]
 | 
			
		||||
func (controller *userQuizPaperController) Patch(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.UserQuizPaperPatchRequest
 | 
			
		||||
	if err := c.ShouldBindJSON(&request); err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("request", request)
 | 
			
		||||
	userQuizPaper, err := controller.service.Find(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if request.Status != "" {
 | 
			
		||||
		userQuizPaper.Status = request.Status
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if request.StartAt != "" {
 | 
			
		||||
		fmt.Println("request.StartAt", request.StartAt)
 | 
			
		||||
		start_at, err := time.Parse("2006-01-02T15:04:05-07:00", request.StartAt)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			userQuizPaper.StartAt = &start_at
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Println("start_at", start_at)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if request.DoneAt != "" {
 | 
			
		||||
		fmt.Println("request.EndAt", request.DoneAt)
 | 
			
		||||
		done_at, err := time.Parse("2006-01-02T15:04:05-07:00", request.DoneAt)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			userQuizPaper.DoneAt = &done_at
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Println("done_at", done_at)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("userQuizPaper", userQuizPaper)
 | 
			
		||||
	result, err := controller.service.Update(userQuizPaper)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("result", result)
 | 
			
		||||
	c.JSON(http.StatusOK, result)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user