antigravity_oauth_handler.go 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package admin
  2. import (
  3. "github.com/Wei-Shaw/sub2api/internal/pkg/response"
  4. "github.com/Wei-Shaw/sub2api/internal/service"
  5. "github.com/gin-gonic/gin"
  6. )
  7. type AntigravityOAuthHandler struct {
  8. antigravityOAuthService *service.AntigravityOAuthService
  9. }
  10. func NewAntigravityOAuthHandler(antigravityOAuthService *service.AntigravityOAuthService) *AntigravityOAuthHandler {
  11. return &AntigravityOAuthHandler{antigravityOAuthService: antigravityOAuthService}
  12. }
  13. type AntigravityGenerateAuthURLRequest struct {
  14. ProxyID *int64 `json:"proxy_id"`
  15. }
  16. // GenerateAuthURL generates Google OAuth authorization URL
  17. // POST /api/v1/admin/antigravity/oauth/auth-url
  18. func (h *AntigravityOAuthHandler) GenerateAuthURL(c *gin.Context) {
  19. var req AntigravityGenerateAuthURLRequest
  20. if err := c.ShouldBindJSON(&req); err != nil {
  21. response.BadRequest(c, "请求无效: "+err.Error())
  22. return
  23. }
  24. result, err := h.antigravityOAuthService.GenerateAuthURL(c.Request.Context(), req.ProxyID)
  25. if err != nil {
  26. response.InternalError(c, "生成授权链接失败: "+err.Error())
  27. return
  28. }
  29. response.Success(c, result)
  30. }
  31. type AntigravityExchangeCodeRequest struct {
  32. SessionID string `json:"session_id" binding:"required"`
  33. State string `json:"state" binding:"required"`
  34. Code string `json:"code" binding:"required"`
  35. ProxyID *int64 `json:"proxy_id"`
  36. }
  37. // ExchangeCode 用 authorization code 交换 token
  38. // POST /api/v1/admin/antigravity/oauth/exchange-code
  39. func (h *AntigravityOAuthHandler) ExchangeCode(c *gin.Context) {
  40. var req AntigravityExchangeCodeRequest
  41. if err := c.ShouldBindJSON(&req); err != nil {
  42. response.BadRequest(c, "请求无效: "+err.Error())
  43. return
  44. }
  45. tokenInfo, err := h.antigravityOAuthService.ExchangeCode(c.Request.Context(), &service.AntigravityExchangeCodeInput{
  46. SessionID: req.SessionID,
  47. State: req.State,
  48. Code: req.Code,
  49. ProxyID: req.ProxyID,
  50. })
  51. if err != nil {
  52. response.BadRequest(c, "Token 交换失败: "+err.Error())
  53. return
  54. }
  55. response.Success(c, tokenInfo)
  56. }
  57. // AntigravityRefreshTokenRequest represents the request for validating Antigravity refresh token
  58. type AntigravityRefreshTokenRequest struct {
  59. RefreshToken string `json:"refresh_token" binding:"required"`
  60. ProxyID *int64 `json:"proxy_id"`
  61. }
  62. // RefreshToken validates an Antigravity refresh token and returns full token info
  63. // POST /api/v1/admin/antigravity/oauth/refresh-token
  64. func (h *AntigravityOAuthHandler) RefreshToken(c *gin.Context) {
  65. var req AntigravityRefreshTokenRequest
  66. if err := c.ShouldBindJSON(&req); err != nil {
  67. response.BadRequest(c, "请求无效: "+err.Error())
  68. return
  69. }
  70. tokenInfo, err := h.antigravityOAuthService.ValidateRefreshToken(c.Request.Context(), req.RefreshToken, req.ProxyID)
  71. if err != nil {
  72. response.ErrorFrom(c, err)
  73. return
  74. }
  75. response.Success(c, tokenInfo)
  76. }