From e5027661707f6fdfec93be139362c51518d2abe3 Mon Sep 17 00:00:00 2001 From: feitianbubu Date: Mon, 20 Jul 2026 11:15:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=83=A8=E5=88=86=E6=9B=B4=E6=96=B0=20A?= =?UTF-8?q?PI=20Key=20=E6=97=B6=E4=B8=8D=E5=86=8D=E9=9D=99=E9=BB=98?= =?UTF-8?q?=E6=B8=85=E7=A9=BA=20IP=20=E7=99=BD/=E9=BB=91=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/handler/api_key_handler.go | 16 ++++++------ backend/internal/service/api_key_service.go | 28 ++++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/backend/internal/handler/api_key_handler.go b/backend/internal/handler/api_key_handler.go index e0d73b390d..3363230815 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 3b15d3174f..b9a780369f 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 {