diff --git a/backend/internal/handler/api_key_handler.go b/backend/internal/handler/api_key_handler.go index e0d73b390..336323081 100644 --- a/backend/internal/handler/api_key_handler.go +++ b/backend/internal/handler/api_key_handler.go @@ -46,14 +46,14 @@ type CreateAPIKeyRequest struct { // UpdateAPIKeyRequest represents the update API key request payload type UpdateAPIKeyRequest struct { - Name string `json:"name"` - GroupID *int64 `json:"group_id"` - Status string `json:"status" binding:"omitempty,oneof=active inactive"` - IPWhitelist []string `json:"ip_whitelist"` // IP 白名单 - IPBlacklist []string `json:"ip_blacklist"` // IP 黑名单 - Quota *float64 `json:"quota"` // 配额限制 (USD), 0=无限制 - ExpiresAt *string `json:"expires_at"` // 过期时间 (ISO 8601) - ResetQuota *bool `json:"reset_quota"` // 重置已用配额 + Name string `json:"name"` + GroupID *int64 `json:"group_id"` + Status string `json:"status" binding:"omitempty,oneof=active inactive"` + IPWhitelist *[]string `json:"ip_whitelist"` // IP 白名单(nil 不修改,空数组清空) + IPBlacklist *[]string `json:"ip_blacklist"` // IP 黑名单(nil 不修改,空数组清空) + Quota *float64 `json:"quota"` // 配额限制 (USD), 0=无限制 + ExpiresAt *string `json:"expires_at"` // 过期时间 (ISO 8601) + ResetQuota *bool `json:"reset_quota"` // 重置已用配额 // Rate limit fields (nil = no change, 0 = unlimited) RateLimit5h *float64 `json:"rate_limit_5h"` diff --git a/backend/internal/service/api_key_service.go b/backend/internal/service/api_key_service.go index 3b15d3174..b9a780369 100644 --- a/backend/internal/service/api_key_service.go +++ b/backend/internal/service/api_key_service.go @@ -197,11 +197,11 @@ type CreateAPIKeyRequest struct { // UpdateAPIKeyRequest 更新API Key请求 type UpdateAPIKeyRequest struct { - Name *string `json:"name"` - GroupID *int64 `json:"group_id"` - Status *string `json:"status"` - IPWhitelist []string `json:"ip_whitelist"` // IP 白名单(空数组清空) - IPBlacklist []string `json:"ip_blacklist"` // IP 黑名单(空数组清空) + Name *string `json:"name"` + GroupID *int64 `json:"group_id"` + Status *string `json:"status"` + IPWhitelist *[]string `json:"ip_whitelist"` // IP 白名单(nil 不修改,空数组清空) + IPBlacklist *[]string `json:"ip_blacklist"` // IP 黑名单(nil 不修改,空数组清空) // Quota fields Quota *float64 `json:"quota"` // Quota limit in USD (nil = no change, 0 = unlimited) @@ -705,15 +705,15 @@ func (s *APIKeyService) Update(ctx context.Context, id int64, userID int64, req } // 验证 IP 白名单格式 - if len(req.IPWhitelist) > 0 { - if invalid := ip.ValidateIPPatterns(req.IPWhitelist); len(invalid) > 0 { + if req.IPWhitelist != nil && len(*req.IPWhitelist) > 0 { + if invalid := ip.ValidateIPPatterns(*req.IPWhitelist); len(invalid) > 0 { return nil, fmt.Errorf("%w: %v", ErrInvalidIPPattern, invalid) } } // 验证 IP 黑名单格式 - if len(req.IPBlacklist) > 0 { - if invalid := ip.ValidateIPPatterns(req.IPBlacklist); len(invalid) > 0 { + if req.IPBlacklist != nil && len(*req.IPBlacklist) > 0 { + if invalid := ip.ValidateIPPatterns(*req.IPBlacklist); len(invalid) > 0 { return nil, fmt.Errorf("%w: %v", ErrInvalidIPPattern, invalid) } } @@ -779,9 +779,13 @@ func (s *APIKeyService) Update(ctx context.Context, id int64, userID int64, req } } - // 更新 IP 限制(空数组会清空设置) - apiKey.IPWhitelist = req.IPWhitelist - apiKey.IPBlacklist = req.IPBlacklist + // 更新 IP 限制(nil 不修改,空数组清空设置) + if req.IPWhitelist != nil { + apiKey.IPWhitelist = *req.IPWhitelist + } + if req.IPBlacklist != nil { + apiKey.IPBlacklist = *req.IPBlacklist + } // Update rate limit configuration if req.RateLimit5h != nil {