diff --git a/.changeset/hot-bugs-roll.md b/.changeset/hot-bugs-roll.md new file mode 100644 index 0000000000..babc909f45 --- /dev/null +++ b/.changeset/hot-bugs-roll.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-permission-node': patch +--- + +Exported types for the .metadata endpoint of the permission router diff --git a/plugins/permission-node/api-report.md b/plugins/permission-node/api-report.md index 7feb20d7aa..3f712fe362 100644 --- a/plugins/permission-node/api-report.md +++ b/plugins/permission-node/api-report.md @@ -26,6 +26,7 @@ import { QueryPermissionRequest } from '@backstage/plugin-permission-common'; import { ResourcePermission } from '@backstage/plugin-permission-common'; import { TokenManager } from '@backstage/backend-common'; import { z } from 'zod'; +import zodToJsonSchema from 'zod-to-json-schema'; // @public export type ApplyConditionsRequest = { @@ -160,6 +161,20 @@ export const makeCreatePermissionRule: < rule: PermissionRule, ) => PermissionRule; +// @public +export type MetadataResponse = { + permissions?: Permission[]; + rules: MetadataResponseSerializedRule[]; +}; + +// @public +export type MetadataResponseSerializedRule = { + name: string; + description: string; + resourceType: string; + paramsSchema?: ReturnType; +}; + // @public export interface PermissionPolicy { // (undocumented) diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts index 52f34d7e6a..23b59c9c43 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -102,6 +102,29 @@ export type ApplyConditionsResponse = { items: ApplyConditionsResponseEntry[]; }; +/** + * Serialized permission rules, with the paramsSchema + * converted from a ZodSchema to a JsonSchema. + * + * @public + */ +export type MetadataResponseSerializedRule = { + name: string; + description: string; + resourceType: string; + paramsSchema?: ReturnType; +}; + +/** + * Response type for the .metadata endpoint. + * + * @public + */ +export type MetadataResponse = { + permissions?: Permission[]; + rules: MetadataResponseSerializedRule[]; +}; + const applyConditions = ( criteria: PermissionCriteria>, resource: TResource | undefined, @@ -191,14 +214,21 @@ export const createPermissionIntegrationRouter = < router.use(express.json()); router.get('/.well-known/backstage/permissions/metadata', (_, res) => { - const serializableRules = rules.map(rule => ({ - name: rule.name, - description: rule.description, - resourceType: rule.resourceType, - paramsSchema: zodToJsonSchema(rule.paramsSchema ?? z.object({})), - })); + const serializedRules: MetadataResponseSerializedRule[] = rules.map( + rule => ({ + name: rule.name, + description: rule.description, + resourceType: rule.resourceType, + paramsSchema: zodToJsonSchema(rule.paramsSchema ?? z.object({})), + }), + ); - return res.json({ permissions, rules: serializableRules }); + const responseJson: MetadataResponse = { + permissions, + rules: serializedRules, + }; + + return res.json(responseJson); }); const getRule = createGetRule(rules);