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) }