mirror of
				https://github.com/songquanpeng/one-api.git
				synced 2025-11-04 15:53:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			196 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package controller
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/gin-gonic/gin"
 | 
						|
	"github.com/songquanpeng/one-api/common/config"
 | 
						|
	"github.com/songquanpeng/one-api/common/ctxkey"
 | 
						|
	"github.com/songquanpeng/one-api/common/helper"
 | 
						|
	"github.com/songquanpeng/one-api/common/random"
 | 
						|
	"github.com/songquanpeng/one-api/model"
 | 
						|
	"net/http"
 | 
						|
	"strconv"
 | 
						|
)
 | 
						|
 | 
						|
func GetAllRedemptions(c *gin.Context) {
 | 
						|
	p, _ := strconv.Atoi(c.Query("p"))
 | 
						|
	if p < 0 {
 | 
						|
		p = 0
 | 
						|
	}
 | 
						|
	redemptions, err := model.GetAllRedemptions(p*config.ItemsPerPage, config.ItemsPerPage)
 | 
						|
	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":    redemptions,
 | 
						|
	})
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func SearchRedemptions(c *gin.Context) {
 | 
						|
	keyword := c.Query("keyword")
 | 
						|
	redemptions, err := model.SearchRedemptions(keyword)
 | 
						|
	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":    redemptions,
 | 
						|
	})
 | 
						|
	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.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
 | 
						|
	}
 | 
						|
	var keys []string
 | 
						|
	for i := 0; i < redemption.Count; i++ {
 | 
						|
		key := random.GetUUID()
 | 
						|
		cleanRedemption := model.Redemption{
 | 
						|
			UserId:      c.GetInt(ctxkey.Id),
 | 
						|
			Name:        redemption.Name,
 | 
						|
			Key:         key,
 | 
						|
			CreatedTime: helper.GetTimestamp(),
 | 
						|
			Quota:       redemption.Quota,
 | 
						|
		}
 | 
						|
		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 {
 | 
						|
		// If you add more fields, please also update redemption.Update()
 | 
						|
		cleanRedemption.Name = redemption.Name
 | 
						|
		cleanRedemption.Quota = redemption.Quota
 | 
						|
	}
 | 
						|
	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
 | 
						|
}
 |