package provider import ( "context" "time" providerpb "github.com/synctv-org/synctv/proto/provider" "golang.org/x/oauth2" ) type GRPCClient struct{ client providerpb.Oauth2PluginClient } var _ ProviderInterface = (*GRPCClient)(nil) func (c *GRPCClient) Init(o Oauth2Option) { c.client.Init(context.Background(), &providerpb.InitReq{ ClientId: o.ClientID, ClientSecret: o.ClientSecret, RedirectUrl: o.RedirectURL, }) } func (c *GRPCClient) Provider() OAuth2Provider { resp, err := c.client.Provider(context.Background(), &providerpb.Enpty{}) if err != nil { return "" } return OAuth2Provider(resp.Name) } func (c *GRPCClient) NewAuthURL(state string) string { resp, err := c.client.NewAuthURL(context.Background(), &providerpb.NewAuthURLReq{State: state}) if err != nil { return "" } return resp.Url } func (c *GRPCClient) GetToken(ctx context.Context, code string) (*oauth2.Token, error) { resp, err := c.client.GetToken(ctx, &providerpb.GetTokenReq{Code: code}) if err != nil { return nil, err } return &oauth2.Token{ AccessToken: resp.AccessToken, TokenType: resp.TokenType, RefreshToken: resp.RefreshToken, Expiry: time.Unix(resp.Expiry, 0), }, nil } func (c *GRPCClient) GetUserInfo(ctx context.Context, tk *oauth2.Token) (*UserInfo, error) { resp, err := c.client.GetUserInfo(ctx, &providerpb.GetUserInfoReq{ Token: &providerpb.Token{ AccessToken: tk.AccessToken, TokenType: tk.TokenType, RefreshToken: tk.RefreshToken, Expiry: tk.Expiry.Unix(), }, }) if err != nil { return nil, err } return &UserInfo{ Username: resp.Username, ProviderUserID: uint(resp.ProviderUserId), }, nil }