learnsteam-quiz-api/internal/controllers/program.go
2023-11-23 00:30:50 +09:00

212 lines
5.0 KiB
Go

package controllers
import (
"fmt"
"net/http"
"strconv"
"time"
"learnsteam/learsteam-quiz-api/internal/models"
"learnsteam/learsteam-quiz-api/internal/services"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
type ProgramController interface {
List(*gin.Context)
Find(*gin.Context)
Create(*gin.Context)
Update(*gin.Context)
}
type programController struct {
service services.ProgramService
}
func NewProgramController(service services.ProgramService) ProgramController {
return &programController{
service: service,
}
}
// Program List
//
// @Summary 프로그램 목록 가져오기
// @Description 퀴즈 프로그램 목록을 가져옵니다.
// @Tags Program
//
// @Accept json
// @Produce json
//
// @Param tag query string false "태그"
// @Param q query string false "검색어"
// @Param page query int false "페이지"
// @Param limit query int false "페이지 사이즈"
//
// @Success 200 {object} models.ProgramListResponse
// @Router /program [get]
func (controller *programController) 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.ProgramListResponse{
Data: *result,
Total: totalPage,
Page: page,
TotalPage: totalPage,
PageSize: limit,
}
c.JSON(http.StatusOK, response)
}
// Get program
//
// @Summary 퀴즈 프로그램 가져오기
// @Description ID로 퀴즈 프로그램을 가져옵니다.
// @Tags Program
//
// @Accept json
// @Produce json
//
// @Param id path string true "퀴즈 프로그램 ID"
//
// @Success 200 {object} models.ProgramResponse
// @Router /program/{id} [get]
func (controller *programController) Find(c *gin.Context) {
id := c.Param("id")
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 Program
//
// @Summary 퀴즈 프로그램 생성
// @Description 퀴즈 프로그램을 만듭니다.
// @Tags Program
//
// @Accept json
// @Produce json
//
// @Param programBody body models.ProgramRequest true "Program Body"
//
// @Success 200 {object} models.ProgramResponse
// @Router /program [post]
func (controller *programController) Create(c *gin.Context) {
var request models.ProgramRequest
if err := c.ShouldBindJSON(&request); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
publish_at, err := time.Parse("2006-01-02", request.PublishAt)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
program := &models.Program{
ID: uuid.NewString(),
Subject: request.Subject,
Course: request.Course,
Content: request.Content,
Tag: request.Tag,
Tags: request.Tag.String(),
PublishAt: publish_at,
Status: request.Status,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
fmt.Println("publish_at", program.PublishAt)
result, err := controller.service.Create(program)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, result)
}
// Update Program
//
// @Summary 퀴즈 프로그램 수정
// @Description 퀴즈 프로그램을 수정합니다.
// @Tags Program
//
// @Accept json
// @Produce json
//
// @Param programUpdateBody body models.ProgramRequest true "Program Body"
//
// @Success 200 {object} models.ProgramResponse
// @Router /program [put]
func (controller *programController) Update(c *gin.Context) {
id := c.Param("id")
var request models.ProgramRequest
if err := c.ShouldBindJSON(&request); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
program, err := controller.service.Find(id)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
publish_at, err := time.Parse("2006-01-02", request.PublishAt)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
program.Subject = request.Subject
program.Course = request.Course
program.Content = request.Content
program.Tag = request.Tag
program.Tags = request.Tag.String()
program.PublishAt = publish_at
program.Status = request.Status
program.UpdatedAt = time.Now()
result, err := controller.service.Update(program)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, result)
}