| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| package controller |
|
|
| import ( |
| "net/http" |
| "strconv" |
| "veloera/common" |
| "veloera/model" |
|
|
| "github.com/gin-gonic/gin" |
| "gorm.io/gorm" |
| ) |
|
|
| func GetAllRedemptions(c *gin.Context) { |
| p, _ := strconv.Atoi(c.Query("p")) |
| pageSize, _ := strconv.Atoi(c.Query("page_size")) |
| if p < 0 { |
| p = 0 |
| } |
| if pageSize < 1 { |
| pageSize = common.ItemsPerPage |
| } |
| redemptions, total, err := model.GetAllRedemptions((p-1)*pageSize, pageSize) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": gin.H{ |
| "items": redemptions, |
| "total": total, |
| "page": p, |
| "page_size": pageSize, |
| }, |
| }) |
| return |
| } |
|
|
| func SearchRedemptions(c *gin.Context) { |
| keyword := c.Query("keyword") |
| p, _ := strconv.Atoi(c.Query("p")) |
| pageSize, _ := strconv.Atoi(c.Query("page_size")) |
| if p < 0 { |
| p = 0 |
| } |
| if pageSize < 1 { |
| pageSize = common.ItemsPerPage |
| } |
| redemptions, total, err := model.SearchRedemptions(keyword, (p-1)*pageSize, pageSize) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": gin.H{ |
| "items": redemptions, |
| "total": total, |
| "page": p, |
| "page_size": pageSize, |
| }, |
| }) |
| return |
| } |
|
|
| func GetRedemption(c *gin.Context) { |
| id, err := strconv.Atoi(c.Param("id")) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| redemption, err := model.GetRedemptionById(id) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": redemption, |
| }) |
| return |
| } |
|
|
| func AddRedemption(c *gin.Context) { |
| redemption := model.Redemption{} |
| err := c.ShouldBindJSON(&redemption) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
|
|
| if len(redemption.Name) == 0 || len(redemption.Name) > 20 { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "兑换码名称长度必须在1-20之间", |
| }) |
| return |
| } |
|
|
| |
| if redemption.ValidFrom > 0 && redemption.ValidUntil > 0 && redemption.ValidFrom >= redemption.ValidUntil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "生效时间必须早于过期时间", |
| }) |
| return |
| } |
|
|
| var keys []string |
| if redemption.Key != "" { |
| |
| _, err := model.GetRedemptionByKey(redemption.Key) |
| if err != nil && err != gorm.ErrRecordNotFound { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| if err == nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "兑换码内容已存在", |
| }) |
| return |
| } |
|
|
| cleanRedemption := model.Redemption{ |
| UserId: c.GetInt("id"), |
| Name: redemption.Name, |
| Key: redemption.Key, |
| CreatedTime: common.GetTimestamp(), |
| Quota: redemption.Quota, |
| IsGift: redemption.IsGift, |
| MaxUses: redemption.MaxUses, |
| ValidFrom: redemption.ValidFrom, |
| ValidUntil: redemption.ValidUntil, |
| } |
| err = cleanRedemption.Insert() |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| keys = append(keys, redemption.Key) |
|
|
| } else { |
| |
| if redemption.Count <= 0 { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "兑换码个数必须大于0", |
| }) |
| return |
| } |
| if redemption.Count > 100 { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "一次兑换码批量生成的个数不能大于 100", |
| }) |
| return |
| } |
|
|
| for i := 0; i < redemption.Count; i++ { |
| key := common.GetUUID() |
| cleanRedemption := model.Redemption{ |
| UserId: c.GetInt("id"), |
| Name: redemption.Name, |
| Key: key, |
| CreatedTime: common.GetTimestamp(), |
| Quota: redemption.Quota, |
| IsGift: redemption.IsGift, |
| MaxUses: redemption.MaxUses, |
| ValidFrom: redemption.ValidFrom, |
| ValidUntil: redemption.ValidUntil, |
| } |
| err = cleanRedemption.Insert() |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| "data": keys, |
| }) |
| return |
| } |
| keys = append(keys, key) |
| } |
| } |
|
|
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": keys, |
| }) |
| return |
| } |
|
|
| func DeleteRedemption(c *gin.Context) { |
| id, _ := strconv.Atoi(c.Param("id")) |
| err := model.DeleteRedemptionById(id) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| }) |
| return |
| } |
|
|
| func UpdateRedemption(c *gin.Context) { |
| statusOnly := c.Query("status_only") |
| redemption := model.Redemption{} |
| err := c.ShouldBindJSON(&redemption) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| cleanRedemption, err := model.GetRedemptionById(redemption.Id) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| if statusOnly != "" { |
| cleanRedemption.Status = redemption.Status |
| } else { |
| |
| cleanRedemption.Name = redemption.Name |
| cleanRedemption.Quota = redemption.Quota |
| cleanRedemption.ValidFrom = redemption.ValidFrom |
| cleanRedemption.ValidUntil = redemption.ValidUntil |
| } |
| err = cleanRedemption.Update() |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": cleanRedemption, |
| }) |
| return |
| } |
|
|
| |
| func CountRedemptionsByName(c *gin.Context) { |
| name := c.Query("name") |
| if name == "" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "名称不能为空", |
| }) |
| return |
| } |
|
|
| count, err := model.CountRedemptionsByName(name) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": count, |
| }) |
| } |
|
|
| |
| func DeleteRedemptionsByName(c *gin.Context) { |
| name := c.Query("name") |
| if name == "" { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "名称不能为空", |
| }) |
| return |
| } |
|
|
| count, err := model.DeleteRedemptionsByName(name) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": count, |
| }) |
| } |
|
|
| |
| func BatchDisableRedemptions(c *gin.Context) { |
| var requestData struct { |
| Ids []int `json:"ids"` |
| } |
|
|
| err := c.ShouldBindJSON(&requestData) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
|
|
| if len(requestData.Ids) == 0 { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": "ID列表不能为空", |
| }) |
| return |
| } |
|
|
| count, err := model.BatchDisableRedemptions(requestData.Ids) |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": count, |
| }) |
| } |
|
|
| |
| func DeleteDisabledRedemptions(c *gin.Context) { |
| count, err := model.DeleteDisabledRedemptions() |
| if err != nil { |
| c.JSON(http.StatusOK, gin.H{ |
| "success": false, |
| "message": err.Error(), |
| }) |
| return |
| } |
|
|
| c.JSON(http.StatusOK, gin.H{ |
| "success": true, |
| "message": "", |
| "data": count, |
| }) |
| } |
|
|