merch-api/internal/merch/controller.go

306 lines
8.8 KiB
Go
Raw Normal View History

2026-02-23 20:02:17 +03:00
package merch
2026-03-01 22:13:39 +03:00
import (
2026-03-07 15:49:54 +03:00
"errors"
2026-03-01 22:13:39 +03:00
"github.com/gin-gonic/gin"
2026-03-04 17:59:46 +03:00
"github.com/google/uuid"
2026-03-01 22:13:39 +03:00
"merch-api/pkg/responses"
2026-03-04 17:02:11 +03:00
"merch-api/pkg/utils"
2026-03-01 22:13:39 +03:00
"net/http"
)
2026-02-23 20:02:17 +03:00
2026-03-08 15:12:17 +03:00
const controllerLogHeader string = "[Controller]"
2026-02-23 20:02:17 +03:00
type controller struct {
service *service
2026-03-04 17:02:11 +03:00
utils utils.Utils
2026-02-23 20:02:17 +03:00
}
2026-03-04 17:02:11 +03:00
func newController(s *service, u utils.Utils) *controller {
2026-02-23 20:02:17 +03:00
return &controller{
service: s,
2026-03-04 17:02:11 +03:00
utils: u,
2026-02-23 20:02:17 +03:00
}
}
func (h *Handler) RegisterRoutes(r *gin.RouterGroup) {
merchGroup := r.Group("/merch")
merchGroup.POST("/create", h.controller.create)
merchGroup.GET("/:id", h.controller.getOne)
merchGroup.GET("/list", h.controller.getMany)
2026-03-07 15:49:54 +03:00
merchGroup.PUT("/:id", h.controller.updateMerch)
merchGroup.PUT("/extra/:id", h.controller.updateExtraData)
2026-03-04 17:59:46 +03:00
merchGroup.DELETE("/:id", h.controller.deleteMerch)
2026-02-23 20:02:17 +03:00
2026-03-01 22:13:39 +03:00
originsGroup := merchGroup.Group("/origins")
originsGroup.POST("", h.controller.createOrigin)
originsGroup.GET("", h.controller.getOrigins)
originsGroup.DELETE("", h.controller.deleteOrigin)
2026-02-23 20:02:17 +03:00
}
2026-03-04 17:02:11 +03:00
// create godoc
//
// @Summary Create new merch
// @Description Create new merch
// @Tags Merch
// @Accept json
// @Param merch body newMerchDTO true "merch body"
// @Success 201
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 500 {object} responses.InternalServerError
// @Router /merch/create [POST]
func (co *controller) create(c *gin.Context) {
var newMerch newMerchDTO
2026-03-07 15:49:54 +03:00
if err := c.ShouldBindJSON(&newMerch); err != nil {
2026-03-04 17:02:11 +03:00
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-04 17:02:11 +03:00
return
}
2026-03-07 15:49:54 +03:00
if err := co.service.createMerch(c, getUserId(c), &newMerch); err != nil {
2026-03-04 17:02:11 +03:00
c.JSON(http.StatusInternalServerError, responses.InternalServerError{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-04 17:02:11 +03:00
return
}
c.Status(http.StatusCreated)
}
2026-02-23 20:02:17 +03:00
func (co *controller) getOne(c *gin.Context) {}
2026-03-04 17:59:46 +03:00
// getMany godoc
//
// @Summary Get all merch
// @Description Get all merch without origins
// @Tags Merch
// @Produce json
// @Success 200 {array} merchDTO
// @Success 204
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 500 {object} responses.InternalServerError
// @Router /merch/list [GET]
func (co *controller) getMany(c *gin.Context) {
2026-03-07 15:49:54 +03:00
response, err := co.service.getMany(c, getUserId(c))
2026-03-04 17:59:46 +03:00
if err != nil {
2026-03-07 15:49:54 +03:00
c.JSON(http.StatusInternalServerError, responses.InternalServerError{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-04 17:59:46 +03:00
return
}
2026-03-07 15:49:54 +03:00
if len(response) == 0 {
c.Status(http.StatusNoContent)
return
}
c.JSON(http.StatusOK, response)
}
// updateMerch godoc
//
// @Summary Update merch
// @Description Update merch general info (except extra data)
// @Tags Merch
// @Accept json
// @Param uuid path string true "merch uuid"
// @Param payload body updateMerchDTO true "payload"
// @Produce json
// @Success 200 {object} merchDTO
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 500 {object} responses.InternalServerError
// @Router /merch/{uuid} [PUT]
func (co *controller) updateMerch(c *gin.Context) {
merchUuid := c.Param("id")
if err := uuid.Validate(merchUuid); err != nil {
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-07 15:49:54 +03:00
return
}
var payload updateMerchDTO
if err := c.ShouldBindJSON(&payload); err != nil {
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-07 15:49:54 +03:00
return
}
if merchUuid != payload.MerchUuid {
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: "MerchUuid does not match"})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, errors.New("MerchUuid does not match"))
2026-03-07 15:49:54 +03:00
return
}
response, err := co.service.updateMerch(c, getUserId(c), &payload)
2026-03-04 17:59:46 +03:00
if err != nil {
c.JSON(http.StatusInternalServerError, responses.InternalServerError{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-04 17:59:46 +03:00
return
}
2026-03-07 15:49:54 +03:00
c.JSON(http.StatusOK, response)
}
// updateMerch godoc
//
// @Summary Update merch extra data
// @Description Update ONLY merch extra data
// @Tags Merch
// @Accept json
// @Param uuid path string true "merch uuid"
// @Param payload body extraDataDTO true "payload"
// @Produce json
// @Success 200 {object} extraDataDTO
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 500 {object} responses.InternalServerError
// @Router /merch/extra/{uuid} [PUT]
func (co *controller) updateExtraData(c *gin.Context) {
merchUuid := c.Param("id")
if err := uuid.Validate(merchUuid); err != nil {
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-07 15:49:54 +03:00
return
}
var payload extraDataDTO
if err := c.ShouldBindJSON(&payload); err != nil {
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-07 15:49:54 +03:00
return
}
if merchUuid != payload.MerchUuid {
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: "MerchUuid does not match"})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, errors.New("MerchUuid does not match"))
2026-03-07 15:49:54 +03:00
return
}
response, err := co.service.updateExtraData(c, getUserId(c), &payload)
if err != nil {
c.JSON(http.StatusInternalServerError, responses.InternalServerError{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-04 17:59:46 +03:00
return
}
c.JSON(http.StatusOK, response)
}
2026-02-23 20:02:17 +03:00
2026-03-04 17:59:46 +03:00
// deleteMerch godoc
//
// @Summary Delete merch
// @Description Marks merch and all its extra data as deleted by uuid.
// @Tags Merch
// @Accept json
// @Param uuid path string true "merch uuid"
// @Success 204
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 500 {object} responses.InternalServerError
// @Router /merch/{uuid} [DELETE]
func (co *controller) deleteMerch(c *gin.Context) {
merchUuid := c.Param("id")
2026-03-07 15:49:54 +03:00
if err := uuid.Validate(merchUuid); err != nil {
2026-03-04 17:59:46 +03:00
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-04 17:59:46 +03:00
return
}
2026-03-07 15:49:54 +03:00
if err := co.service.deleteOneMerchRecord(c, getUserId(c), merchUuid); err != nil {
2026-03-04 17:59:46 +03:00
c.JSON(http.StatusInternalServerError, responses.InternalServerError{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-04 17:59:46 +03:00
return
}
c.Status(http.StatusNoContent)
}
2026-03-01 22:13:39 +03:00
// createOrigin godoc
//
// @Summary Create new origin
// @Description Create new origin with name
// @Tags Origins
// @Accept json
// @Param origin body newOriginDTO true "origin body"
// @Success 201
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 500 {object} responses.InternalServerError
// @Router /merch/origins [POST]
func (co *controller) createOrigin(c *gin.Context) {
var origin *newOriginDTO
if err := c.ShouldBindJSON(&origin); err != nil {
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-01 22:13:39 +03:00
return
}
2026-03-04 17:02:11 +03:00
if err := co.service.createOrigin(c, origin); err != nil {
2026-03-01 22:13:39 +03:00
c.JSON(http.StatusInternalServerError, responses.InternalServerError{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-01 22:13:39 +03:00
return
}
2026-03-08 15:12:17 +03:00
logDebug(controllerLogHeader, "create origin success")
2026-03-01 22:13:39 +03:00
c.Status(http.StatusCreated)
}
// getOrigins godoc
//
// @Summary Get all origins
// @Description Get all origins
// @Tags Origins
// @Produce json
// @Success 200 {object} originsDTO
// @Success 204
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 500 {object} responses.InternalServerError
// @Router /merch/origins [GET]
func (co *controller) getOrigins(c *gin.Context) {
2026-03-04 17:02:11 +03:00
response, err := co.service.getOrigins(c)
2026-03-01 22:13:39 +03:00
if err != nil {
c.JSON(http.StatusInternalServerError, responses.InternalServerError{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-01 22:13:39 +03:00
return
}
2026-03-08 15:12:17 +03:00
logDebug(controllerLogHeader, "get origins success")
2026-03-01 22:13:39 +03:00
c.JSON(http.StatusOK, response)
}
// deleteOrigin godoc
//
// @Summary Delete origin
// @Description Marks origin as deleted by name.
// @Tags Origins
// @Accept json
// @Param origin body deleteOriginDTO true "origin body"
// @Success 204
// @Failure 400 {object} responses.BadRequest
// @Failure 401 {object} responses.Unauthorized
// @Failure 500 {object} responses.InternalServerError
// @Router /merch/origins [DELETE]
func (co *controller) deleteOrigin(c *gin.Context) {
var origin *deleteOriginDTO
if err := c.ShouldBindJSON(&origin); err != nil {
c.JSON(http.StatusBadRequest, responses.BadRequest{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-01 22:13:39 +03:00
return
}
2026-03-04 17:02:11 +03:00
if err := co.service.deleteOrigin(c, origin); err != nil {
2026-03-01 22:13:39 +03:00
c.JSON(http.StatusInternalServerError, responses.InternalServerError{Error: err.Error()})
2026-03-08 15:12:17 +03:00
logErr(controllerLogHeader, err)
2026-03-01 22:13:39 +03:00
return
}
2026-03-08 15:12:17 +03:00
logDebug(controllerLogHeader, "delete origin success")
2026-03-01 22:13:39 +03:00
c.Status(http.StatusNoContent)
}