You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
synctv/internal/provider/provider.go

82 lines
1.6 KiB
Go

2 years ago
package provider
import (
"context"
"fmt"
"golang.org/x/oauth2"
)
type OAuth2Provider string
type TokenRefreshed struct {
Refreshed bool
Token *oauth2.Token
}
2 years ago
type UserInfo struct {
Username string
ProviderUserID uint
TokenRefreshed *TokenRefreshed
2 years ago
}
type Oauth2Option struct {
ClientID string
ClientSecret string
RedirectURL string
}
2 years ago
type ProviderInterface interface {
Init(Oauth2Option)
2 years ago
Provider() OAuth2Provider
NewAuthURL(string) string
GetToken(context.Context, string) (*oauth2.Token, error)
GetUserInfo(context.Context, *oauth2.Token) (*UserInfo, error)
2 years ago
}
var (
enabledProviders map[OAuth2Provider]ProviderInterface
allowedProviders = make(map[OAuth2Provider]ProviderInterface)
)
func InitProvider(p OAuth2Provider, c Oauth2Option) error {
pi, ok := allowedProviders[p]
if !ok {
return FormatErrNotImplemented(p)
}
pi.Init(c)
if enabledProviders == nil {
enabledProviders = make(map[OAuth2Provider]ProviderInterface)
}
enabledProviders[pi.Provider()] = pi
return nil
}
func RegisterProvider(ps ...ProviderInterface) {
for _, p := range ps {
allowedProviders[p.Provider()] = p
}
2 years ago
}
func GetProvider(p OAuth2Provider) (ProviderInterface, error) {
pi, ok := enabledProviders[p]
2 years ago
if !ok {
return nil, FormatErrNotImplemented(p)
}
return pi, nil
}
func AllowedProvider() map[OAuth2Provider]ProviderInterface {
return allowedProviders
}
func EnabledProvider() map[OAuth2Provider]ProviderInterface {
return enabledProviders
}
2 years ago
type FormatErrNotImplemented string
func (f FormatErrNotImplemented) Error() string {
return fmt.Sprintf("%s not implemented", string(f))
}