Files
probo/pkg/server/api/console/v1/graphql/connector.graphql
Cursor Agent 0920785bdf Add Metabase access review source
Implement Metabase as a first-class access review connector backed by
GET /api/user, including account mapping and error handling in the
driver. Register the provider with API-key auth metadata and required
instance URL settings so connectors can be created and resolved
consistently.

Expose Metabase through the console GraphQL and UI flows by adding the
provider enum value, API-key extra setting field wiring, and source
label mapping. Add migration support for the connector_provider enum and
cover driver/provider behavior with focused tests.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
Signed-off-by: Cursor Agent <cursoragent@cursor.com>
2026-05-28 18:36:36 -07:00

167 lines
5.3 KiB
GraphQL

enum ConnectorProvider
@goModel(model: "go.probo.inc/probo/pkg/coredata.ConnectorProvider") {
SLACK @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderSlack")
GOOGLE_WORKSPACE
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderGoogleWorkspace"
)
LINEAR @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderLinear")
ONE_PASSWORD
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderOnePassword"
)
HUBSPOT
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderHubSpot")
DOCUSIGN
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderDocuSign")
GRAFANA
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderGrafana")
NOTION @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderNotion")
BREX @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderBrex")
TALLY @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderTally")
CLOUDFLARE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderCloudflare")
OPENAI @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderOpenAI")
SENTRY @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderSentry")
SUPABASE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderSupabase")
GITHUB @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderGitHub")
INTERCOM
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderIntercom")
RESEND @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderResend")
MICROSOFT_365
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderMicrosoft365"
)
GITLAB @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderGitLab")
BITBUCKET
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderBitbucket")
HEROKU @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderHeroku")
PAGERDUTY
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderPagerDuty")
ASANA @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderAsana")
NETLIFY
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderNetlify")
CLICKUP
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderClickUp")
VERCEL @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderVercel")
MONDAY @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderMonday")
METABASE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderMetabase")
TAILSCALE
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderTailscale")
ANTHROPIC
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderAnthropic"
)
CURSOR @goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderCursor")
}
type ConnectorProviderInfo {
provider: ConnectorProvider!
displayName: String!
oauthConfigured: Boolean!
apiKeySupported: Boolean!
clientCredentialsSupported: Boolean!
oauth2Scopes: [String!]!
extraSettings: [ConnectorProviderSettingInfo!]!
}
type ConnectorProviderSettingInfo {
key: String!
label: String!
required: Boolean!
}
input ConnectorFilter {
providers: [ConnectorProvider!]
}
type Connector {
id: ID!
provider: ConnectorProvider!
oauth2Scopes: [String!]! @goField(forceResolver: true)
createdAt: Datetime!
}
type SlackConnection implements Node {
id: ID!
channel: String
channelId: String
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type SlackConnectionConnection {
edges: [SlackConnectionEdge!]!
pageInfo: PageInfo!
}
type SlackConnectionEdge {
cursor: CursorKey!
node: SlackConnection!
}
extend type Mutation {
createAPIKeyConnector(
input: CreateAPIKeyConnectorInput!
): CreateAPIKeyConnectorPayload!
createClientCredentialsConnector(
input: CreateClientCredentialsConnectorInput!
): CreateClientCredentialsConnectorPayload!
deleteConnector(input: DeleteConnectorInput!): DeleteConnectorPayload!
deleteSlackConnection(
input: DeleteSlackConnectionInput!
): DeleteSlackConnectionPayload!
}
input CreateAPIKeyConnectorInput {
organizationId: ID!
provider: ConnectorProvider!
apiKey: String!
tallyOrganizationId: String
sentryOrganizationSlug: String
supabaseOrganizationSlug: String
githubOrganization: String
grafanaBaseUrl: String
onePasswordScimBridgeUrl: String
metabaseInstanceUrl: String
}
type CreateAPIKeyConnectorPayload {
connector: Connector!
}
input CreateClientCredentialsConnectorInput {
organizationId: ID!
provider: ConnectorProvider!
clientId: String!
clientSecret: String!
tokenUrl: String!
scope: String
onePasswordAccountId: String
onePasswordRegion: String
}
type CreateClientCredentialsConnectorPayload {
connector: Connector
}
input DeleteConnectorInput {
connectorId: ID!
}
type DeleteConnectorPayload {
deletedConnectorId: ID!
}
input DeleteSlackConnectionInput {
slackConnectionId: ID!
}
type DeleteSlackConnectionPayload {
deletedSlackConnectionId: ID!
}