permission-node: switch to array for getResources return value

Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
This commit is contained in:
MT Lewis
2021-12-20 17:17:20 +00:00
parent 419ca637c0
commit 8e72b573aa
5 changed files with 20 additions and 14 deletions
@@ -22,10 +22,7 @@ import { createPermissionIntegrationRouter } from './createPermissionIntegration
const mockGetResources: jest.MockedFunction<
Parameters<typeof createPermissionIntegrationRouter>[0]['getResources']
> = jest.fn(async resourceRefs =>
resourceRefs.reduce(
(acc, resourceRef) => ({ ...acc, [resourceRef]: { id: resourceRef } }),
{},
),
resourceRefs.map(resourceRef => ({ id: resourceRef })),
);
const testRule1 = {
@@ -251,7 +248,9 @@ describe('createPermissionIntegrationRouter', () => {
});
it('returns 200/DENY when resource is not found', async () => {
mockGetResources.mockReturnValueOnce(Promise.resolve({}));
mockGetResources.mockImplementationOnce(async resourceRefs =>
resourceRefs.map(() => undefined),
);
const response = await request(app)
.post('/.well-known/backstage/permissions/apply-conditions')
@@ -156,7 +156,9 @@ const applyConditions = <TResource>(
export const createPermissionIntegrationRouter = <TResource>(options: {
resourceType: string;
rules: PermissionRule<TResource, any>[];
getResources: (resourceRefs: string[]) => Promise<Record<string, TResource>>;
getResources: (
resourceRefs: string[],
) => Promise<Array<TResource | undefined>>;
}): express.Router => {
const { resourceType, rules, getResources } = options;
const router = Router();
@@ -188,9 +190,15 @@ export const createPermissionIntegrationRouter = <TResource>(options: {
assertValidResourceTypes(body);
const resources = await getResources(
Array.from(new Set(body.map(({ resourceRef }) => resourceRef))),
const resourceRefs = Array.from(
new Set(body.map(({ resourceRef }) => resourceRef)),
);
const resourceArray = await getResources(resourceRefs);
const resources = resourceRefs.reduce((acc, resourceRef, index) => {
acc[resourceRef] = resourceArray[index];
return acc;
}, {} as Record<string, TResource | undefined>);
return res.status(200).json(
body.map(request => ({