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