91 lines
1.8 KiB
Go
91 lines
1.8 KiB
Go
package gitlab
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
gitlab "github.com/xanzy/go-gitlab"
|
|
"golang.org/x/oauth2"
|
|
|
|
"source.toby3d.me/website/indieauth/internal/domain"
|
|
"source.toby3d.me/website/indieauth/internal/profile"
|
|
)
|
|
|
|
type gitlabProfileRepository struct{}
|
|
|
|
const ErrPrefix string = "gitlab"
|
|
|
|
func NewGitlabProfileRepository() profile.Repository {
|
|
return &gitlabProfileRepository{}
|
|
}
|
|
|
|
//nolint: funlen, cyclop
|
|
func (repo *gitlabProfileRepository) Get(_ context.Context, token *oauth2.Token) (*domain.Profile, error) {
|
|
client, err := gitlab.NewClient(token.AccessToken)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%s: cannot create client: %w", ErrPrefix, err)
|
|
}
|
|
|
|
user, _, err := client.Users.CurrentUser()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%s: cannot get user info: %w", ErrPrefix, err)
|
|
}
|
|
|
|
result := new(domain.Profile)
|
|
|
|
// NOTE(toby3d): Profile names.
|
|
if user.Name != "" {
|
|
result.Name = []string{user.Name}
|
|
}
|
|
|
|
// NOTE(toby3d): Profile photos.
|
|
if user.AvatarURL != "" {
|
|
if u, err := domain.ParseURL(user.AvatarURL); err == nil {
|
|
result.Photo = []*domain.URL{u}
|
|
}
|
|
}
|
|
|
|
// NOTE(toby3d): Profile URLs.
|
|
result.URL = make([]*domain.URL, 0)
|
|
|
|
for _, src := range []string{
|
|
user.WebURL, // NOTE(toby3d): always available.
|
|
user.WebsiteURL,
|
|
"https://twitter.com/" + user.Twitter,
|
|
// TODO(toby3d): Skype field
|
|
// TODO(toby3d): LinkedIn field
|
|
} {
|
|
if src == "" || src == "https://twitter.com/" {
|
|
continue
|
|
}
|
|
|
|
u, err := domain.ParseURL(user.WebsiteURL)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
result.URL = append(result.URL, u)
|
|
}
|
|
|
|
// NOTE(toby3d): Profile Emails.
|
|
result.Email = make([]*domain.Email, 0)
|
|
|
|
for _, src := range []string{
|
|
user.PublicEmail,
|
|
user.Email,
|
|
} {
|
|
if src == "" {
|
|
continue
|
|
}
|
|
|
|
email, err := domain.ParseEmail(src)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
result.Email = append(result.Email, email)
|
|
}
|
|
|
|
return result, nil
|
|
}
|