fix(topup): guard wallet quota during recharge
This commit is contained in:
+30
-14
@@ -216,31 +216,47 @@ func getMaxTopUpAmount() int64 {
|
||||
return maxStoredAmount.IntPart()
|
||||
}
|
||||
|
||||
func validateCreditedQuota(quota decimal.Decimal) error {
|
||||
func validateCreditedQuota(quota decimal.Decimal) (int, error) {
|
||||
value, err := common.QuotaFromDecimalStrict(quota)
|
||||
if err != nil {
|
||||
return errors.New("充值额度超出系统可表示范围")
|
||||
return 0, errors.New("充值额度超出系统可表示范围")
|
||||
}
|
||||
if value <= 0 {
|
||||
return errors.New("充值额度必须大于 0")
|
||||
return 0, errors.New("充值额度必须大于 0")
|
||||
}
|
||||
return nil
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func validateTopUpQuota(amount int64) error {
|
||||
func validateTopUpQuota(amount int64) (int, error) {
|
||||
quota, err := getTopUpQuota(amount)
|
||||
if err == nil && quota > 0 {
|
||||
return nil
|
||||
return quota, nil
|
||||
}
|
||||
maxAmount := getMaxTopUpAmount()
|
||||
if maxAmount > 0 && amount > maxAmount {
|
||||
return fmt.Errorf("单笔充值数量不能大于 %d", maxAmount)
|
||||
return 0, fmt.Errorf("单笔充值数量不能大于 %d", maxAmount)
|
||||
}
|
||||
return errors.New("充值数量无效")
|
||||
return 0, errors.New("充值数量无效")
|
||||
}
|
||||
|
||||
func rejectInvalidTopUpQuota(c *gin.Context, amount int64) bool {
|
||||
if err := validateTopUpQuota(amount); err != nil {
|
||||
func rejectInvalidCreditedQuota(c *gin.Context, userId int, quota decimal.Decimal) bool {
|
||||
creditedQuota, err := validateCreditedQuota(quota)
|
||||
if err == nil {
|
||||
err = model.ValidateTopUpQuotaCapacity(userId, creditedQuota)
|
||||
}
|
||||
if err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{"message": "error", "data": err.Error()})
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func rejectInvalidTopUpQuota(c *gin.Context, userId int, amount int64) bool {
|
||||
creditedQuota, err := validateTopUpQuota(amount)
|
||||
if err == nil {
|
||||
err = model.ValidateTopUpQuotaCapacity(userId, creditedQuota)
|
||||
}
|
||||
if err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{"message": "error", "data": err.Error()})
|
||||
return true
|
||||
}
|
||||
@@ -258,11 +274,11 @@ func RequestEpay(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{"message": "error", "data": fmt.Sprintf("充值数量不能小于 %d", getMinTopup())})
|
||||
return
|
||||
}
|
||||
if rejectInvalidTopUpQuota(c, req.Amount) {
|
||||
id := c.GetInt("id")
|
||||
if rejectInvalidTopUpQuota(c, id, req.Amount) {
|
||||
return
|
||||
}
|
||||
|
||||
id := c.GetInt("id")
|
||||
group, err := model.GetUserGroup(id, true)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{"message": "error", "data": "获取用户分组失败"})
|
||||
@@ -475,10 +491,10 @@ func RequestAmount(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{"message": "error", "data": fmt.Sprintf("充值数量不能小于 %d", getMinTopup())})
|
||||
return
|
||||
}
|
||||
if rejectInvalidTopUpQuota(c, req.Amount) {
|
||||
id := c.GetInt("id")
|
||||
if rejectInvalidTopUpQuota(c, id, req.Amount) {
|
||||
return
|
||||
}
|
||||
id := c.GetInt("id")
|
||||
group, err := model.GetUserGroup(id, true)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{"message": "error", "data": "获取用户分组失败"})
|
||||
|
||||
Reference in New Issue
Block a user