diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index 034ff0b9ed..ca5467fa6e 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -32,7 +32,7 @@ import { AuthorizeResult, AuthorizeDecision, AuthorizeQuery, - Identified, + IdentifiedPermissionMessage, AuthorizeRequest, AuthorizeResponse, isResourcePermission, @@ -73,11 +73,12 @@ const permissionSchema = z.union([ }), ]); -const querySchema: z.ZodSchema> = z.object({ - id: z.string(), - resourceRef: z.string().optional(), - permission: permissionSchema, -}); +const querySchema: z.ZodSchema> = + z.object({ + id: z.string(), + resourceRef: z.string().optional(), + permission: permissionSchema, + }); const requestSchema: z.ZodSchema = z.object({ items: z.array(querySchema), @@ -98,12 +99,12 @@ export interface RouterOptions { } const handleRequest = async ( - requests: Identified[], + requests: IdentifiedPermissionMessage[], user: BackstageIdentityResponse | undefined, policy: PermissionPolicy, permissionIntegrationClient: PermissionIntegrationClient, authHeader?: string, -): Promise[]> => { +): Promise[]> => { const applyConditionsLoaderFor = memoize((pluginId: string) => { return new DataLoader< ApplyConditionsRequestEntry, diff --git a/plugins/permission-common/src/PermissionClient.test.ts b/plugins/permission-common/src/PermissionClient.test.ts index 4f66bcffd3..36f26d883f 100644 --- a/plugins/permission-common/src/PermissionClient.test.ts +++ b/plugins/permission-common/src/PermissionClient.test.ts @@ -18,7 +18,11 @@ import { RestContext, rest } from 'msw'; import { setupServer } from 'msw/node'; import { ConfigReader } from '@backstage/config'; import { PermissionClient } from './PermissionClient'; -import { AuthorizeQuery, AuthorizeResult, Identified } from './types/api'; +import { + AuthorizeQuery, + AuthorizeResult, + IdentifiedPermissionMessage, +} from './types/api'; import { DiscoveryApi } from './types/discovery'; import { createPermission } from './permissions'; @@ -54,10 +58,12 @@ describe('PermissionClient', () => { }; const mockAuthorizeHandler = jest.fn((req, res, { json }: RestContext) => { - const responses = req.body.items.map((a: Identified) => ({ - id: a.id, - result: AuthorizeResult.ALLOW, - })); + const responses = req.body.items.map( + (a: IdentifiedPermissionMessage) => ({ + id: a.id, + result: AuthorizeResult.ALLOW, + }), + ); return res(json({ items: responses })); }); @@ -141,7 +147,7 @@ describe('PermissionClient', () => { mockAuthorizeHandler.mockImplementationOnce( (req, res, { json }: RestContext) => { const responses = req.body.items.map( - (a: Identified) => ({ + (a: IdentifiedPermissionMessage) => ({ id: a.id, outcome: AuthorizeResult.ALLOW, }), @@ -158,10 +164,12 @@ describe('PermissionClient', () => { it('should allow all when permission.enabled is false', async () => { mockAuthorizeHandler.mockImplementationOnce( (req, res, { json }: RestContext) => { - const responses = req.body.map((a: Identified) => ({ - id: a.id, - result: AuthorizeResult.DENY, - })); + const responses = req.body.map( + (a: IdentifiedPermissionMessage) => ({ + id: a.id, + result: AuthorizeResult.DENY, + }), + ); return res(json({ items: responses })); }, @@ -180,10 +188,12 @@ describe('PermissionClient', () => { it('should allow all when permission.enabled is not configured', async () => { mockAuthorizeHandler.mockImplementationOnce( (req, res, { json }: RestContext) => { - const responses = req.body.map((a: Identified) => ({ - id: a.id, - outcome: AuthorizeResult.DENY, - })); + const responses = req.body.map( + (a: IdentifiedPermissionMessage) => ({ + id: a.id, + outcome: AuthorizeResult.DENY, + }), + ); return res(json(responses)); }, diff --git a/plugins/permission-common/src/PermissionClient.ts b/plugins/permission-common/src/PermissionClient.ts index 9431050690..fbae34cc63 100644 --- a/plugins/permission-common/src/PermissionClient.ts +++ b/plugins/permission-common/src/PermissionClient.ts @@ -23,7 +23,7 @@ import { AuthorizeResult, AuthorizeQuery, AuthorizeDecision, - Identified, + IdentifiedPermissionMessage, PermissionCriteria, PermissionCondition, AuthorizeResponse, @@ -145,7 +145,7 @@ export class PermissionClient implements PermissionAuthorizer { const responsesById = responseBody.items.reduce((acc, r) => { acc[r.id] = r; return acc; - }, {} as Record>); + }, {} as Record>); return request.items.map(query => responsesById[query.id]); } diff --git a/plugins/permission-common/src/types/api.ts b/plugins/permission-common/src/types/api.ts index 5b46b955d8..c4d68ce3fa 100644 --- a/plugins/permission-common/src/types/api.ts +++ b/plugins/permission-common/src/types/api.ts @@ -21,7 +21,15 @@ import { Permission } from './permission'; * requests. * @public */ -export type Identified = T & { id: string }; +export type IdentifiedPermissionMessage = T & { id: string }; + +/** + * A batch of request or response items. + * @public + */ +export type PermissionMessageBatch = { + items: IdentifiedPermissionMessage[]; +}; /** * The result of an authorization request. @@ -55,9 +63,7 @@ export type AuthorizeQuery = { * A batch of authorization requests from {@link PermissionClient#authorize}. * @public */ -export type AuthorizeRequest = { - items: Identified[]; -}; +export type AuthorizeRequest = PermissionMessageBatch; /** * A condition returned with a CONDITIONAL authorization response. @@ -127,6 +133,4 @@ export type AuthorizeDecision = * A batch of authorization responses from {@link PermissionClient#authorize}. * @public */ -export type AuthorizeResponse = { - items: Identified[]; -}; +export type AuthorizeResponse = PermissionMessageBatch; diff --git a/plugins/permission-common/src/types/index.ts b/plugins/permission-common/src/types/index.ts index 71ef7695b8..83be625046 100644 --- a/plugins/permission-common/src/types/index.ts +++ b/plugins/permission-common/src/types/index.ts @@ -20,7 +20,8 @@ export type { AuthorizeRequest, AuthorizeDecision, AuthorizeResponse, - Identified, + IdentifiedPermissionMessage, + PermissionMessageBatch, PermissionCondition, PermissionCriteria, AllOfCriteria, diff --git a/plugins/permission-node/src/ServerPermissionClient.test.ts b/plugins/permission-node/src/ServerPermissionClient.test.ts index f2302f8f0d..842f996a6a 100644 --- a/plugins/permission-node/src/ServerPermissionClient.test.ts +++ b/plugins/permission-node/src/ServerPermissionClient.test.ts @@ -16,7 +16,7 @@ import { ServerPermissionClient } from './ServerPermissionClient'; import { - Identified, + IdentifiedPermissionMessage, AuthorizeQuery, AuthorizeResult, createPermission, @@ -32,10 +32,12 @@ import { RestContext, rest } from 'msw'; const server = setupServer(); const mockAuthorizeHandler = jest.fn((req, res, { json }: RestContext) => { - const responses = req.body.items.map((r: Identified) => ({ - id: r.id, - result: AuthorizeResult.ALLOW, - })); + const responses = req.body.items.map( + (r: IdentifiedPermissionMessage) => ({ + id: r.id, + result: AuthorizeResult.ALLOW, + }), + ); return res(json({ items: responses })); }); diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts index efb5d7c3a6..17e514432c 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -21,7 +21,7 @@ import { InputError } from '@backstage/errors'; import { errorHandler } from '@backstage/backend-common'; import { AuthorizeResult, - Identified, + IdentifiedPermissionMessage, PermissionCondition, PermissionCriteria, } from '@backstage/plugin-permission-common'; @@ -67,7 +67,7 @@ const applyConditionsRequestSchema = z.object({ * * @public */ -export type ApplyConditionsRequestEntry = Identified<{ +export type ApplyConditionsRequestEntry = IdentifiedPermissionMessage<{ resourceRef: string; resourceType: string; conditions: PermissionCriteria; @@ -88,7 +88,8 @@ export type ApplyConditionsRequest = { * * @public */ -export type ApplyConditionsResponseEntry = Identified; +export type ApplyConditionsResponseEntry = + IdentifiedPermissionMessage; /** * A batch of {@link ApplyConditionsResponseEntry} objects.