package controller import ( "errors" "net/http" "one-api/common" "one-api/model" "strconv" "github.com/gin-gonic/gin" ) func GetAllRedemptions(c *gin.Context) { pageInfo := common.GetPageQuery(c) redemptions, total, err := model.GetAllRedemptions(pageInfo.GetStartIdx(), pageInfo.GetPageSize()) if err != nil { common.ApiError(c, err) return } pageInfo.SetTotal(int(total)) pageInfo.SetItems(redemptions) common.ApiSuccess(c, pageInfo) return } func SearchRedemptions(c *gin.Context) { keyword := c.Query("keyword") pageInfo := common.GetPageQuery(c) redemptions, total, err := model.SearchRedemptions(keyword, pageInfo.GetStartIdx(), pageInfo.GetPageSize()) if err != nil { common.ApiError(c, err) return } pageInfo.SetTotal(int(total)) pageInfo.SetItems(redemptions) common.ApiSuccess(c, pageInfo) return } func GetRedemption(c *gin.Context) { id, err := strconv.Atoi(c.Param("id")) if err != nil { common.ApiError(c, err) return } redemption, err := model.GetRedemptionById(id) if err != nil { common.ApiError(c, err) 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 { common.ApiError(c, err) return } if len(redemption.Name) == 0 || len(redemption.Name) > 20 { c.JSON(http.StatusOK, gin.H{ "success": false, "message": "兑换码名称长度必须在1-20之间", }) return } 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 } if err := validateExpiredTime(redemption.ExpiredTime); err != nil { c.JSON(http.StatusOK, gin.H{"success": false, "message": err.Error()}) return } var keys []string 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, ExpiredTime: redemption.ExpiredTime, } 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 { common.ApiError(c, err) 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 { common.ApiError(c, err) return } cleanRedemption, err := model.GetRedemptionById(redemption.Id) if err != nil { common.ApiError(c, err) return } if statusOnly == "" { if err := validateExpiredTime(redemption.ExpiredTime); err != nil { c.JSON(http.StatusOK, gin.H{"success": false, "message": err.Error()}) return } // If you add more fields, please also update redemption.Update() cleanRedemption.Name = redemption.Name cleanRedemption.Quota = redemption.Quota cleanRedemption.ExpiredTime = redemption.ExpiredTime } if statusOnly != "" { cleanRedemption.Status = redemption.Status } err = cleanRedemption.Update() if err != nil { common.ApiError(c, err) return } c.JSON(http.StatusOK, gin.H{ "success": true, "message": "", "data": cleanRedemption, }) return } func DeleteInvalidRedemption(c *gin.Context) { rows, err := model.DeleteInvalidRedemptions() if err != nil { common.ApiError(c, err) return } c.JSON(http.StatusOK, gin.H{ "success": true, "message": "", "data": rows, }) return } func validateExpiredTime(expired int64) error { if expired != 0 && expired < common.GetTimestamp() { return errors.New("过期时间不能早于当前时间") } return nil }