do not pass array of options directly
Signed-off-by: Ainhoa Larumbe <ainhoaL@users.noreply.github.com>
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user