feat: publish sanitized custom.97 source

This commit is contained in:
cneicy committed 2026-10-27 20:43:39 +08:00
1 parent 8e6ed0317b
commit 86c0276156
1022 files changed
+69903 -19207

No files matched your search

+54 -56
View File
@@ -1,7 +1,6 @@
package controller
import (
"fmt"
"strconv"
"strings"
@@ -78,7 +77,7 @@ func UpdateSubscriptionPreference(c *gin.Context) {
userId := c.GetInt("id")
var req BillingPreferenceRequest
if err := c.ShouldBindJSON(&req); err != nil {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
pref := common.NormalizeBillingPreference(req.BillingPreference)
@@ -105,7 +104,7 @@ func SubscriptionRequestBalancePay(c *gin.Context) {
userId := c.GetInt("id")
var req SubscriptionBalancePayRequest
if err := c.ShouldBindJSON(&req); err != nil || req.PlanId <= 0 {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
@@ -145,20 +144,20 @@ func AdminCreateSubscriptionPlan(c *gin.Context) {
var req AdminUpsertSubscriptionPlanRequest
if err := c.ShouldBindJSON(&req); err != nil {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
req.Plan.Id = 0
if strings.TrimSpace(req.Plan.Title) == "" {
common.ApiErrorMsg(c, "套餐标题不能为空")
common.ApiErrorT(c, "Subscription plan title cannot be empty")
return
}
if req.Plan.PriceAmount < 0 {
common.ApiErrorMsg(c, "价格不能为负数")
common.ApiErrorT(c, "Price cannot be negative")
return
}
if req.Plan.PriceAmount > 9999 {
common.ApiErrorMsg(c, "价格不能超过9999")
common.ApiErrorT(c, "Price cannot exceed 9999")
return
}
if req.Plan.Currency == "" {
@@ -178,30 +177,30 @@ func AdminCreateSubscriptionPlan(c *gin.Context) {
req.Plan.DurationValue = 1
}
if req.Plan.MaxPurchasePerUser < 0 {
common.ApiErrorMsg(c, "购买上限不能为负数")
common.ApiErrorT(c, "Purchase limit cannot be negative")
return
}
if req.Plan.TotalAmount < 0 {
common.ApiErrorMsg(c, "总额度不能为负数")
common.ApiErrorT(c, "Total quota cannot be negative")
return
}
req.Plan.UpgradeGroup = strings.TrimSpace(req.Plan.UpgradeGroup)
if req.Plan.UpgradeGroup != "" {
if _, ok := ratio_setting.GetGroupRatioCopy()[req.Plan.UpgradeGroup]; !ok {
common.ApiErrorMsg(c, "升级分组不存在")
common.ApiErrorT(c, "Upgrade group does not exist")
return
}
}
req.Plan.DowngradeGroup = strings.TrimSpace(req.Plan.DowngradeGroup)
if req.Plan.DowngradeGroup != "" {
if _, ok := ratio_setting.GetGroupRatioCopy()[req.Plan.DowngradeGroup]; !ok {
common.ApiErrorMsg(c, "降级分组不存在")
common.ApiErrorT(c, "Downgrade group does not exist")
return
}
}
req.Plan.QuotaResetPeriod = model.NormalizeResetPeriod(req.Plan.QuotaResetPeriod)
if req.Plan.QuotaResetPeriod == model.SubscriptionResetCustom && req.Plan.QuotaResetCustomSeconds <= 0 {
common.ApiErrorMsg(c, "自定义重置周期需大于0秒")
common.ApiErrorT(c, "Custom reset cycle must be greater than 0 seconds")
return
}
err := model.DB.Create(&req.Plan).Error
@@ -220,24 +219,24 @@ func AdminUpdateSubscriptionPlan(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
if id <= 0 {
common.ApiErrorMsg(c, "无效的ID")
common.ApiErrorT(c, "Invalid ID")
return
}
var req AdminUpsertSubscriptionPlanRequest
if err := c.ShouldBindJSON(&req); err != nil {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
if strings.TrimSpace(req.Plan.Title) == "" {
common.ApiErrorMsg(c, "套餐标题不能为空")
common.ApiErrorT(c, "Subscription plan title cannot be empty")
return
}
if req.Plan.PriceAmount < 0 {
common.ApiErrorMsg(c, "价格不能为负数")
common.ApiErrorT(c, "Price cannot be negative")
return
}
if req.Plan.PriceAmount > 9999 {
common.ApiErrorMsg(c, "价格不能超过9999")
common.ApiErrorT(c, "Price cannot exceed 9999")
return
}
req.Plan.Id = id
@@ -252,30 +251,30 @@ func AdminUpdateSubscriptionPlan(c *gin.Context) {
req.Plan.DurationValue = 1
}
if req.Plan.MaxPurchasePerUser < 0 {
common.ApiErrorMsg(c, "购买上限不能为负数")
common.ApiErrorT(c, "Purchase limit cannot be negative")
return
}
if req.Plan.TotalAmount < 0 {
common.ApiErrorMsg(c, "总额度不能为负数")
common.ApiErrorT(c, "Total quota cannot be negative")
return
}
req.Plan.UpgradeGroup = strings.TrimSpace(req.Plan.UpgradeGroup)
if req.Plan.UpgradeGroup != "" {
if _, ok := ratio_setting.GetGroupRatioCopy()[req.Plan.UpgradeGroup]; !ok {
common.ApiErrorMsg(c, "升级分组不存在")
common.ApiErrorT(c, "Upgrade group does not exist")
return
}
}
req.Plan.DowngradeGroup = strings.TrimSpace(req.Plan.DowngradeGroup)
if req.Plan.DowngradeGroup != "" {
if _, ok := ratio_setting.GetGroupRatioCopy()[req.Plan.DowngradeGroup]; !ok {
common.ApiErrorMsg(c, "降级分组不存在")
common.ApiErrorT(c, "Downgrade group does not exist")
return
}
}
req.Plan.QuotaResetPeriod = model.NormalizeResetPeriod(req.Plan.QuotaResetPeriod)
if req.Plan.QuotaResetPeriod == model.SubscriptionResetCustom && req.Plan.QuotaResetCustomSeconds <= 0 {
common.ApiErrorMsg(c, "自定义重置周期需大于0秒")
common.ApiErrorT(c, "Custom reset cycle must be greater than 0 seconds")
return
}
@@ -332,12 +331,12 @@ func AdminUpdateSubscriptionPlanStatus(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
if id <= 0 {
common.ApiErrorMsg(c, "无效的ID")
common.ApiErrorT(c, "Invalid ID")
return
}
var req AdminUpdateSubscriptionPlanStatusRequest
if err := c.ShouldBindJSON(&req); err != nil || req.Enabled == nil {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
if err := model.DB.Model(&model.SubscriptionPlan{}).Where("id = ?", id).Update("enabled", *req.Enabled).Error; err != nil {
@@ -360,7 +359,7 @@ func AdminBindSubscription(c *gin.Context) {
var req AdminBindSubscriptionRequest
if err := c.ShouldBindJSON(&req); err != nil || req.UserId <= 0 || req.PlanId <= 0 {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
msg, err := model.AdminBindSubscription(req.UserId, req.PlanId, "")
@@ -368,11 +367,19 @@ func AdminBindSubscription(c *gin.Context) {
common.ApiError(c, err)
return
}
if msg != "" {
common.ApiSuccess(c, gin.H{"message": msg})
subscriptionChangeSuccess(c, msg)
}
// subscriptionChangeSuccess replies to an admin subscription change. notice
// tells the admin how the user's group changes, when it does.
func subscriptionChangeSuccess(c *gin.Context, notice *common.Message) {
if notice == nil {
common.ApiSuccess(c, nil)
return
}
common.ApiSuccess(c, nil)
data := notice.Fields()
data["message"] = notice.Error()
common.ApiSuccess(c, data)
}
// ---- Admin: user subscription management ----
@@ -380,7 +387,7 @@ func AdminBindSubscription(c *gin.Context) {
func AdminListUserSubscriptions(c *gin.Context) {
userId, _ := strconv.Atoi(c.Param("id"))
if userId <= 0 {
common.ApiErrorMsg(c, "无效的用户ID")
common.ApiErrorT(c, "Invalid user ID")
return
}
subs, err := model.GetAllUserSubscriptions(userId)
@@ -411,9 +418,12 @@ func recordSubscriptionResetUserLogs(c *gin.Context, result *model.SubscriptionR
if result == nil || result.ResetCount == 0 {
return
}
content := fmt.Sprintf("管理员重置订阅套餐 %s(ID: %d)额度", result.PlanTitle, result.PlanId)
const action = "subscription.user_quota_reset"
params := map[string]any{"plan_id": result.PlanId, "plan_title": result.PlanTitle}
operation := model.AuditOperation{Action: action, Params: params}
content := auditContentEN(action, params)
for _, userId := range result.AffectedUserIds {
model.RecordLogWithAdminInfo(userId, model.LogTypeManage, content, adminInfo, nil, c)
model.RecordLogWithAdminInfo(userId, model.LogTypeManage, content, adminInfo, &operation, c)
}
}
@@ -425,12 +435,12 @@ func AdminCreateUserSubscription(c *gin.Context) {
userId, _ := strconv.Atoi(c.Param("id"))
if userId <= 0 {
common.ApiErrorMsg(c, "无效的用户ID")
common.ApiErrorT(c, "Invalid user ID")
return
}
var req AdminCreateUserSubscriptionRequest
if err := c.ShouldBindJSON(&req); err != nil || req.PlanId <= 0 {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
msg, err := model.AdminBindSubscription(userId, req.PlanId, "")
@@ -438,26 +448,22 @@ func AdminCreateUserSubscription(c *gin.Context) {
common.ApiError(c, err)
return
}
if msg != "" {
common.ApiSuccess(c, gin.H{"message": msg})
return
}
common.ApiSuccess(c, nil)
subscriptionChangeSuccess(c, msg)
}
func AdminResetUserSubscriptionsByPlan(c *gin.Context) {
userId, _ := strconv.Atoi(c.Param("id"))
if userId <= 0 {
common.ApiErrorMsg(c, "无效的用户ID")
common.ApiErrorT(c, "Invalid user ID")
return
}
var req AdminResetSubscriptionRequest
if err := c.ShouldBindJSON(&req); err != nil {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
if req.PlanId <= 0 {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
advanceResetTime := resolveAdvanceResetTime(req.AdvanceResetTime)
@@ -481,12 +487,12 @@ func AdminResetUserSubscriptionsByPlan(c *gin.Context) {
func AdminResetPlanSubscriptions(c *gin.Context) {
planId, _ := strconv.Atoi(c.Param("id"))
if planId <= 0 {
common.ApiErrorMsg(c, "无效的ID")
common.ApiErrorT(c, "Invalid ID")
return
}
var req AdminResetSubscriptionRequest
if err := c.ShouldBindJSON(&req); err != nil {
common.ApiErrorMsg(c, "参数错误")
common.ApiErrorT(c, "Invalid parameters")
return
}
advanceResetTime := resolveAdvanceResetTime(req.AdvanceResetTime)
@@ -496,7 +502,7 @@ func AdminResetPlanSubscriptions(c *gin.Context) {
return
}
recordSubscriptionResetUserLogs(c, result, auditOperatorInfo(c))
common.SysLog(fmt.Sprintf("admin reset subscription plan %d quota: reset_count=%d user_count=%d advance_reset_time=%t",
common.SysLog(common.LogText("admin reset subscription plan %d quota: reset_count=%d user_count=%d advance_reset_time=%t",
result.PlanId, result.ResetCount, result.UserCount, result.AdvanceResetTime))
recordManageAudit(c, "subscription.plan_reset", map[string]any{
"plan_id": result.PlanId,
@@ -512,7 +518,7 @@ func AdminResetPlanSubscriptions(c *gin.Context) {
func AdminInvalidateUserSubscription(c *gin.Context) {
subId, _ := strconv.Atoi(c.Param("id"))
if subId <= 0 {
common.ApiErrorMsg(c, "无效的订阅ID")
common.ApiErrorT(c, "Invalid subscription ID")
return
}
msg, err := model.AdminInvalidateUserSubscription(subId)
@@ -520,18 +526,14 @@ func AdminInvalidateUserSubscription(c *gin.Context) {
common.ApiError(c, err)
return
}
if msg != "" {
common.ApiSuccess(c, gin.H{"message": msg})
return
}
common.ApiSuccess(c, nil)
subscriptionChangeSuccess(c, msg)
}
// AdminDeleteUserSubscription hard-deletes a user subscription.
func AdminDeleteUserSubscription(c *gin.Context) {
subId, _ := strconv.Atoi(c.Param("id"))
if subId <= 0 {
common.ApiErrorMsg(c, "无效的订阅ID")
common.ApiErrorT(c, "Invalid subscription ID")
return
}
msg, err := model.AdminDeleteUserSubscription(subId)
@@ -539,9 +541,5 @@ func AdminDeleteUserSubscription(c *gin.Context) {
common.ApiError(c, err)
return
}
if msg != "" {
common.ApiSuccess(c, gin.H{"message": msg})
return
}
common.ApiSuccess(c, nil)
subscriptionChangeSuccess(c, msg)
}