do not pass array of options directly

Signed-off-by: Ainhoa Larumbe <ainhoaL@users.noreply.github.com>
This commit is contained in:
Ainhoa Larumbe
2023-04-05 16:24:06 +01:00
parent 82cd54cac8
commit 49584cebc4
3 changed files with 83 additions and 37 deletions
+1 -1
View File
@@ -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.
@@ -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<string, any>
| CreatePermissionIntegrationRouterResourceOptions<string, any>[],
| OptionResources<string, any>,
) => {
const router = createPermissionIntegrationRouter(
resourceOptions as Parameters<typeof createPermissionIntegrationRouter>[0],
@@ -207,6 +207,13 @@ export type CreatePermissionIntegrationRouterResourceOptions<
) => Promise<Array<TResource | undefined>>;
};
export type OptionResources<TResourceType extends string, TResource> = {
resources:
| { permissions: Array<Permission> }
| CreatePermissionIntegrationRouterResourceOptions<TResourceType, TResource>
| Array<CreatePermissionIntegrationRouterResourceOptions<string, any>>;
};
/**
* 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<TResourceType, TResource>
| {
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<Permission>;
}): express.Router;
export function createPermissionIntegrationRouter(
options:
| { permissions: Array<Permission> }
| { resources: { permissions: Array<Permission> } },
): 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<Permission> }
| CreatePermissionIntegrationRouterResourceOptions<TResourceType, TResource>
| Array<CreatePermissionIntegrationRouterResourceOptions<string, any>>,
| OptionResources<TResourceType, TResource>,
): 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<Permission> }).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<Permission> }
| 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<Permission> }
| CreatePermissionIntegrationRouterResourceOptions<
TResourceType,
TResource
>;
if (isCreatePermissionIntegrationRouterResourceOptions(option)) {
ruleMapByResourceType[option.resourceType] = createGetRule(
option.rules,