Add List*Organizations helpers in pkg/accessreview/drivers → Ignore .oauth-credentials.txt

- Add List*Organizations helpers in pkg/accessreview/drivers
- Replace AccessSource picker switches with map dispatch
- Drop dead per-provider connector settings wrappers
- Ignore .oauth-credentials.txt

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
This commit is contained in:
Aurélien Sibiril
2026-05-17 17:22:49 +02:00
parent 8917b46541
commit f3a745c245
6 changed files with 614 additions and 751 deletions

View File

@@ -398,76 +398,29 @@ func (r *accessSourceResolver) ProviderOrganizations(ctx context.Context, obj *t
return nil, fmt.Errorf("cannot get connector HTTP client: %w", err)
}
switch dbConnector.Provider {
case coredata.ConnectorProviderGitHub:
orgs, err := fetchGitHubOrganizations(ctx, httpClient)
if err != nil {
return nil, fmt.Errorf("cannot fetch github organizations: %w", err)
}
return orgs, nil
case coredata.ConnectorProviderSentry:
orgs, err := fetchSentryOrganizations(ctx, httpClient)
if err != nil {
return nil, fmt.Errorf("cannot fetch sentry organizations: %w", err)
}
return orgs, nil
case coredata.ConnectorProviderGitLab:
orgs, err := fetchGitLabOrganizations(ctx, httpClient)
if err != nil {
return nil, fmt.Errorf("cannot fetch gitlab organizations: %w", err)
}
return orgs, nil
case coredata.ConnectorProviderBitbucket:
orgs, err := fetchBitbucketOrganizations(ctx, httpClient)
if err != nil {
return nil, fmt.Errorf("cannot fetch bitbucket organizations: %w", err)
}
return orgs, nil
case coredata.ConnectorProviderHeroku:
orgs, err := fetchHerokuOrganizations(ctx, httpClient)
if err != nil {
return nil, fmt.Errorf("cannot fetch heroku organizations: %w", err)
}
return orgs, nil
case coredata.ConnectorProviderAsana:
orgs, err := fetchAsanaOrganizations(ctx, httpClient)
if err != nil {
return nil, fmt.Errorf("cannot fetch asana organizations: %w", err)
}
return orgs, nil
case coredata.ConnectorProviderPagerDuty:
// PagerDuty uses Pattern 2-auto: the subdomain is captured during
// the OAuth callback, no picker UI is required.
return []*types.ProviderOrganization{}, nil
case coredata.ConnectorProviderSnyk:
orgs, err := fetchSnykOrganizations(ctx, httpClient)
if err != nil {
return nil, fmt.Errorf("cannot fetch snyk organizations: %w", err)
}
return orgs, nil
case coredata.ConnectorProviderNetlify:
orgs, err := fetchNetlifyOrganizations(ctx, httpClient)
if err != nil {
return nil, fmt.Errorf("cannot fetch netlify organizations: %w", err)
}
return orgs, nil
case coredata.ConnectorProviderClickUp:
orgs, err := fetchClickUpOrganizations(ctx, httpClient)
if err != nil {
return nil, fmt.Errorf("cannot fetch clickup organizations: %w", err)
}
return orgs, nil
case coredata.ConnectorProviderVercel:
// Vercel uses Pattern 2-auto: the team_id is captured during the
// OAuth callback (or synthesized from /v2/user for personal
// accounts), no picker UI is required.
return []*types.ProviderOrganization{}, nil
default:
cfg, ok := providerOrgConfigs[dbConnector.Provider]
if !ok || cfg.ListOrgs == nil {
return []*types.ProviderOrganization{}, nil
}
orgs, err := cfg.ListOrgs(ctx, httpClient)
if err != nil {
return nil, err
}
result := make([]*types.ProviderOrganization, len(orgs))
for i, o := range orgs {
result[i] = &types.ProviderOrganization{Slug: o.Slug, DisplayName: o.DisplayName}
}
return result, nil
}
// NeedsConfiguration is the resolver for the needsConfiguration field.
//
// True when the provider has a picker UI (NeedsPicker) AND the user has
// not yet picked an org. 2-auto providers (PagerDuty, Vercel) always
// return false: the identifier is captured during the OAuth callback,
// not via a follow-up configure mutation.
func (r *accessSourceResolver) NeedsConfiguration(ctx context.Context, obj *types.AccessSource) (bool, error) {
if err := r.authorize(ctx, obj.ID, probo.ActionAccessSourceGet); err != nil {
return false, err
@@ -487,48 +440,11 @@ func (r *accessSourceResolver) NeedsConfiguration(ctx context.Context, obj *type
panic(fmt.Errorf("cannot get connector: %w", err))
}
switch dbConnector.Provider {
case coredata.ConnectorProviderGitHub:
settings, _ := dbConnector.GitHubSettings()
return settings.Organization == "", nil
case coredata.ConnectorProviderSentry:
settings, _ := dbConnector.SentrySettings()
return settings.OrganizationSlug == "", nil
case coredata.ConnectorProviderGitLab:
settings, _ := dbConnector.GitLabSettings()
return settings.GroupID == "", nil
case coredata.ConnectorProviderBitbucket:
settings, _ := dbConnector.BitbucketSettings()
return settings.Workspace == "", nil
case coredata.ConnectorProviderHeroku:
settings, _ := dbConnector.HerokuSettings()
return settings.TeamID == "", nil
case coredata.ConnectorProviderAsana:
settings, _ := dbConnector.AsanaSettings()
return settings.WorkspaceGID == "", nil
case coredata.ConnectorProviderPagerDuty:
// 2-auto: subdomain is set during the OAuth callback. If for any
// reason it is missing, we still return false so the configure
// mutation does not surface — there is no manual picker.
return false, nil
case coredata.ConnectorProviderSnyk:
settings, _ := dbConnector.SnykSettings()
return settings.OrgID == "", nil
case coredata.ConnectorProviderNetlify:
settings, _ := dbConnector.NetlifySettings()
return settings.AccountSlug == "", nil
case coredata.ConnectorProviderClickUp:
settings, _ := dbConnector.ClickUpSettings()
return settings.TeamID == "", nil
case coredata.ConnectorProviderVercel:
// 2-auto: team_id is set during the OAuth callback (or synthesized
// from /v2/user for personal accounts). If for any reason it is
// missing, return false so the configure mutation does not surface
// — there is no manual picker.
return false, nil
default:
cfg, ok := providerOrgConfigs[dbConnector.Provider]
if !ok || !cfg.NeedsPicker {
return false, nil
}
return cfg.SelectedSlug(dbConnector) == "", nil
}
// ConnectionStatus is the resolver for the connectionStatus field.
@@ -582,65 +498,15 @@ func (r *accessSourceResolver) SelectedOrganization(ctx context.Context, obj *ty
panic(fmt.Errorf("cannot get connector: %w", err))
}
switch dbConnector.Provider {
case coredata.ConnectorProviderGitHub:
settings, _ := dbConnector.GitHubSettings()
if settings.Organization != "" {
return &settings.Organization, nil
}
case coredata.ConnectorProviderSentry:
settings, _ := dbConnector.SentrySettings()
if settings.OrganizationSlug != "" {
return &settings.OrganizationSlug, nil
}
case coredata.ConnectorProviderGitLab:
settings, _ := dbConnector.GitLabSettings()
if settings.GroupID != "" {
return &settings.GroupID, nil
}
case coredata.ConnectorProviderBitbucket:
settings, _ := dbConnector.BitbucketSettings()
if settings.Workspace != "" {
return &settings.Workspace, nil
}
case coredata.ConnectorProviderHeroku:
settings, _ := dbConnector.HerokuSettings()
if settings.TeamID != "" {
return &settings.TeamID, nil
}
case coredata.ConnectorProviderPagerDuty:
settings, _ := dbConnector.PagerDutySettings()
if settings.Subdomain != "" {
return &settings.Subdomain, nil
}
case coredata.ConnectorProviderAsana:
settings, _ := dbConnector.AsanaSettings()
if settings.WorkspaceGID != "" {
return &settings.WorkspaceGID, nil
}
case coredata.ConnectorProviderSnyk:
settings, _ := dbConnector.SnykSettings()
if settings.OrgID != "" {
return &settings.OrgID, nil
}
case coredata.ConnectorProviderNetlify:
settings, _ := dbConnector.NetlifySettings()
if settings.AccountSlug != "" {
return &settings.AccountSlug, nil
}
case coredata.ConnectorProviderClickUp:
settings, _ := dbConnector.ClickUpSettings()
if settings.TeamID != "" {
return &settings.TeamID, nil
}
case coredata.ConnectorProviderVercel:
settings, _ := dbConnector.VercelSettings()
if settings.TeamID != "" {
return &settings.TeamID, nil
}
cfg, ok := providerOrgConfigs[dbConnector.Provider]
if !ok {
return nil, nil
}
return nil, nil
slug := cfg.SelectedSlug(dbConnector)
if slug == "" {
return nil, nil
}
return &slug, nil
}
// Permission is the resolver for the permission field.