nidus-sync/platform/oauth.go

72 lines
2.1 KiB
Go
Raw Normal View History

package platform
import (
"context"
"fmt"
"net/url"
"time"
"github.com/Gleipnir-Technology/nidus-sync/config"
"github.com/Gleipnir-Technology/nidus-sync/db/gen/nidus-sync/arcgis/model"
queryarcgis "github.com/Gleipnir-Technology/nidus-sync/db/query/arcgis"
"github.com/Gleipnir-Technology/nidus-sync/platform/oauth"
)
// When there is no oauth for an organization
type NoOAuthForOrg struct{}
func (e NoOAuthForOrg) Error() string { return "No oauth available for organization" }
func GetOAuthForOrg(ctx context.Context, org Organization) (*model.OAuthToken, error) {
result, err := oauth.GetOAuthForOrg(ctx, org.model)
if result == nil && err == nil {
return nil, &NoOAuthForOrg{}
}
return result, err
}
func GetOAuthForUser(ctx context.Context, user User) (*model.OAuthToken, error) {
oauth, err := queryarcgis.OAuthTokenForUser(ctx, int64(user.ID))
if err != nil {
if err.Error() == "sql: no rows in result set" {
return nil, nil
}
return nil, err
}
return &oauth, nil
}
func HandleOauthAccessCode(ctx context.Context, user User, code string) error {
form := url.Values{
"grant_type": []string{"authorization_code"},
"code": []string{code},
"redirect_uri": []string{config.ArcGISOauthRedirectURL()},
}
token, err := oauth.DoTokenRequest(ctx, form)
if err != nil {
return fmt.Errorf("Failed to exchange authorization code for token: %w", err)
}
accessExpires := oauth.FutureUTCTimestamp(token.ExpiresIn)
refreshExpires := oauth.FutureUTCTimestamp(token.RefreshTokenExpiresIn)
setter := model.OAuthToken{
AccessToken: token.AccessToken,
AccessTokenExpires: accessExpires,
ArcgisAccountID: nil,
ArcgisID: nil,
ArcgisLicenseTypeID: nil,
Created: time.Now(),
InvalidatedAt: nil,
RefreshToken: token.RefreshToken,
RefreshTokenExpires: refreshExpires,
UserID: int32(user.ID),
Username: token.Username,
}
oauth, err := queryarcgis.OAuthTokenInsert(ctx, &setter)
if err != nil {
return fmt.Errorf("Failed to save token to database: %w", err)
}
go updateArcgisUserData(context.Background(), user.model, &oauth)
return nil
}