Some checks failed
CI / test (push) Failing after 3s
CI / frontend (push) Failing after 4s
CI / golangci-lint (push) Failing after 6s
CI / windsurf-platform (macos-latest) (push) Has been cancelled
CI / windsurf-platform (windows-latest) (push) Has been cancelled
Security Scan / backend-security (push) Failing after 3s
Security Scan / frontend-security (push) Failing after 3s
- 删除自定义文件:gateway_attribution, gateway_claude_runtime_headers, identity_service_antigravity, language_server_service, lsrpc_handler, antigravity_http handler/routes, 所有 antigravity 专项测试 - 将 antigravity pkg/service 文件回退至上游版本(移除 IsEnterprise、 claude_code_tool_map、dynamic fingerprint 等定制逻辑) - 修复 gateway_service.go:移除 NormalizeSystemPromptEnv、 generateSessionIDForAccount、applyClaudeRuntimeOptionalHeaders 调用, 使用上游的 session-id 同步逻辑 - 恢复 language_server_pb gen 文件(Windsurf local_ls.go 依赖) - 保留全部 Windsurf 集成代码不变
92 lines
2.8 KiB
Go
92 lines
2.8 KiB
Go
package admin
|
|
|
|
import (
|
|
"github.com/Wei-Shaw/sub2api/internal/pkg/response"
|
|
"github.com/Wei-Shaw/sub2api/internal/service"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type AntigravityOAuthHandler struct {
|
|
antigravityOAuthService *service.AntigravityOAuthService
|
|
}
|
|
|
|
func NewAntigravityOAuthHandler(antigravityOAuthService *service.AntigravityOAuthService) *AntigravityOAuthHandler {
|
|
return &AntigravityOAuthHandler{antigravityOAuthService: antigravityOAuthService}
|
|
}
|
|
|
|
type AntigravityGenerateAuthURLRequest struct {
|
|
ProxyID *int64 `json:"proxy_id"`
|
|
}
|
|
|
|
// GenerateAuthURL generates Google OAuth authorization URL
|
|
// POST /api/v1/admin/antigravity/oauth/auth-url
|
|
func (h *AntigravityOAuthHandler) GenerateAuthURL(c *gin.Context) {
|
|
var req AntigravityGenerateAuthURLRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "请求无效: "+err.Error())
|
|
return
|
|
}
|
|
|
|
result, err := h.antigravityOAuthService.GenerateAuthURL(c.Request.Context(), req.ProxyID)
|
|
if err != nil {
|
|
response.InternalError(c, "生成授权链接失败: "+err.Error())
|
|
return
|
|
}
|
|
|
|
response.Success(c, result)
|
|
}
|
|
|
|
type AntigravityExchangeCodeRequest struct {
|
|
SessionID string `json:"session_id" binding:"required"`
|
|
State string `json:"state" binding:"required"`
|
|
Code string `json:"code" binding:"required"`
|
|
ProxyID *int64 `json:"proxy_id"`
|
|
}
|
|
|
|
// ExchangeCode 用 authorization code 交换 token
|
|
// POST /api/v1/admin/antigravity/oauth/exchange-code
|
|
func (h *AntigravityOAuthHandler) ExchangeCode(c *gin.Context) {
|
|
var req AntigravityExchangeCodeRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "请求无效: "+err.Error())
|
|
return
|
|
}
|
|
|
|
tokenInfo, err := h.antigravityOAuthService.ExchangeCode(c.Request.Context(), &service.AntigravityExchangeCodeInput{
|
|
SessionID: req.SessionID,
|
|
State: req.State,
|
|
Code: req.Code,
|
|
ProxyID: req.ProxyID,
|
|
})
|
|
if err != nil {
|
|
response.BadRequest(c, "Token 交换失败: "+err.Error())
|
|
return
|
|
}
|
|
|
|
response.Success(c, tokenInfo)
|
|
}
|
|
|
|
// AntigravityRefreshTokenRequest represents the request for validating Antigravity refresh token
|
|
type AntigravityRefreshTokenRequest struct {
|
|
RefreshToken string `json:"refresh_token" binding:"required"`
|
|
ProxyID *int64 `json:"proxy_id"`
|
|
}
|
|
|
|
// RefreshToken validates an Antigravity refresh token and returns full token info
|
|
// POST /api/v1/admin/antigravity/oauth/refresh-token
|
|
func (h *AntigravityOAuthHandler) RefreshToken(c *gin.Context) {
|
|
var req AntigravityRefreshTokenRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "请求无效: "+err.Error())
|
|
return
|
|
}
|
|
|
|
tokenInfo, err := h.antigravityOAuthService.ValidateRefreshToken(c.Request.Context(), req.RefreshToken, req.ProxyID)
|
|
if err != nil {
|
|
response.ErrorFrom(c, err)
|
|
return
|
|
}
|
|
|
|
response.Success(c, tokenInfo)
|
|
}
|