- 新增 Gemini OAuth 授权处理器 - 扩展账号和网关处理器支持 Gemini - 注册 Gemini 相关路由 - 更新 Wire 依赖注入配置(所有层) - 更新 Docker Compose 配置
72 lines
2.1 KiB
Go
72 lines
2.1 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 GeminiOAuthHandler struct {
|
|
geminiOAuthService *service.GeminiOAuthService
|
|
}
|
|
|
|
func NewGeminiOAuthHandler(geminiOAuthService *service.GeminiOAuthService) *GeminiOAuthHandler {
|
|
return &GeminiOAuthHandler{geminiOAuthService: geminiOAuthService}
|
|
}
|
|
|
|
type GeminiGenerateAuthURLRequest struct {
|
|
ProxyID *int64 `json:"proxy_id"`
|
|
RedirectURI string `json:"redirect_uri" binding:"required"`
|
|
}
|
|
|
|
// GenerateAuthURL generates Google OAuth authorization URL for Gemini.
|
|
// POST /api/v1/admin/gemini/oauth/auth-url
|
|
func (h *GeminiOAuthHandler) GenerateAuthURL(c *gin.Context) {
|
|
var req GeminiGenerateAuthURLRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "Invalid request: "+err.Error())
|
|
return
|
|
}
|
|
|
|
result, err := h.geminiOAuthService.GenerateAuthURL(c.Request.Context(), req.ProxyID, req.RedirectURI)
|
|
if err != nil {
|
|
response.InternalError(c, "Failed to generate auth URL: "+err.Error())
|
|
return
|
|
}
|
|
|
|
response.Success(c, result)
|
|
}
|
|
|
|
type GeminiExchangeCodeRequest struct {
|
|
SessionID string `json:"session_id" binding:"required"`
|
|
State string `json:"state" binding:"required"`
|
|
Code string `json:"code" binding:"required"`
|
|
RedirectURI string `json:"redirect_uri" binding:"required"`
|
|
ProxyID *int64 `json:"proxy_id"`
|
|
}
|
|
|
|
// ExchangeCode exchanges authorization code for tokens.
|
|
// POST /api/v1/admin/gemini/oauth/exchange-code
|
|
func (h *GeminiOAuthHandler) ExchangeCode(c *gin.Context) {
|
|
var req GeminiExchangeCodeRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "Invalid request: "+err.Error())
|
|
return
|
|
}
|
|
|
|
tokenInfo, err := h.geminiOAuthService.ExchangeCode(c.Request.Context(), &service.GeminiExchangeCodeInput{
|
|
SessionID: req.SessionID,
|
|
State: req.State,
|
|
Code: req.Code,
|
|
RedirectURI: req.RedirectURI,
|
|
ProxyID: req.ProxyID,
|
|
})
|
|
if err != nil {
|
|
response.BadRequest(c, "Failed to exchange code: "+err.Error())
|
|
return
|
|
}
|
|
|
|
response.Success(c, tokenInfo)
|
|
}
|