From 49584cebc4241ecd4a10667dd3369c8f0df01187 Mon Sep 17 00:00:00 2001 From: Ainhoa Larumbe Date: Wed, 5 Apr 2023 16:24:06 +0100 Subject: [PATCH] do not pass array of options directly Signed-off-by: Ainhoa Larumbe --- .changeset/slimy-turkeys-return.md | 2 +- .../createPermissionIntegrationRouter.test.ts | 33 +++---- .../createPermissionIntegrationRouter.ts | 85 ++++++++++++++----- 3 files changed, 83 insertions(+), 37 deletions(-) diff --git a/.changeset/slimy-turkeys-return.md b/.changeset/slimy-turkeys-return.md index 5f8f01479f..4229da49e3 100644 --- a/.changeset/slimy-turkeys-return.md +++ b/.changeset/slimy-turkeys-return.md @@ -2,4 +2,4 @@ '@backstage/plugin-permission-node': minor --- -createPermissionIntegrationRouter now can also take an array of CreatePermissionIntegrationRouterResourceOptions, accepting rules and permissions for multiple resource types. +`createPermissionIntegrationRouter` now can also take an array of `CreatePermissionIntegrationRouterResourceOptions`, accepting rules and permissions for multiple resource types. diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts index a54080af2d..323a56329d 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.test.ts @@ -26,6 +26,7 @@ import { createPermissionIntegrationRouter, CreatePermissionIntegrationRouterResourceOptions, createConditionAuthorizer, + OptionResources, } from './createPermissionIntegrationRouter'; import { createPermissionRule } from './createPermissionRule'; @@ -91,20 +92,22 @@ const defaultMockedGetResources2: CreatePermissionIntegrationRouterResourceOptio resourceRefs.map(resourceRef => ({ id: resourceRef })), ); -const mockedResourceOptions = [ - { - resourceType: 'test-resource', - permissions: [testPermission], - getResources: defaultMockedGetResources1, - rules: [testRule1, testRule2], - }, - { - resourceType: 'test-resource-2', - permissions: [testPermission2], - getResources: defaultMockedGetResources2, - rules: [testRule3], - }, -]; +const mockedResourceOptions = { + resources: [ + { + resourceType: 'test-resource', + permissions: [testPermission], + getResources: defaultMockedGetResources1, + rules: [testRule1, testRule2], + }, + { + resourceType: 'test-resource-2', + permissions: [testPermission2], + getResources: defaultMockedGetResources2, + rules: [testRule3], + }, + ], +}; const createApp = ( mockedGetResources: @@ -125,7 +128,7 @@ const createApp = ( const createAppWithResources = ( resourceOptions: | CreatePermissionIntegrationRouterResourceOptions - | CreatePermissionIntegrationRouterResourceOptions[], + | OptionResources, ) => { const router = createPermissionIntegrationRouter( resourceOptions as Parameters[0], diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts index 2a2342bc8e..6eb41aca71 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -207,6 +207,13 @@ export type CreatePermissionIntegrationRouterResourceOptions< ) => Promise>; }; +export type OptionResources = { + resources: + | { permissions: Array } + | CreatePermissionIntegrationRouterResourceOptions + | Array>; +}; + /** * Create an express Router which provides an authorization route to allow * integration between the permission backend and other Backstage backend @@ -252,10 +259,14 @@ export function createPermissionIntegrationRouter< TResourceType extends string, TResource, >( - options: CreatePermissionIntegrationRouterResourceOptions< - TResourceType, - TResource - >, + options: + | CreatePermissionIntegrationRouterResourceOptions + | { + resources: CreatePermissionIntegrationRouterResourceOptions< + TResourceType, + TResource + >; + }, ): express.Router; /** @@ -264,9 +275,11 @@ export function createPermissionIntegrationRouter< * permissions and routes of a plugin. * @public */ -export function createPermissionIntegrationRouter(options: { - permissions: Array; -}): express.Router; +export function createPermissionIntegrationRouter( + options: + | { permissions: Array } + | { resources: { permissions: Array } }, +): express.Router; /** * @@ -280,8 +293,8 @@ export function createPermissionIntegrationRouter< TResource1, TResourceType2 extends string, TResource2, ->( - options: [ +>(options: { + resources: [ CreatePermissionIntegrationRouterResourceOptions< TResourceType1, TResource1 @@ -290,8 +303,8 @@ export function createPermissionIntegrationRouter< TResourceType2, TResource2 >, - ], -): express.Router; + ]; +}): express.Router; /** * @@ -307,8 +320,8 @@ export function createPermissionIntegrationRouter< TResource2, TResourceType3 extends string, TResource3, ->( - options: [ +>(options: { + resources: [ CreatePermissionIntegrationRouterResourceOptions< TResourceType1, TResource1 @@ -321,8 +334,8 @@ export function createPermissionIntegrationRouter< TResourceType3, TResource3 >, - ], -): express.Router; + ]; +}): express.Router; /** * @public @@ -334,9 +347,15 @@ export function createPermissionIntegrationRouter< options: | { permissions: Array } | CreatePermissionIntegrationRouterResourceOptions - | Array>, + | OptionResources, ): express.Router { - const allOptions = [options].flat(); + const optionsWithResources = options as OptionResources< + TResourceType, + TResource + >; + const allOptions = [ + optionsWithResources.resources ? optionsWithResources.resources : options, + ].flat(); const allRules = allOptions.flatMap( option => ( @@ -347,11 +366,29 @@ export function createPermissionIntegrationRouter< ).rules || [], ); const allPermissions = allOptions - .flatMap(option => option.permissions) + .flatMap( + option => (option as { permissions: Array }).permissions, + ) .filter((p): p is Permission => !!p); const allResourceTypes = allOptions.reduce((acc, option) => { - if (isCreatePermissionIntegrationRouterResourceOptions(option)) { - acc.push(option.resourceType); + if ( + isCreatePermissionIntegrationRouterResourceOptions( + option as + | { permissions: Array } + | CreatePermissionIntegrationRouterResourceOptions< + TResourceType, + TResource + >, + ) + ) { + acc.push( + ( + option as CreatePermissionIntegrationRouterResourceOptions< + TResourceType, + TResource + > + ).resourceType, + ); } return acc; }, [] as string[]); @@ -392,7 +429,13 @@ export function createPermissionIntegrationRouter< >['getResources'] > = {}; - for (const option of allOptions) { + for (let option of allOptions) { + option = option as + | { permissions: Array } + | CreatePermissionIntegrationRouterResourceOptions< + TResourceType, + TResource + >; if (isCreatePermissionIntegrationRouterResourceOptions(option)) { ruleMapByResourceType[option.resourceType] = createGetRule( option.rules,