From d58ad2970b93cda638bab259455eff8e822117a4 Mon Sep 17 00:00:00 2001 From: nquidox Date: Mon, 15 Sep 2025 17:56:16 +0300 Subject: [PATCH] get merch methods --- internal/api/merch/controller.go | 63 +++++++++++++++++++++++++++++-- internal/api/merch/dto.go | 16 ++++++++ internal/api/merch/repository.go | 51 ++++++++++++++++++++++--- internal/api/merch/service.go | 65 +++++++++++++++++++++----------- 4 files changed, 165 insertions(+), 30 deletions(-) diff --git a/internal/api/merch/controller.go b/internal/api/merch/controller.go index a88b3fd..0b9261a 100644 --- a/internal/api/merch/controller.go +++ b/internal/api/merch/controller.go @@ -24,7 +24,8 @@ func (h *Handler) RegisterRoutes(r *gin.RouterGroup, authMW gin.HandlerFunc, ref merchGroup := r.Group("/merch", authMW) merchGroup.POST("/", h.controller.addMerch) - merchGroup.GET("/", h.controller.getMerch) + merchGroup.GET("/:uuid", h.controller.getSingleMerch) + merchGroup.GET("/", h.controller.getAllMerch) merchGroup.PUT("/", h.controller.updateMerch) merchGroup.DELETE("/", h.controller.deleteMerch) @@ -64,8 +65,64 @@ func (co *controller) addMerch(c *gin.Context) { c.Status(http.StatusOK) } -func (co *controller) getMerch(c *gin.Context) { - c.JSON(200, gin.H{"msg": "placeholder"}) + +// @Summary Получить всю информацию про мерч +// @Description Получить всю информацию про мерч по его uuid +// @Tags Merch +// @Security BearerAuth +// @Param uuid path string true "merch_uuid" +// @Success 200 {object} MerchDTO +// @Failure 400 {object} responses.ErrorResponse400 +// @Failure 500 {object} responses.ErrorResponse500 +// @Router /merch/{uuid} [get] +func (co *controller) getSingleMerch(c *gin.Context) { + merchUuid := c.Param("uuid") + if merchUuid == "" { + c.JSON(http.StatusBadRequest, responses.ErrorResponse400{Error: "MerchUuid is empty"}) + return + } + + userUuid, err := co.utils.GetUserUuidFromContext(c) + if err != nil { + c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) + log.WithError(err).Error("Merch | Failed to get user uuid from context") + return + } + + response, err := co.service.getSingleMerch(userUuid, merchUuid) + if err != nil { + c.JSON(http.StatusBadRequest, responses.ErrorResponse500{Error: err.Error()}) + log.WithError(err).Error("Merch | Failed to get single merch") + return + } + + c.JSON(http.StatusOK, response) +} + +// @Summary Получить все записи мерча +// @Description Получить все записи мерча +// @Tags Merch +// @Security BearerAuth +// @Success 200 {array} ListResponse +// @Failure 400 {object} responses.ErrorResponse400 +// @Failure 500 {object} responses.ErrorResponse500 +// @Router /merch/{uuid} [get] +func (co *controller) getAllMerch(c *gin.Context) { + userUuid, err := co.utils.GetUserUuidFromContext(c) + if err != nil { + c.JSON(http.StatusInternalServerError, responses.ErrorResponse500{Error: err.Error()}) + log.WithError(err).Error("Merch | Failed to get user uuid from context") + return + } + + response, err := co.service.getAllMerch(userUuid) + if err != nil { + c.JSON(http.StatusBadRequest, responses.ErrorResponse500{Error: err.Error()}) + log.WithError(err).Error("Merch | Failed to get all merch") + return + } + + c.JSON(http.StatusOK, response) } func (co *controller) updateMerch(c *gin.Context) { diff --git a/internal/api/merch/dto.go b/internal/api/merch/dto.go index 7b116ec..381fc47 100644 --- a/internal/api/merch/dto.go +++ b/internal/api/merch/dto.go @@ -1,5 +1,10 @@ package merch +type merchBundle struct { + Merch + Surugaya + Mandarake +} type MerchDTO struct { MerchUuid string `json:"merch_uuid"` Name string `json:"name"` @@ -15,3 +20,14 @@ type SurugayaDTO struct { type MandarakeDTO struct { Link string `json:"link"` } + +type SingleMerchResponse struct { + MerchUuid string `json:"merch_uuid"` + Name string `json:"name"` + Origins []any `json:"origins"` +} + +type ListResponse struct { + MerchUuid string `json:"merch_uuid"` + Name string `json:"name"` +} diff --git a/internal/api/merch/repository.go b/internal/api/merch/repository.go index 9a3e92e..f93433d 100644 --- a/internal/api/merch/repository.go +++ b/internal/api/merch/repository.go @@ -13,21 +13,62 @@ func NewRepo(db *gorm.DB) *Repo { } type repository interface { - addMerch(merch Merch, surugaya Surugaya, mandarake Mandarake) error + addMerch(bundle merchBundle) error + getSingleMerch(userUuid, merchUuid string) (merchBundle, error) + getAllMerch(userUuid string) ([]ListResponse, error) } -func (r *Repo) addMerch(merch Merch, surugaya Surugaya, mandarake Mandarake) error { - if err := r.db.Create(merch).Error; err != nil { +func (r *Repo) addMerch(bundle merchBundle) error { + if err := r.db.Create(bundle.Merch).Error; err != nil { return err } - if err := r.db.Create(surugaya).Error; err != nil { + if err := r.db.Create(bundle.Surugaya).Error; err != nil { return err } - if err := r.db.Create(mandarake).Error; err != nil { + if err := r.db.Create(bundle.Mandarake).Error; err != nil { return err } return nil } + +func (r *Repo) getSingleMerch(userUuid, merchUuid string) (merchBundle, error) { + var merch Merch + if err := r.db. + Where("user_uuid = ?", userUuid). + Where("merch_uuid = ?", merchUuid). + Where("deleted_at IS NULL"). + First(&merch).Error; err != nil { + return merchBundle{}, err + } + + var surugaya Surugaya + if err := r.db. + Where("merch_uuid = ?", merchUuid). + First(&surugaya).Error; err != nil { + return merchBundle{}, err + } + + var mandarake Mandarake + if err := r.db. + Where("merch_uuid = ?", merchUuid). + First(&mandarake).Error; err != nil { + return merchBundle{}, err + } + + return merchBundle{ + Merch: merch, + Surugaya: surugaya, + Mandarake: mandarake, + }, nil +} + +func (r *Repo) getAllMerch(userUuid string) ([]ListResponse, error) { + var list []ListResponse + if err := r.db.Where("user_uuid = ?", userUuid).Find(&list).Error; err != nil { + return nil, err + } + return list, nil +} diff --git a/internal/api/merch/service.go b/internal/api/merch/service.go index 7f06939..a471684 100644 --- a/internal/api/merch/service.go +++ b/internal/api/merch/service.go @@ -19,32 +19,53 @@ func newService(repo repository) *service { func (s *service) addMerch(payload MerchDTO, userUuid string) error { merchUuid := uuid.NewString() - merch := Merch{ - CreatedAt: time.Time{}, - UpdatedAt: sql.NullTime{Valid: false}, - DeletedAt: sql.NullTime{Valid: false}, - MerchUuid: merchUuid, - UserUuid: userUuid, - Name: payload.Name, - } + bundle := merchBundle{ + Merch{ + CreatedAt: time.Time{}, + UpdatedAt: sql.NullTime{Valid: false}, + DeletedAt: sql.NullTime{Valid: false}, + MerchUuid: merchUuid, + UserUuid: userUuid, + Name: payload.Name, + }, - surugaya := Surugaya{ - DeletedAt: sql.NullTime{}, - MerchUuid: merchUuid, - Link: payload.OriginSurugaya.Link, - CookieValues: payload.OriginSurugaya.CookieValues, - } + Surugaya{ + DeletedAt: sql.NullTime{}, + MerchUuid: merchUuid, + Link: payload.OriginSurugaya.Link, + CookieValues: payload.OriginSurugaya.CookieValues, + }, - mandarake := Mandarake{ - DeletedAt: sql.NullTime{}, - MerchUuid: merchUuid, - Link: payload.OriginMandarake.Link, + Mandarake{ + DeletedAt: sql.NullTime{}, + MerchUuid: merchUuid, + Link: payload.OriginMandarake.Link, + }, } - - return s.repo.addMerch(merch, surugaya, mandarake) + return s.repo.addMerch(bundle) } -func (s *service) getMerch() error { - return nil + +func (s *service) getSingleMerch(userUuid, merchUuid string) (MerchDTO, error) { + bundle, err := s.repo.getSingleMerch(userUuid, merchUuid) + if err != nil { + return MerchDTO{}, err + } + + return MerchDTO{ + MerchUuid: bundle.Merch.MerchUuid, + Name: bundle.Merch.Name, + OriginSurugaya: SurugayaDTO{ + Link: bundle.Surugaya.Link, + CookieValues: bundle.Surugaya.CookieValues, + }, + OriginMandarake: MandarakeDTO{ + Link: bundle.Mandarake.Link, + }, + }, nil +} + +func (s *service) getAllMerch(userUuid string) ([]ListResponse, error) { + return s.repo.getAllMerch(userUuid) } func (s *service) updateMerch() error {