mirror of
https://gitee.com/wanwujie/sub2api
synced 2026-04-14 20:04:46 +08:00
fix: allow empty extra payload to clear account quota limits
UpdateAccount previously required len(input.Extra) > 0, causing explicit
empty payloads (extra:{}) to be silently skipped. Change condition to
input.Extra != nil so clearing quota keys actually persists.
This commit is contained in:
@@ -1530,7 +1530,9 @@ func (s *adminServiceImpl) UpdateAccount(ctx context.Context, id int64, input *U
|
|||||||
if len(input.Credentials) > 0 {
|
if len(input.Credentials) > 0 {
|
||||||
account.Credentials = input.Credentials
|
account.Credentials = input.Credentials
|
||||||
}
|
}
|
||||||
if len(input.Extra) > 0 {
|
// Extra 使用 map:需要区分“未提供(nil)”与“显式清空({})”。
|
||||||
|
// 关闭配额限制时前端会删除 quota_* 键并提交 extra:{},此时也必须落库。
|
||||||
|
if input.Extra != nil {
|
||||||
// 保留配额用量字段,防止编辑账号时意外重置
|
// 保留配额用量字段,防止编辑账号时意外重置
|
||||||
for _, key := range []string{"quota_used", "quota_daily_used", "quota_daily_start", "quota_weekly_used", "quota_weekly_start"} {
|
for _, key := range []string{"quota_used", "quota_daily_used", "quota_daily_start", "quota_weekly_used", "quota_weekly_start"} {
|
||||||
if v, ok := account.Extra[key]; ok {
|
if v, ok := account.Extra[key]; ok {
|
||||||
|
|||||||
@@ -121,3 +121,35 @@ func TestUpdateAccount_EnableOveragesClearsModelRateLimitsBeforePersist(t *testi
|
|||||||
_, exists := repo.account.Extra[modelRateLimitsKey]
|
_, exists := repo.account.Extra[modelRateLimitsKey]
|
||||||
require.False(t, exists, "开启 overages 时应在持久化前清掉旧模型限流")
|
require.False(t, exists, "开启 overages 时应在持久化前清掉旧模型限流")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUpdateAccount_EmptyExtraPayloadCanClearQuotaLimits(t *testing.T) {
|
||||||
|
accountID := int64(103)
|
||||||
|
repo := &updateAccountOveragesRepoStub{
|
||||||
|
account: &Account{
|
||||||
|
ID: accountID,
|
||||||
|
Platform: PlatformAnthropic,
|
||||||
|
Type: AccountTypeAPIKey,
|
||||||
|
Status: StatusActive,
|
||||||
|
Extra: map[string]any{
|
||||||
|
"quota_limit": 100.0,
|
||||||
|
"quota_daily_limit": 10.0,
|
||||||
|
"quota_weekly_limit": 40.0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
svc := &adminServiceImpl{accountRepo: repo}
|
||||||
|
updated, err := svc.UpdateAccount(context.Background(), accountID, &UpdateAccountInput{
|
||||||
|
// 显式空对象:语义是“清空 extra 中的可配置键”(例如关闭配额限制)
|
||||||
|
Extra: map[string]any{},
|
||||||
|
})
|
||||||
|
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, updated)
|
||||||
|
require.Equal(t, 1, repo.updateCalls)
|
||||||
|
require.NotNil(t, repo.account.Extra)
|
||||||
|
require.NotContains(t, repo.account.Extra, "quota_limit")
|
||||||
|
require.NotContains(t, repo.account.Extra, "quota_daily_limit")
|
||||||
|
require.NotContains(t, repo.account.Extra, "quota_weekly_limit")
|
||||||
|
require.Len(t, repo.account.Extra, 0)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user