mirror of https://github.com/synctv-org/synctv
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.
50 lines
948 B
Go
50 lines
948 B
Go
2 years ago
|
package provider
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"sync"
|
||
|
|
||
|
"golang.org/x/oauth2"
|
||
|
)
|
||
|
|
||
|
type OAuth2Provider string
|
||
|
|
||
|
var (
|
||
|
providers = make(map[OAuth2Provider]ProviderInterface)
|
||
|
lock sync.Mutex
|
||
|
)
|
||
|
|
||
|
type UserInfo struct {
|
||
|
Username string
|
||
|
ProviderUserID uint
|
||
|
}
|
||
|
|
||
|
type ProviderInterface interface {
|
||
|
Provider() OAuth2Provider
|
||
|
NewConfig(ClientID, ClientSecret string) *oauth2.Config
|
||
|
GetUserInfo(ctx context.Context, config *oauth2.Config, code string) (*UserInfo, error)
|
||
|
}
|
||
|
|
||
|
func RegisterProvider(provider ProviderInterface) {
|
||
|
lock.Lock()
|
||
|
defer lock.Unlock()
|
||
|
providers[provider.Provider()] = provider
|
||
|
}
|
||
|
|
||
|
func (p OAuth2Provider) GetProvider() (ProviderInterface, error) {
|
||
|
lock.Lock()
|
||
|
defer lock.Unlock()
|
||
|
pi, ok := providers[p]
|
||
|
if !ok {
|
||
|
return nil, FormatErrNotImplemented(p)
|
||
|
}
|
||
|
return pi, nil
|
||
|
}
|
||
|
|
||
|
type FormatErrNotImplemented string
|
||
|
|
||
|
func (f FormatErrNotImplemented) Error() string {
|
||
|
return fmt.Sprintf("%s not implemented", string(f))
|
||
|
}
|