feat: 支持自定义端点配置与展示
This commit is contained in:
@@ -110,6 +110,7 @@ func (h *SettingHandler) GetSettings(c *gin.Context) {
|
||||
PurchaseSubscriptionURL: settings.PurchaseSubscriptionURL,
|
||||
SoraClientEnabled: settings.SoraClientEnabled,
|
||||
CustomMenuItems: dto.ParseCustomMenuItems(settings.CustomMenuItems),
|
||||
CustomEndpoints: dto.ParseCustomEndpoints(settings.CustomEndpoints),
|
||||
DefaultConcurrency: settings.DefaultConcurrency,
|
||||
DefaultBalance: settings.DefaultBalance,
|
||||
DefaultSubscriptions: defaultSubscriptions,
|
||||
@@ -176,6 +177,7 @@ type UpdateSettingsRequest struct {
|
||||
PurchaseSubscriptionURL *string `json:"purchase_subscription_url"`
|
||||
SoraClientEnabled bool `json:"sora_client_enabled"`
|
||||
CustomMenuItems *[]dto.CustomMenuItem `json:"custom_menu_items"`
|
||||
CustomEndpoints *[]dto.CustomEndpoint `json:"custom_endpoints"`
|
||||
|
||||
// 默认配置
|
||||
DefaultConcurrency int `json:"default_concurrency"`
|
||||
@@ -417,6 +419,55 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
|
||||
customMenuJSON = string(menuBytes)
|
||||
}
|
||||
|
||||
// 自定义端点验证
|
||||
const (
|
||||
maxCustomEndpoints = 10
|
||||
maxEndpointNameLen = 50
|
||||
maxEndpointURLLen = 2048
|
||||
maxEndpointDescriptionLen = 200
|
||||
)
|
||||
|
||||
customEndpointsJSON := previousSettings.CustomEndpoints
|
||||
if req.CustomEndpoints != nil {
|
||||
endpoints := *req.CustomEndpoints
|
||||
if len(endpoints) > maxCustomEndpoints {
|
||||
response.BadRequest(c, "Too many custom endpoints (max 10)")
|
||||
return
|
||||
}
|
||||
for _, ep := range endpoints {
|
||||
if strings.TrimSpace(ep.Name) == "" {
|
||||
response.BadRequest(c, "Custom endpoint name is required")
|
||||
return
|
||||
}
|
||||
if len(ep.Name) > maxEndpointNameLen {
|
||||
response.BadRequest(c, "Custom endpoint name is too long (max 50 characters)")
|
||||
return
|
||||
}
|
||||
if strings.TrimSpace(ep.Endpoint) == "" {
|
||||
response.BadRequest(c, "Custom endpoint URL is required")
|
||||
return
|
||||
}
|
||||
if len(ep.Endpoint) > maxEndpointURLLen {
|
||||
response.BadRequest(c, "Custom endpoint URL is too long (max 2048 characters)")
|
||||
return
|
||||
}
|
||||
if err := config.ValidateAbsoluteHTTPURL(strings.TrimSpace(ep.Endpoint)); err != nil {
|
||||
response.BadRequest(c, "Custom endpoint URL must be an absolute http(s) URL")
|
||||
return
|
||||
}
|
||||
if len(ep.Description) > maxEndpointDescriptionLen {
|
||||
response.BadRequest(c, "Custom endpoint description is too long (max 200 characters)")
|
||||
return
|
||||
}
|
||||
}
|
||||
endpointBytes, err := json.Marshal(endpoints)
|
||||
if err != nil {
|
||||
response.BadRequest(c, "Failed to serialize custom endpoints")
|
||||
return
|
||||
}
|
||||
customEndpointsJSON = string(endpointBytes)
|
||||
}
|
||||
|
||||
// Ops metrics collector interval validation (seconds).
|
||||
if req.OpsMetricsIntervalSeconds != nil {
|
||||
v := *req.OpsMetricsIntervalSeconds
|
||||
@@ -495,6 +546,7 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
|
||||
PurchaseSubscriptionURL: purchaseURL,
|
||||
SoraClientEnabled: req.SoraClientEnabled,
|
||||
CustomMenuItems: customMenuJSON,
|
||||
CustomEndpoints: customEndpointsJSON,
|
||||
DefaultConcurrency: req.DefaultConcurrency,
|
||||
DefaultBalance: req.DefaultBalance,
|
||||
DefaultSubscriptions: defaultSubscriptions,
|
||||
@@ -592,6 +644,7 @@ func (h *SettingHandler) UpdateSettings(c *gin.Context) {
|
||||
PurchaseSubscriptionURL: updatedSettings.PurchaseSubscriptionURL,
|
||||
SoraClientEnabled: updatedSettings.SoraClientEnabled,
|
||||
CustomMenuItems: dto.ParseCustomMenuItems(updatedSettings.CustomMenuItems),
|
||||
CustomEndpoints: dto.ParseCustomEndpoints(updatedSettings.CustomEndpoints),
|
||||
DefaultConcurrency: updatedSettings.DefaultConcurrency,
|
||||
DefaultBalance: updatedSettings.DefaultBalance,
|
||||
DefaultSubscriptions: updatedDefaultSubscriptions,
|
||||
|
||||
Reference in New Issue
Block a user