From 6f4ac54a277728483e0460df7c40cd4f281197cb Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 28 May 2026 00:28:16 +0000 Subject: [PATCH] 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 Co-authored-by: Bryan FRIMIN --- .../settings/_components/GoogleWorkspaceConnector.tsx | 11 ++--------- .../settings/_components/Microsoft365Connector.tsx | 11 ++--------- pkg/server/api/connect/v1/graphql/scim.graphql | 1 + pkg/server/api/connect/v1/types/bridge.go | 5 +++-- 4 files changed, 8 insertions(+), 20 deletions(-) diff --git a/apps/console/src/pages/iam/organizations/settings/_components/GoogleWorkspaceConnector.tsx b/apps/console/src/pages/iam/organizations/settings/_components/GoogleWorkspaceConnector.tsx index 1fa120484..06d8b77e9 100644 --- a/apps/console/src/pages/iam/organizations/settings/_components/GoogleWorkspaceConnector.tsx +++ b/apps/console/src/pages/iam/organizations/settings/_components/GoogleWorkspaceConnector.tsx @@ -39,18 +39,11 @@ import { useOrganizationId } from "#/hooks/useOrganizationId"; const googleWorkspaceConnectorFragment = graphql` fragment GoogleWorkspaceConnectorFragment on SCIMConfiguration { id - eventsLatest: events(first: 1) { - edges { - node { - id - errorMessage - } - } - } bridge { id type state + syncError excludedUserNames connector { id @@ -96,7 +89,7 @@ export function GoogleWorkspaceConnector(props: { const organizationId = useOrganizationId(); const { __, dateTimeFormat } = useTranslate(); const bridgeState = bridge?.state ?? null; - const latestBridgeError = data?.eventsLatest?.edges?.[0]?.node?.errorMessage ?? null; + const latestBridgeError = bridge?.syncError ?? null; const isBridgeFailed = bridgeState === "FAILED"; const isBridgePending = bridgeState === "PENDING"; const bridgeStatusBadgeVariant = isBridgeFailed diff --git a/apps/console/src/pages/iam/organizations/settings/_components/Microsoft365Connector.tsx b/apps/console/src/pages/iam/organizations/settings/_components/Microsoft365Connector.tsx index 65c4f5432..84d6f5852 100644 --- a/apps/console/src/pages/iam/organizations/settings/_components/Microsoft365Connector.tsx +++ b/apps/console/src/pages/iam/organizations/settings/_components/Microsoft365Connector.tsx @@ -39,18 +39,11 @@ import { useOrganizationId } from "#/hooks/useOrganizationId"; const microsoft365ConnectorFragment = graphql` fragment Microsoft365ConnectorFragment on SCIMConfiguration { id - eventsLatest: events(first: 1) { - edges { - node { - id - errorMessage - } - } - } bridge { id type state + syncError excludedUserNames connector { id @@ -96,7 +89,7 @@ export function Microsoft365Connector(props: { const organizationId = useOrganizationId(); const { __, dateTimeFormat } = useTranslate(); const bridgeState = bridge?.state ?? null; - const latestBridgeError = data?.eventsLatest?.edges?.[0]?.node?.errorMessage ?? null; + const latestBridgeError = bridge?.syncError ?? null; const isBridgeFailed = bridgeState === "FAILED"; const isBridgePending = bridgeState === "PENDING"; const bridgeStatusBadgeVariant = isBridgeFailed diff --git a/pkg/server/api/connect/v1/graphql/scim.graphql b/pkg/server/api/connect/v1/graphql/scim.graphql index 1a2771b4b..a67d9ae50 100644 --- a/pkg/server/api/connect/v1/graphql/scim.graphql +++ b/pkg/server/api/connect/v1/graphql/scim.graphql @@ -23,6 +23,7 @@ type SCIMConfiguration implements Node { type SCIMBridge implements Node { id: ID! state: SCIMBridgeState! + syncError: String scimConfiguration: SCIMConfiguration @goField(forceResolver: true) connector: Connector @goField(forceResolver: true) type: SCIMBridgeType! diff --git a/pkg/server/api/connect/v1/types/bridge.go b/pkg/server/api/connect/v1/types/bridge.go index 4fed3cec4..74a143d5c 100644 --- a/pkg/server/api/connect/v1/types/bridge.go +++ b/pkg/server/api/connect/v1/types/bridge.go @@ -25,8 +25,9 @@ func NewSCIMBridge(bridge *coredata.SCIMBridge) *SCIMBridge { } return &SCIMBridge{ - ID: bridge.ID, - State: bridge.State, + ID: bridge.ID, + State: bridge.State, + SyncError: bridge.SyncError, ScimConfiguration: &SCIMConfiguration{ ID: bridge.ScimConfigurationID, },