diff --git a/internal/api/merch/controller.go b/internal/api/merch/controller.go index 0b9261a..213fd7c 100644 --- a/internal/api/merch/controller.go +++ b/internal/api/merch/controller.go @@ -27,7 +27,7 @@ func (h *Handler) RegisterRoutes(r *gin.RouterGroup, authMW gin.HandlerFunc, ref merchGroup.GET("/:uuid", h.controller.getSingleMerch) merchGroup.GET("/", h.controller.getAllMerch) merchGroup.PUT("/", h.controller.updateMerch) - merchGroup.DELETE("/", h.controller.deleteMerch) + merchGroup.DELETE("/:uuid", h.controller.deleteMerch) } @@ -125,10 +125,65 @@ func (co *controller) getAllMerch(c *gin.Context) { c.JSON(http.StatusOK, response) } +// @Summary Обновить информацию про мерч +// @Description Обновить информацию про мерч по его uuid в json-е +// @Tags Merch +// @Security BearerAuth +// @Param body body MerchDTO true "merch_uuid" +// @Success 200 {object} MerchDTO +// @Failure 400 {object} responses.ErrorResponse400 +// @Failure 500 {object} responses.ErrorResponse500 +// @Router /merch/{uuid} [put] func (co *controller) updateMerch(c *gin.Context) { - c.JSON(200, gin.H{"msg": "placeholder"}) + var payload MerchDTO + if err := c.ShouldBind(&payload); err != nil { + c.JSON(http.StatusBadRequest, responses.ErrorResponse400{Error: err.Error()}) + log.WithError(err).Error("Merch | Failed to bind JSON on add merch") + 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 + } + + if err = co.service.updateMerch(payload, userUuid); err != nil { + c.JSON(http.StatusBadRequest, responses.ErrorResponse500{Error: err.Error()}) + log.WithError(err).Error("Merch | Failed to get single merch") + return + } } +// @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} [delete] func (co *controller) deleteMerch(c *gin.Context) { - c.JSON(200, gin.H{"msg": "placeholder"}) + 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 + } + + if err = co.service.deleteMerch(userUuid, merchUuid); err != nil { + c.JSON(http.StatusBadRequest, responses.ErrorResponse500{Error: err.Error()}) + log.WithError(err).Error("Merch | Failed to get single merch") + return + } + + c.Status(http.StatusOK) } diff --git a/internal/api/merch/dto.go b/internal/api/merch/dto.go index 381fc47..b432ca9 100644 --- a/internal/api/merch/dto.go +++ b/internal/api/merch/dto.go @@ -1,9 +1,9 @@ package merch type merchBundle struct { - Merch - Surugaya - Mandarake + Merch Merch + Surugaya Surugaya + Mandarake Mandarake } type MerchDTO struct { MerchUuid string `json:"merch_uuid"` diff --git a/internal/api/merch/model.go b/internal/api/merch/model.go index 207ce3f..dddae64 100644 --- a/internal/api/merch/model.go +++ b/internal/api/merch/model.go @@ -21,8 +21,8 @@ func (Merch) TableName() string { type Surugaya struct { Id uint `gorm:"primary_key" json:"-"` - DeletedAt sql.NullTime `gorm:"index" json:"-"` - MerchUuid string `gorm:"index" json:"-"` + DeletedAt sql.NullTime `json:"-"` + MerchUuid string `json:"-"` Link string `json:"link"` CookieValues string `json:"cookie_values"` } @@ -33,8 +33,8 @@ func (Surugaya) TableName() string { type Mandarake struct { Id uint `gorm:"primary_key" json:"-"` - DeletedAt sql.NullTime `gorm:"index" json:"-"` - MerchUuid string `gorm:"index" json:"-"` + DeletedAt sql.NullTime `json:"-"` + MerchUuid string `json:"-"` Link string `json:"link"` } diff --git a/internal/api/merch/repository.go b/internal/api/merch/repository.go index f93433d..bf68113 100644 --- a/internal/api/merch/repository.go +++ b/internal/api/merch/repository.go @@ -1,6 +1,10 @@ package merch -import "gorm.io/gorm" +import ( + "database/sql" + "gorm.io/gorm" + "time" +) type Repo struct { db *gorm.DB @@ -14,8 +18,13 @@ func NewRepo(db *gorm.DB) *Repo { type repository interface { addMerch(bundle merchBundle) error + getSingleMerch(userUuid, merchUuid string) (merchBundle, error) getAllMerch(userUuid string) ([]ListResponse, error) + + updateMerch(payload MerchDTO, userUuid string) error + + deleteMerch(userUuid, merchUuid string) error } func (r *Repo) addMerch(bundle merchBundle) error { @@ -72,3 +81,79 @@ func (r *Repo) getAllMerch(userUuid string) ([]ListResponse, error) { } return list, nil } + +func (r *Repo) updateMerch(payload MerchDTO, userUuid string) error { + m := make(map[string]any) + m["name"] = payload.Name + m["updated_at"] = sql.NullTime{ + Time: time.Now(), + Valid: true, + } + + if err := r.db. + Model(&Merch{}). + Where("user_uuid = ?", userUuid). + Where("merch_uuid = ?", payload.MerchUuid). + Updates(m).Error; err != nil { + return err + } + + // surugaya + fields := make(map[string]any, 2) + if payload.OriginSurugaya.Link != "" { + fields["link"] = payload.OriginSurugaya.Link + } + + if payload.OriginSurugaya.CookieValues != "" { + fields["cookie_values"] = payload.OriginSurugaya.CookieValues + } + + if len(fields) > 0 { + if err := r.db. + Model(&Surugaya{}). + Where("merch_uuid = ?", payload.MerchUuid). + Updates(fields).Error; err != nil { + return err + } + } + + // mandarake + if payload.OriginMandarake.Link != "" { + if err := r.db. + Model(&Mandarake{}). + Where("merch_uuid = ?", payload.MerchUuid). + Update("link", payload.OriginMandarake.Link).Error; err != nil { + return err + } + } + + return nil +} + +func (r *Repo) deleteMerch(userUuid, merchUuid string) error { + now := time.Now().UTC() + + if err := r.db. + Model(&Merch{}). + Where("user_uuid = ?", userUuid). + Where("merch_uuid = ?", merchUuid). + Update("deleted_at", now).Error; err != nil { + return err + } + + if err := r.db. + Model(&Surugaya{}). + Where("merch_uuid = ?", merchUuid). + Update("deleted_at", now).Error; err != nil { + return err + } + + if err := r.db. + Model(&Mandarake{}). + Where("merch_uuid = ?", merchUuid). + Update("deleted_at", now).Error; err != nil { + return err + } + + return nil +} diff --git a/internal/api/merch/service.go b/internal/api/merch/service.go index a471684..b897c9e 100644 --- a/internal/api/merch/service.go +++ b/internal/api/merch/service.go @@ -2,6 +2,7 @@ package merch import ( "database/sql" + "errors" "github.com/google/uuid" "time" ) @@ -68,10 +69,13 @@ func (s *service) getAllMerch(userUuid string) ([]ListResponse, error) { return s.repo.getAllMerch(userUuid) } -func (s *service) updateMerch() error { - return nil +func (s *service) updateMerch(payload MerchDTO, userUuid string) error { + if payload.MerchUuid == "" { + return errors.New("no MerchUuid or empty payload") + } + return s.repo.updateMerch(payload, userUuid) } -func (s *service) deleteMerch() error { - return nil +func (s *service) deleteMerch(userUuid, merchUuid string) error { + return s.repo.deleteMerch(userUuid, merchUuid) }