init from gitlab
This commit is contained in:
56
internal/server/github/user.go
Normal file
56
internal/server/github/user.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package github
|
||||
|
||||
import (
|
||||
"context"
|
||||
gh "github.com/google/go-github/v48/github"
|
||||
"github.com/rs/zerolog/log"
|
||||
"gitlab.com/texm/shokku/internal/env"
|
||||
"gitlab.com/texm/shokku/internal/models"
|
||||
"golang.org/x/oauth2"
|
||||
ghOAuth "golang.org/x/oauth2/github"
|
||||
)
|
||||
|
||||
type UserClient struct {
|
||||
client *gh.Client
|
||||
}
|
||||
|
||||
type CodeExchangeParams struct {
|
||||
Code string
|
||||
Scopes []string
|
||||
RedirectURL string
|
||||
}
|
||||
|
||||
func ExchangeCode(ctx context.Context, e *env.Env, p CodeExchangeParams) (*UserClient, error) {
|
||||
var ghApp models.GithubApp
|
||||
if err := e.DB.WithContext(ctx).First(&ghApp).Error; err != nil {
|
||||
log.Error().Err(err).Msg("no github app in db")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
conf := &oauth2.Config{
|
||||
ClientID: ghApp.ClientId,
|
||||
ClientSecret: ghApp.ClientSecret,
|
||||
Scopes: p.Scopes,
|
||||
RedirectURL: p.RedirectURL,
|
||||
Endpoint: ghOAuth.Endpoint,
|
||||
}
|
||||
token, err := conf.Exchange(ctx, p.Code)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("failed to exchange code for token")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tokenSource := oauth2.StaticTokenSource(token)
|
||||
oauthClient := oauth2.NewClient(ctx, tokenSource)
|
||||
client := gh.NewClient(oauthClient)
|
||||
return &UserClient{client}, nil
|
||||
}
|
||||
|
||||
func (u *UserClient) GetUser(ctx context.Context) (*gh.User, error) {
|
||||
user, _, err := u.client.Users.Get(ctx, "")
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("failed to get user")
|
||||
return nil, err
|
||||
}
|
||||
return user, nil
|
||||
}
|
||||
Reference in New Issue
Block a user