From 6206039bb17a0369676e7e26c856197005b7467a Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Tue, 9 Apr 2024 15:18:59 +0300 Subject: [PATCH] fix: entity owner relation resolution in notifications use relations instead `spec.owner` field Signed-off-by: Heikki Hellgren --- .changeset/weak-feet-whisper.md | 5 ++ .../src/service/router.ts | 46 +++++++------------ 2 files changed, 22 insertions(+), 29 deletions(-) create mode 100644 .changeset/weak-feet-whisper.md diff --git a/.changeset/weak-feet-whisper.md b/.changeset/weak-feet-whisper.md new file mode 100644 index 0000000000..1d2e4013eb --- /dev/null +++ b/.changeset/weak-feet-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-notifications-backend': patch +--- + +Fix entity owner resolution in notifications diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts index ea988d851b..ac50847033 100644 --- a/plugins/notifications-backend/src/service/router.ts +++ b/plugins/notifications-backend/src/service/router.ts @@ -28,6 +28,7 @@ import { isGroupEntity, isUserEntity, RELATION_HAS_MEMBER, + RELATION_OWNED_BY, RELATION_PARENT_OF, stringifyEntityRef, } from '@backstage/catalog-model'; @@ -99,17 +100,13 @@ export async function createRouter( return []; } + const fields = ['kind', 'metadata.name', 'metadata.namespace', 'relations']; + const refs = Array.isArray(entityRef) ? entityRef : [entityRef]; const entities = await catalogClient.getEntitiesByRefs( { entityRefs: refs, - fields: [ - 'kind', - 'metadata.name', - 'metadata.namespace', - 'relations', - 'spec.owner', - ], + fields, }, { token }, ); @@ -122,29 +119,17 @@ export async function createRouter( return [stringifyEntityRef(entity)]; } else if (isGroupEntity(entity) && entity.relations) { const users = entity.relations - .filter( - relation => - relation.type === RELATION_HAS_MEMBER && relation.targetRef, - ) + .filter(relation => relation.type === RELATION_HAS_MEMBER) .map(r => r.targetRef); const childGroupRefs = entity.relations - .filter( - relation => - relation.type === RELATION_PARENT_OF && relation.targetRef, - ) + .filter(relation => relation.type === RELATION_PARENT_OF) .map(r => r.targetRef); const childGroups = await catalogClient.getEntitiesByRefs( { entityRefs: childGroupRefs, - fields: [ - 'kind', - 'metadata.name', - 'metadata.namespace', - 'relations', - 'spec.owner', - ], + fields, }, { token }, ); @@ -152,13 +137,16 @@ export async function createRouter( childGroups.items.map(mapEntity), ); return [...users, ...childGroupUsers.flat(2)]; - } else if (!isGroupEntity(entity) && entity.spec?.owner) { - const owner = await catalogClient.getEntityByRef( - entity.spec.owner as string, - { token }, - ); - if (owner) { - return mapEntity(owner); + } else if (entity.relations) { + const ownerRef = entity.relations.find( + relation => relation.type === RELATION_OWNED_BY, + )?.targetRef; + + if (ownerRef) { + const owner = await catalogClient.getEntityByRef(ownerRef, { token }); + if (owner) { + return mapEntity(owner); + } } }