Files
probo/pkg/server/api/connect/v1/graphql/scim.graphql
Cursor Agent 6f4ac54a27 Expose bridge sync errors in SCIM API
Add a dedicated SCIMBridge syncError field to the Connect GraphQL API
and populate it from the core bridge model.

Update the connector cards to read bridge state and syncError directly
from the bridge object instead of inferring failures from event
history.

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

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-05-27 18:10:22 -07:00

182 lines
4.7 KiB
GraphQL

type SCIMConfiguration implements Node {
id: ID!
endpointUrl: String! @goField(forceResolver: true)
createdAt: Datetime!
updatedAt: Datetime!
organization: Organization @goField(forceResolver: true)
bridge: SCIMBridge @goField(forceResolver: true)
events(
first: Int
after: CursorKey
last: Int
before: CursorKey
orderBy: SCIMEventOrder
): SCIMEventConnection @goField(forceResolver: true)
permission(action: String!): Boolean!
@goField(forceResolver: true)
@session(required: PRESENT)
}
type SCIMBridge implements Node {
id: ID!
state: SCIMBridgeState!
syncError: String
scimConfiguration: SCIMConfiguration @goField(forceResolver: true)
connector: Connector @goField(forceResolver: true)
type: SCIMBridgeType!
excludedUserNames: [String!]!
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean!
@goField(forceResolver: true)
@session(required: PRESENT)
}
type Connector implements Node {
id: ID!
provider: ConnectorProvider!
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean!
@goField(forceResolver: true)
@session(required: PRESENT)
}
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")
MICROSOFT_365
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ConnectorProviderMicrosoft365")
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")
}
enum SCIMBridgeType
@goModel(model: "go.probo.inc/probo/pkg/coredata.SCIMBridgeType") {
GOOGLE_WORKSPACE @goEnum(value: "go.probo.inc/probo/pkg/coredata.SCIMBridgeTypeGoogleWorkspace")
MICROSOFT_365 @goEnum(value: "go.probo.inc/probo/pkg/coredata.SCIMBridgeTypeMicrosoft365")
}
type SCIMBridgeTypeInfo {
type: SCIMBridgeType!
oauth2Scopes: [String!]!
}
enum SCIMBridgeState
@goModel(model: "go.probo.inc/probo/pkg/coredata.SCIMBridgeState") {
PENDING @goEnum(value: "go.probo.inc/probo/pkg/coredata.SCIMBridgeStatePending")
ACTIVE @goEnum(value: "go.probo.inc/probo/pkg/coredata.SCIMBridgeStateActive")
FAILED @goEnum(value: "go.probo.inc/probo/pkg/coredata.SCIMBridgeStateFailed")
}
type SCIMEvent implements Node {
id: ID!
method: String!
path: String!
statusCode: Int!
requestBody: String
responseBody: String
errorMessage: String
userName: String!
ipAddress: String!
createdAt: Datetime!
permission(action: String!): Boolean!
@goField(forceResolver: true)
@session(required: PRESENT)
}
enum SCIMEventOrderField
@goModel(model: "go.probo.inc/probo/pkg/coredata.SCIMEventOrderField") {
CREATED_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.SCIMEventOrderFieldCreatedAt"
)
}
input SCIMEventOrder
@goModel(
model: "go.probo.inc/probo/pkg/server/api/connect/v1/types.SCIMEventOrderBy"
) {
direction: OrderDirection!
field: SCIMEventOrderField!
}
type SCIMEventConnection
@goModel(
model: "go.probo.inc/probo/pkg/server/api/connect/v1/types.SCIMEventConnection"
) {
edges: [SCIMEventEdge!]!
pageInfo: PageInfo!
totalCount: Int @goField(forceResolver: true)
}
type SCIMEventEdge {
node: SCIMEvent!
cursor: CursorKey!
}
extend type Mutation {
createSCIMConfiguration(
input: CreateSCIMConfigurationInput!
): CreateSCIMConfigurationPayload @session(required: PRESENT)
deleteSCIMConfiguration(
input: DeleteSCIMConfigurationInput!
): DeleteSCIMConfigurationPayload @session(required: PRESENT)
regenerateSCIMToken(
input: RegenerateSCIMTokenInput!
): RegenerateSCIMTokenPayload @session(required: PRESENT)
updateSCIMBridge(
input: UpdateSCIMBridgeInput!
): UpdateSCIMBridgePayload @session(required: PRESENT)
}
input CreateSCIMConfigurationInput {
organizationId: ID!
connectorId: ID
}
input DeleteSCIMConfigurationInput {
organizationId: ID!
scimConfigurationId: ID!
}
input RegenerateSCIMTokenInput {
organizationId: ID!
scimConfigurationId: ID!
}
input UpdateSCIMBridgeInput {
organizationId: ID!
scimBridgeId: ID!
excludedUserNames: [String!]!
}
type CreateSCIMConfigurationPayload {
scimConfiguration: SCIMConfiguration!
scimBridge: SCIMBridge
token: String!
}
type DeleteSCIMConfigurationPayload {
deletedScimConfigurationId: ID!
}
type RegenerateSCIMTokenPayload {
scimConfiguration: SCIMConfiguration!
token: String!
}
type UpdateSCIMBridgePayload {
scimBridge: SCIMBridge!
}