2026-03-12 23:49:16 +00:00
|
|
|
package platform
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"fmt"
|
|
|
|
|
"net/url"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/config"
|
2026-05-01 17:28:33 +00:00
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/db/gen/nidus-sync/arcgis/model"
|
|
|
|
|
queryarcgis "github.com/Gleipnir-Technology/nidus-sync/db/query/arcgis"
|
2026-03-12 23:49:16 +00:00
|
|
|
"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" }
|
|
|
|
|
|
2026-05-01 17:28:33 +00:00
|
|
|
func GetOAuthForOrg(ctx context.Context, org Organization) (*model.OAuthToken, error) {
|
2026-03-12 23:49:16 +00:00
|
|
|
result, err := oauth.GetOAuthForOrg(ctx, org.model)
|
|
|
|
|
if result == nil && err == nil {
|
|
|
|
|
return nil, &NoOAuthForOrg{}
|
|
|
|
|
}
|
|
|
|
|
return result, err
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-01 17:28:33 +00:00
|
|
|
func GetOAuthForUser(ctx context.Context, user User) (*model.OAuthToken, error) {
|
|
|
|
|
oauth, err := queryarcgis.OAuthTokenForUser(ctx, int64(user.ID))
|
2026-03-12 23:49:16 +00:00
|
|
|
if err != nil {
|
|
|
|
|
if err.Error() == "sql: no rows in result set" {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2026-05-07 10:39:17 +00:00
|
|
|
return &oauth, nil
|
2026-03-12 23:49:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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)
|
2026-05-01 17:28:33 +00:00
|
|
|
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,
|
2026-03-12 23:49:16 +00:00
|
|
|
}
|
2026-05-01 17:28:33 +00:00
|
|
|
oauth, err := queryarcgis.OAuthTokenInsert(ctx, &setter)
|
2026-03-12 23:49:16 +00:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("Failed to save token to database: %w", err)
|
|
|
|
|
}
|
2026-05-07 10:39:17 +00:00
|
|
|
go updateArcgisUserData(context.Background(), user.model, &oauth)
|
2026-03-12 23:49:16 +00:00
|
|
|
return nil
|
|
|
|
|
}
|