Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
9e84e2fd
Commit
9e84e2fd
authored
Apr 21, 2026
by
IanShaw027
Browse files
fix: persist admin payment visibility and scheduler settings
parent
f83fd59d
Changes
9
Show whitespace changes
Inline
Side-by-side
backend/internal/handler/admin/setting_handler.go
View file @
9e84e2fd
...
...
@@ -180,6 +180,11 @@ func (h *SettingHandler) GetSettings(c *gin.Context) {
EnableMetadataPassthrough
:
settings
.
EnableMetadataPassthrough
,
EnableCCHSigning
:
settings
.
EnableCCHSigning
,
WebSearchEmulationEnabled
:
settings
.
WebSearchEmulationEnabled
,
PaymentVisibleMethodAlipaySource
:
settings
.
PaymentVisibleMethodAlipaySource
,
PaymentVisibleMethodWxpaySource
:
settings
.
PaymentVisibleMethodWxpaySource
,
PaymentVisibleMethodAlipayEnabled
:
settings
.
PaymentVisibleMethodAlipayEnabled
,
PaymentVisibleMethodWxpayEnabled
:
settings
.
PaymentVisibleMethodWxpayEnabled
,
OpenAIAdvancedSchedulerEnabled
:
settings
.
OpenAIAdvancedSchedulerEnabled
,
BalanceLowNotifyEnabled
:
settings
.
BalanceLowNotifyEnabled
,
BalanceLowNotifyThreshold
:
settings
.
BalanceLowNotifyThreshold
,
BalanceLowNotifyRechargeURL
:
settings
.
BalanceLowNotifyRechargeURL
,
...
...
@@ -338,6 +343,15 @@ type UpdateSettingsRequest struct {
EnableMetadataPassthrough
*
bool
`json:"enable_metadata_passthrough"`
EnableCCHSigning
*
bool
`json:"enable_cch_signing"`
// Payment visible method routing
PaymentVisibleMethodAlipaySource
*
string
`json:"payment_visible_method_alipay_source"`
PaymentVisibleMethodWxpaySource
*
string
`json:"payment_visible_method_wxpay_source"`
PaymentVisibleMethodAlipayEnabled
*
bool
`json:"payment_visible_method_alipay_enabled"`
PaymentVisibleMethodWxpayEnabled
*
bool
`json:"payment_visible_method_wxpay_enabled"`
// OpenAI account scheduling
OpenAIAdvancedSchedulerEnabled
*
bool
`json:"openai_advanced_scheduler_enabled"`
// Balance low notification
BalanceLowNotifyEnabled
*
bool
`json:"balance_low_notify_enabled"`
BalanceLowNotifyThreshold
*
float64
`json:"balance_low_notify_threshold"`
...
...
@@ -935,6 +949,36 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
}
return
previousSettings
.
EnableCCHSigning
}(),
PaymentVisibleMethodAlipaySource
:
func
()
string
{
if
req
.
PaymentVisibleMethodAlipaySource
!=
nil
{
return
strings
.
TrimSpace
(
*
req
.
PaymentVisibleMethodAlipaySource
)
}
return
previousSettings
.
PaymentVisibleMethodAlipaySource
}(),
PaymentVisibleMethodWxpaySource
:
func
()
string
{
if
req
.
PaymentVisibleMethodWxpaySource
!=
nil
{
return
strings
.
TrimSpace
(
*
req
.
PaymentVisibleMethodWxpaySource
)
}
return
previousSettings
.
PaymentVisibleMethodWxpaySource
}(),
PaymentVisibleMethodAlipayEnabled
:
func
()
bool
{
if
req
.
PaymentVisibleMethodAlipayEnabled
!=
nil
{
return
*
req
.
PaymentVisibleMethodAlipayEnabled
}
return
previousSettings
.
PaymentVisibleMethodAlipayEnabled
}(),
PaymentVisibleMethodWxpayEnabled
:
func
()
bool
{
if
req
.
PaymentVisibleMethodWxpayEnabled
!=
nil
{
return
*
req
.
PaymentVisibleMethodWxpayEnabled
}
return
previousSettings
.
PaymentVisibleMethodWxpayEnabled
}(),
OpenAIAdvancedSchedulerEnabled
:
func
()
bool
{
if
req
.
OpenAIAdvancedSchedulerEnabled
!=
nil
{
return
*
req
.
OpenAIAdvancedSchedulerEnabled
}
return
previousSettings
.
OpenAIAdvancedSchedulerEnabled
}(),
BalanceLowNotifyEnabled
:
func
()
bool
{
if
req
.
BalanceLowNotifyEnabled
!=
nil
{
return
*
req
.
BalanceLowNotifyEnabled
...
...
@@ -1153,6 +1197,11 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
EnableFingerprintUnification
:
updatedSettings
.
EnableFingerprintUnification
,
EnableMetadataPassthrough
:
updatedSettings
.
EnableMetadataPassthrough
,
EnableCCHSigning
:
updatedSettings
.
EnableCCHSigning
,
PaymentVisibleMethodAlipaySource
:
updatedSettings
.
PaymentVisibleMethodAlipaySource
,
PaymentVisibleMethodWxpaySource
:
updatedSettings
.
PaymentVisibleMethodWxpaySource
,
PaymentVisibleMethodAlipayEnabled
:
updatedSettings
.
PaymentVisibleMethodAlipayEnabled
,
PaymentVisibleMethodWxpayEnabled
:
updatedSettings
.
PaymentVisibleMethodWxpayEnabled
,
OpenAIAdvancedSchedulerEnabled
:
updatedSettings
.
OpenAIAdvancedSchedulerEnabled
,
BalanceLowNotifyEnabled
:
updatedSettings
.
BalanceLowNotifyEnabled
,
BalanceLowNotifyThreshold
:
updatedSettings
.
BalanceLowNotifyThreshold
,
BalanceLowNotifyRechargeURL
:
updatedSettings
.
BalanceLowNotifyRechargeURL
,
...
...
@@ -1455,6 +1504,21 @@ func diffSettings(before *service.SystemSettings, after *service.SystemSettings,
if
before
.
EnableCCHSigning
!=
after
.
EnableCCHSigning
{
changed
=
append
(
changed
,
"enable_cch_signing"
)
}
if
before
.
PaymentVisibleMethodAlipaySource
!=
after
.
PaymentVisibleMethodAlipaySource
{
changed
=
append
(
changed
,
"payment_visible_method_alipay_source"
)
}
if
before
.
PaymentVisibleMethodWxpaySource
!=
after
.
PaymentVisibleMethodWxpaySource
{
changed
=
append
(
changed
,
"payment_visible_method_wxpay_source"
)
}
if
before
.
PaymentVisibleMethodAlipayEnabled
!=
after
.
PaymentVisibleMethodAlipayEnabled
{
changed
=
append
(
changed
,
"payment_visible_method_alipay_enabled"
)
}
if
before
.
PaymentVisibleMethodWxpayEnabled
!=
after
.
PaymentVisibleMethodWxpayEnabled
{
changed
=
append
(
changed
,
"payment_visible_method_wxpay_enabled"
)
}
if
before
.
OpenAIAdvancedSchedulerEnabled
!=
after
.
OpenAIAdvancedSchedulerEnabled
{
changed
=
append
(
changed
,
"openai_advanced_scheduler_enabled"
)
}
// Balance & quota notification
if
before
.
BalanceLowNotifyEnabled
!=
after
.
BalanceLowNotifyEnabled
{
changed
=
append
(
changed
,
"balance_low_notify_enabled"
)
...
...
backend/internal/handler/admin/setting_handler_auth_source_defaults_test.go
View file @
9e84e2fd
...
...
@@ -147,3 +147,77 @@ func TestSettingHandler_UpdateSettings_PreservesOmittedAuthSourceDefaults(t *tes
require
.
Equal
(
t
,
float64
(
8
),
data
[
"auth_source_default_email_concurrency"
])
require
.
Equal
(
t
,
true
,
data
[
"force_email_on_third_party_signup"
])
}
func
TestSettingHandler_UpdateSettings_PersistsPaymentVisibleMethodsAndAdvancedScheduler
(
t
*
testing
.
T
)
{
gin
.
SetMode
(
gin
.
TestMode
)
repo
:=
&
settingHandlerRepoStub
{
values
:
map
[
string
]
string
{
service
.
SettingKeyPromoCodeEnabled
:
"true"
,
},
}
svc
:=
service
.
NewSettingService
(
repo
,
&
config
.
Config
{
Default
:
config
.
DefaultConfig
{
UserConcurrency
:
5
}})
handler
:=
NewSettingHandler
(
svc
,
nil
,
nil
,
nil
,
nil
,
nil
)
body
:=
map
[
string
]
any
{
"promo_code_enabled"
:
true
,
"payment_visible_method_alipay_source"
:
"easypay"
,
"payment_visible_method_wxpay_source"
:
"wxpay"
,
"payment_visible_method_alipay_enabled"
:
true
,
"payment_visible_method_wxpay_enabled"
:
false
,
"openai_advanced_scheduler_enabled"
:
true
,
}
rawBody
,
err
:=
json
.
Marshal
(
body
)
require
.
NoError
(
t
,
err
)
rec
:=
httptest
.
NewRecorder
()
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Request
=
httptest
.
NewRequest
(
http
.
MethodPut
,
"/api/v1/admin/settings"
,
bytes
.
NewReader
(
rawBody
))
c
.
Request
.
Header
.
Set
(
"Content-Type"
,
"application/json"
)
handler
.
UpdateSettings
(
c
)
require
.
Equal
(
t
,
http
.
StatusOK
,
rec
.
Code
)
require
.
Equal
(
t
,
service
.
VisibleMethodSourceEasyPayAlipay
,
repo
.
values
[
service
.
SettingPaymentVisibleMethodAlipaySource
])
require
.
Equal
(
t
,
service
.
VisibleMethodSourceOfficialWechat
,
repo
.
values
[
service
.
SettingPaymentVisibleMethodWxpaySource
])
require
.
Equal
(
t
,
"true"
,
repo
.
values
[
service
.
SettingPaymentVisibleMethodAlipayEnabled
])
require
.
Equal
(
t
,
"false"
,
repo
.
values
[
service
.
SettingPaymentVisibleMethodWxpayEnabled
])
require
.
Equal
(
t
,
"true"
,
repo
.
values
[
"openai_advanced_scheduler_enabled"
])
var
resp
response
.
Response
require
.
NoError
(
t
,
json
.
Unmarshal
(
rec
.
Body
.
Bytes
(),
&
resp
))
data
,
ok
:=
resp
.
Data
.
(
map
[
string
]
any
)
require
.
True
(
t
,
ok
)
require
.
Equal
(
t
,
service
.
VisibleMethodSourceEasyPayAlipay
,
data
[
"payment_visible_method_alipay_source"
])
require
.
Equal
(
t
,
service
.
VisibleMethodSourceOfficialWechat
,
data
[
"payment_visible_method_wxpay_source"
])
require
.
Equal
(
t
,
true
,
data
[
"payment_visible_method_alipay_enabled"
])
require
.
Equal
(
t
,
false
,
data
[
"payment_visible_method_wxpay_enabled"
])
require
.
Equal
(
t
,
true
,
data
[
"openai_advanced_scheduler_enabled"
])
}
func
TestSettingHandler_UpdateSettings_RejectsInvalidPaymentVisibleMethodSource
(
t
*
testing
.
T
)
{
gin
.
SetMode
(
gin
.
TestMode
)
repo
:=
&
settingHandlerRepoStub
{
values
:
map
[
string
]
string
{
service
.
SettingKeyPromoCodeEnabled
:
"true"
,
},
}
svc
:=
service
.
NewSettingService
(
repo
,
&
config
.
Config
{
Default
:
config
.
DefaultConfig
{
UserConcurrency
:
5
}})
handler
:=
NewSettingHandler
(
svc
,
nil
,
nil
,
nil
,
nil
,
nil
)
body
:=
map
[
string
]
any
{
"promo_code_enabled"
:
true
,
"payment_visible_method_alipay_source"
:
"bogus"
,
}
rawBody
,
err
:=
json
.
Marshal
(
body
)
require
.
NoError
(
t
,
err
)
rec
:=
httptest
.
NewRecorder
()
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Request
=
httptest
.
NewRequest
(
http
.
MethodPut
,
"/api/v1/admin/settings"
,
bytes
.
NewReader
(
rawBody
))
c
.
Request
.
Header
.
Set
(
"Content-Type"
,
"application/json"
)
handler
.
UpdateSettings
(
c
)
require
.
Equal
(
t
,
http
.
StatusBadRequest
,
rec
.
Code
)
require
.
NotContains
(
t
,
repo
.
values
,
service
.
SettingPaymentVisibleMethodAlipaySource
)
}
backend/internal/handler/dto/settings.go
View file @
9e84e2fd
...
...
@@ -127,6 +127,15 @@ type SystemSettings struct {
// Web Search Emulation
WebSearchEmulationEnabled
bool
`json:"web_search_emulation_enabled"`
// Payment visible method routing
PaymentVisibleMethodAlipaySource
string
`json:"payment_visible_method_alipay_source"`
PaymentVisibleMethodWxpaySource
string
`json:"payment_visible_method_wxpay_source"`
PaymentVisibleMethodAlipayEnabled
bool
`json:"payment_visible_method_alipay_enabled"`
PaymentVisibleMethodWxpayEnabled
bool
`json:"payment_visible_method_wxpay_enabled"`
// OpenAI account scheduling
OpenAIAdvancedSchedulerEnabled
bool
`json:"openai_advanced_scheduler_enabled"`
// Payment configuration
PaymentEnabled
bool
`json:"payment_enabled"`
PaymentMinAmount
float64
`json:"payment_min_amount"`
...
...
backend/internal/server/api_contract_test.go
View file @
9e84e2fd
...
...
@@ -504,6 +504,11 @@ func TestAPIContracts(t *testing.T) {
service
.
SettingKeyOpsRealtimeMonitoringEnabled
:
"true"
,
service
.
SettingKeyOpsQueryModeDefault
:
"auto"
,
service
.
SettingKeyOpsMetricsIntervalSeconds
:
"60"
,
service
.
SettingPaymentVisibleMethodAlipaySource
:
service
.
VisibleMethodSourceEasyPayAlipay
,
service
.
SettingPaymentVisibleMethodWxpaySource
:
service
.
VisibleMethodSourceOfficialWechat
,
service
.
SettingPaymentVisibleMethodAlipayEnabled
:
"true"
,
service
.
SettingPaymentVisibleMethodWxpayEnabled
:
"false"
,
"openai_advanced_scheduler_enabled"
:
"true"
,
})
},
method
:
http
.
MethodGet
,
...
...
@@ -567,6 +572,27 @@ func TestAPIContracts(t *testing.T) {
"api_base_url": "https://api.example.com",
"contact_info": "support",
"doc_url": "https://docs.example.com",
"auth_source_default_email_balance": 0,
"auth_source_default_email_concurrency": 5,
"auth_source_default_email_subscriptions": [],
"auth_source_default_email_grant_on_signup": false,
"auth_source_default_email_grant_on_first_bind": false,
"auth_source_default_linuxdo_balance": 0,
"auth_source_default_linuxdo_concurrency": 5,
"auth_source_default_linuxdo_subscriptions": [],
"auth_source_default_linuxdo_grant_on_signup": false,
"auth_source_default_linuxdo_grant_on_first_bind": false,
"auth_source_default_oidc_balance": 0,
"auth_source_default_oidc_concurrency": 5,
"auth_source_default_oidc_subscriptions": [],
"auth_source_default_oidc_grant_on_signup": false,
"auth_source_default_oidc_grant_on_first_bind": false,
"auth_source_default_wechat_balance": 0,
"auth_source_default_wechat_concurrency": 5,
"auth_source_default_wechat_subscriptions": [],
"auth_source_default_wechat_grant_on_signup": false,
"auth_source_default_wechat_grant_on_first_bind": false,
"force_email_on_third_party_signup": false,
"default_concurrency": 5,
"default_balance": 1.25,
"default_subscriptions": [],
...
...
@@ -592,6 +618,11 @@ func TestAPIContracts(t *testing.T) {
"enable_fingerprint_unification": true,
"enable_metadata_passthrough": false,
"web_search_emulation_enabled": false,
"payment_visible_method_alipay_source": "easypay_alipay",
"payment_visible_method_wxpay_source": "official_wxpay",
"payment_visible_method_alipay_enabled": true,
"payment_visible_method_wxpay_enabled": false,
"openai_advanced_scheduler_enabled": true,
"custom_menu_items": [],
"custom_endpoints": [],
"payment_enabled": false,
...
...
@@ -858,6 +889,18 @@ func (r *stubUserRepo) Delete(ctx context.Context, id int64) error {
return
errors
.
New
(
"not implemented"
)
}
func
(
r
*
stubUserRepo
)
GetUserAvatar
(
ctx
context
.
Context
,
userID
int64
)
(
*
service
.
UserAvatar
,
error
)
{
return
nil
,
nil
}
func
(
r
*
stubUserRepo
)
UpsertUserAvatar
(
ctx
context
.
Context
,
userID
int64
,
input
service
.
UpsertUserAvatarInput
)
(
*
service
.
UserAvatar
,
error
)
{
return
nil
,
errors
.
New
(
"not implemented"
)
}
func
(
r
*
stubUserRepo
)
DeleteUserAvatar
(
ctx
context
.
Context
,
userID
int64
)
error
{
return
errors
.
New
(
"not implemented"
)
}
func
(
r
*
stubUserRepo
)
List
(
ctx
context
.
Context
,
params
pagination
.
PaginationParams
)
([]
service
.
User
,
*
pagination
.
PaginationResult
,
error
)
{
return
nil
,
nil
,
errors
.
New
(
"not implemented"
)
}
...
...
@@ -894,6 +937,18 @@ func (r *stubUserRepo) AddGroupToAllowedGroups(ctx context.Context, userID int64
return
errors
.
New
(
"not implemented"
)
}
func
(
r
*
stubUserRepo
)
ListUserAuthIdentities
(
ctx
context
.
Context
,
userID
int64
)
([]
service
.
UserAuthIdentityRecord
,
error
)
{
return
nil
,
errors
.
New
(
"not implemented"
)
}
func
(
r
*
stubUserRepo
)
GetLatestUsedAtByUserIDs
(
ctx
context
.
Context
,
userIDs
[]
int64
)
(
map
[
int64
]
*
time
.
Time
,
error
)
{
return
map
[
int64
]
*
time
.
Time
{},
nil
}
func
(
r
*
stubUserRepo
)
GetLatestUsedAtByUserID
(
ctx
context
.
Context
,
userID
int64
)
(
*
time
.
Time
,
error
)
{
return
nil
,
nil
}
func
(
r
*
stubUserRepo
)
UpdateTotpSecret
(
ctx
context
.
Context
,
userID
int64
,
encryptedSecret
*
string
)
error
{
return
errors
.
New
(
"not implemented"
)
}
...
...
backend/internal/service/admin_service_apikey_test.go
View file @
9e84e2fd
...
...
@@ -82,6 +82,12 @@ func (s *userRepoStubForGroupUpdate) DisableTotp(context.Context, int64) error {
func
(
s
*
userRepoStubForGroupUpdate
)
ListUserAuthIdentities
(
context
.
Context
,
int64
)
([]
UserAuthIdentityRecord
,
error
)
{
panic
(
"unexpected"
)
}
func
(
s
*
userRepoStubForGroupUpdate
)
GetLatestUsedAtByUserIDs
(
context
.
Context
,
[]
int64
)
(
map
[
int64
]
*
time
.
Time
,
error
)
{
panic
(
"unexpected"
)
}
func
(
s
*
userRepoStubForGroupUpdate
)
GetLatestUsedAtByUserID
(
context
.
Context
,
int64
)
(
*
time
.
Time
,
error
)
{
panic
(
"unexpected"
)
}
func
(
s
*
userRepoStubForGroupUpdate
)
RemoveGroupFromUserAllowedGroups
(
context
.
Context
,
int64
,
int64
)
error
{
panic
(
"unexpected"
)
}
...
...
backend/internal/service/setting_service.go
View file @
9e84e2fd
...
...
@@ -566,6 +566,16 @@ func (s *SettingService) UpdateSettings(ctx context.Context, settings *SystemSet
normalizedWhitelist
=
[]
string
{}
}
settings
.
RegistrationEmailSuffixWhitelist
=
normalizedWhitelist
alipaySource
,
err
:=
normalizeVisibleMethodSettingSource
(
"alipay"
,
settings
.
PaymentVisibleMethodAlipaySource
,
settings
.
PaymentVisibleMethodAlipayEnabled
)
if
err
!=
nil
{
return
err
}
wxpaySource
,
err
:=
normalizeVisibleMethodSettingSource
(
"wxpay"
,
settings
.
PaymentVisibleMethodWxpaySource
,
settings
.
PaymentVisibleMethodWxpayEnabled
)
if
err
!=
nil
{
return
err
}
settings
.
PaymentVisibleMethodAlipaySource
=
alipaySource
settings
.
PaymentVisibleMethodWxpaySource
=
wxpaySource
updates
:=
make
(
map
[
string
]
string
)
...
...
@@ -701,6 +711,11 @@ func (s *SettingService) UpdateSettings(ctx context.Context, settings *SystemSet
updates
[
SettingKeyEnableFingerprintUnification
]
=
strconv
.
FormatBool
(
settings
.
EnableFingerprintUnification
)
updates
[
SettingKeyEnableMetadataPassthrough
]
=
strconv
.
FormatBool
(
settings
.
EnableMetadataPassthrough
)
updates
[
SettingKeyEnableCCHSigning
]
=
strconv
.
FormatBool
(
settings
.
EnableCCHSigning
)
updates
[
SettingPaymentVisibleMethodAlipaySource
]
=
settings
.
PaymentVisibleMethodAlipaySource
updates
[
SettingPaymentVisibleMethodWxpaySource
]
=
settings
.
PaymentVisibleMethodWxpaySource
updates
[
SettingPaymentVisibleMethodAlipayEnabled
]
=
strconv
.
FormatBool
(
settings
.
PaymentVisibleMethodAlipayEnabled
)
updates
[
SettingPaymentVisibleMethodWxpayEnabled
]
=
strconv
.
FormatBool
(
settings
.
PaymentVisibleMethodWxpayEnabled
)
updates
[
openAIAdvancedSchedulerSettingKey
]
=
strconv
.
FormatBool
(
settings
.
OpenAIAdvancedSchedulerEnabled
)
// Balance low notification
updates
[
SettingKeyBalanceLowNotifyEnabled
]
=
strconv
.
FormatBool
(
settings
.
BalanceLowNotifyEnabled
)
...
...
@@ -730,6 +745,11 @@ func (s *SettingService) UpdateSettings(ctx context.Context, settings *SystemSet
cchSigning
:
settings
.
EnableCCHSigning
,
expiresAt
:
time
.
Now
()
.
Add
(
gatewayForwardingCacheTTL
)
.
UnixNano
(),
})
openAIAdvancedSchedulerSettingSF
.
Forget
(
openAIAdvancedSchedulerSettingKey
)
openAIAdvancedSchedulerSettingCache
.
Store
(
&
cachedOpenAIAdvancedSchedulerSetting
{
enabled
:
settings
.
OpenAIAdvancedSchedulerEnabled
,
expiresAt
:
time
.
Now
()
.
Add
(
openAIAdvancedSchedulerSettingCacheTTL
)
.
UnixNano
(),
})
if
s
.
onUpdate
!=
nil
{
s
.
onUpdate
()
// Invalidate cache after settings update
}
...
...
@@ -1138,6 +1158,11 @@ func (s *SettingService) InitializeDefaultSettings(ctx context.Context) error {
// 分组隔离(默认不允许未分组 Key 调度)
SettingKeyAllowUngroupedKeyScheduling
:
"false"
,
SettingPaymentVisibleMethodAlipaySource
:
""
,
SettingPaymentVisibleMethodWxpaySource
:
""
,
SettingPaymentVisibleMethodAlipayEnabled
:
"false"
,
SettingPaymentVisibleMethodWxpayEnabled
:
"false"
,
openAIAdvancedSchedulerSettingKey
:
"false"
,
}
return
s
.
settingRepo
.
SetMultiple
(
ctx
,
defaults
)
...
...
@@ -1429,6 +1454,11 @@ func (s *SettingService) parseSettings(settings map[string]string) *SystemSettin
result
.
WebSearchEmulationEnabled
=
wsCfg
.
Enabled
&&
len
(
wsCfg
.
Providers
)
>
0
}
}
result
.
PaymentVisibleMethodAlipaySource
=
NormalizeVisibleMethodSource
(
"alipay"
,
settings
[
SettingPaymentVisibleMethodAlipaySource
])
result
.
PaymentVisibleMethodWxpaySource
=
NormalizeVisibleMethodSource
(
"wxpay"
,
settings
[
SettingPaymentVisibleMethodWxpaySource
])
result
.
PaymentVisibleMethodAlipayEnabled
=
settings
[
SettingPaymentVisibleMethodAlipayEnabled
]
==
"true"
result
.
PaymentVisibleMethodWxpayEnabled
=
settings
[
SettingPaymentVisibleMethodWxpayEnabled
]
==
"true"
result
.
OpenAIAdvancedSchedulerEnabled
=
settings
[
openAIAdvancedSchedulerSettingKey
]
==
"true"
// Balance low notification
result
.
BalanceLowNotifyEnabled
=
settings
[
SettingKeyBalanceLowNotifyEnabled
]
==
"true"
...
...
@@ -1458,6 +1488,28 @@ func isFalseSettingValue(value string) bool {
}
}
func
normalizeVisibleMethodSettingSource
(
method
,
source
string
,
enabled
bool
)
(
string
,
error
)
{
source
=
strings
.
TrimSpace
(
source
)
if
source
==
""
{
if
enabled
{
return
""
,
infraerrors
.
BadRequest
(
"INVALID_PAYMENT_VISIBLE_METHOD_SOURCE"
,
fmt
.
Sprintf
(
"%s source is required when the visible method is enabled"
,
method
),
)
}
return
""
,
nil
}
normalized
:=
NormalizeVisibleMethodSource
(
method
,
source
)
if
normalized
==
""
{
return
""
,
infraerrors
.
BadRequest
(
"INVALID_PAYMENT_VISIBLE_METHOD_SOURCE"
,
fmt
.
Sprintf
(
"%s source must be one of the supported payment providers"
,
method
),
)
}
return
normalized
,
nil
}
func
parseDefaultSubscriptions
(
raw
string
)
[]
DefaultSubscriptionSetting
{
raw
=
strings
.
TrimSpace
(
raw
)
if
raw
==
""
{
...
...
backend/internal/service/setting_service_update_test.go
View file @
9e84e2fd
...
...
@@ -223,3 +223,34 @@ func TestSettingService_UpdateSettings_TablePreferences(t *testing.T) {
require
.
Equal
(
t
,
"1000"
,
repo
.
updates
[
SettingKeyTableDefaultPageSize
])
require
.
Equal
(
t
,
"[20,100]"
,
repo
.
updates
[
SettingKeyTablePageSizeOptions
])
}
func
TestSettingService_UpdateSettings_PaymentVisibleMethodsAndAdvancedScheduler
(
t
*
testing
.
T
)
{
repo
:=
&
settingUpdateRepoStub
{}
svc
:=
NewSettingService
(
repo
,
&
config
.
Config
{})
err
:=
svc
.
UpdateSettings
(
context
.
Background
(),
&
SystemSettings
{
PaymentVisibleMethodAlipaySource
:
"alipay"
,
PaymentVisibleMethodWxpaySource
:
"easypay"
,
PaymentVisibleMethodAlipayEnabled
:
true
,
PaymentVisibleMethodWxpayEnabled
:
false
,
OpenAIAdvancedSchedulerEnabled
:
true
,
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
VisibleMethodSourceOfficialAlipay
,
repo
.
updates
[
SettingPaymentVisibleMethodAlipaySource
])
require
.
Equal
(
t
,
VisibleMethodSourceEasyPayWechat
,
repo
.
updates
[
SettingPaymentVisibleMethodWxpaySource
])
require
.
Equal
(
t
,
"true"
,
repo
.
updates
[
SettingPaymentVisibleMethodAlipayEnabled
])
require
.
Equal
(
t
,
"false"
,
repo
.
updates
[
SettingPaymentVisibleMethodWxpayEnabled
])
require
.
Equal
(
t
,
"true"
,
repo
.
updates
[
openAIAdvancedSchedulerSettingKey
])
}
func
TestSettingService_UpdateSettings_RejectsInvalidPaymentVisibleMethodSource
(
t
*
testing
.
T
)
{
repo
:=
&
settingUpdateRepoStub
{}
svc
:=
NewSettingService
(
repo
,
&
config
.
Config
{})
err
:=
svc
.
UpdateSettings
(
context
.
Background
(),
&
SystemSettings
{
PaymentVisibleMethodAlipaySource
:
"not-a-provider"
,
})
require
.
Error
(
t
,
err
)
require
.
Equal
(
t
,
"INVALID_PAYMENT_VISIBLE_METHOD_SOURCE"
,
infraerrors
.
Reason
(
err
))
require
.
Nil
(
t
,
repo
.
updates
)
}
backend/internal/service/settings_view.go
View file @
9e84e2fd
...
...
@@ -110,6 +110,15 @@ type SystemSettings struct {
// Web Search Emulation
WebSearchEmulationEnabled
bool
// 是否启用 web search 模拟
// Payment visible method routing
PaymentVisibleMethodAlipaySource
string
PaymentVisibleMethodWxpaySource
string
PaymentVisibleMethodAlipayEnabled
bool
PaymentVisibleMethodWxpayEnabled
bool
// OpenAI account scheduling
OpenAIAdvancedSchedulerEnabled
bool
// Balance low notification
BalanceLowNotifyEnabled
bool
BalanceLowNotifyThreshold
float64
...
...
backend/internal/service/user_service_test.go
View file @
9e84e2fd
...
...
@@ -103,6 +103,12 @@ func (m *mockUserRepo) AddGroupToAllowedGroups(context.Context, int64, int64) er
func
(
m
*
mockUserRepo
)
ListUserAuthIdentities
(
context
.
Context
,
int64
)
([]
UserAuthIdentityRecord
,
error
)
{
return
nil
,
nil
}
func
(
m
*
mockUserRepo
)
GetLatestUsedAtByUserIDs
(
context
.
Context
,
[]
int64
)
(
map
[
int64
]
*
time
.
Time
,
error
)
{
return
map
[
int64
]
*
time
.
Time
{},
nil
}
func
(
m
*
mockUserRepo
)
GetLatestUsedAtByUserID
(
context
.
Context
,
int64
)
(
*
time
.
Time
,
error
)
{
return
nil
,
nil
}
func
(
m
*
mockUserRepo
)
UpdateTotpSecret
(
context
.
Context
,
int64
,
*
string
)
error
{
return
nil
}
func
(
m
*
mockUserRepo
)
EnableTotp
(
context
.
Context
,
int64
)
error
{
return
nil
}
func
(
m
*
mockUserRepo
)
DisableTotp
(
context
.
Context
,
int64
)
error
{
return
nil
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment