update and delete methods

This commit is contained in:
nquidox 2025-09-15 22:02:36 +03:00
parent d58ad2970b
commit 726fe425f4
5 changed files with 159 additions and 15 deletions

View file

@ -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)
}

View file

@ -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"`

View file

@ -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"`
}

View file

@ -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
}

View file

@ -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)
}