From 9335ad115e8633061dd1aa01240b58b4dbc55c79 Mon Sep 17 00:00:00 2001 From: Harry Hogg Date: Wed, 12 Oct 2022 08:15:43 +0100 Subject: [PATCH 1/3] Exported types for the permission router metadata endpoint Signed-off-by: Harry Hogg --- .changeset/hot-bugs-roll.md | 5 +++ plugins/permission-node/api-report.md | 15 +++++++ .../createPermissionIntegrationRouter.ts | 45 ++++++++++++++++--- 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 .changeset/hot-bugs-roll.md 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..59c85818ba 100644 --- a/plugins/permission-node/api-report.md +++ b/plugins/permission-node/api-report.md @@ -14,6 +14,7 @@ import { DefinitivePolicyDecision } from '@backstage/plugin-permission-common'; import { EvaluatorRequestOptions } from '@backstage/plugin-permission-common'; import express from 'express'; import { IdentifiedPermissionMessage } from '@backstage/plugin-permission-common'; +import { JsonSchema7Type } from 'zod-to-json-schema/src/parseDef'; import { NotCriteria } from '@backstage/plugin-permission-common'; import { Permission } from '@backstage/plugin-permission-common'; import { PermissionCondition } from '@backstage/plugin-permission-common'; @@ -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?: JsonSchema7Type; +}; + // @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..f912a2c4e0 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -36,6 +36,7 @@ import { isNotCriteria, isOrCriteria, } from './util'; +import { JsonSchema7Type } from 'zod-to-json-schema/src/parseDef'; const permissionCriteriaSchema: z.ZodSchema< PermissionCriteria @@ -102,6 +103,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?: JsonSchema7Type; +}; + +/** + * Response type for the .metadata endpoint. + * + * @public + */ +export type MetaDataResponse = { + permissions?: Permission[]; + rules: MetaDataResponseSerializedRule[]; +}; + const applyConditions = ( criteria: PermissionCriteria>, resource: TResource | undefined, @@ -191,14 +215,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); From a7e4adf169a130cd6106eab2385ace88bd842f1f Mon Sep 17 00:00:00 2001 From: Harry Hogg Date: Mon, 17 Oct 2022 17:00:10 +0100 Subject: [PATCH 2/3] Updated import location Signed-off-by: Harry Hogg --- plugins/permission-node/api-report.md | 4 ++-- .../src/integration/createPermissionIntegrationRouter.ts | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/permission-node/api-report.md b/plugins/permission-node/api-report.md index 59c85818ba..02696acc80 100644 --- a/plugins/permission-node/api-report.md +++ b/plugins/permission-node/api-report.md @@ -14,7 +14,6 @@ import { DefinitivePolicyDecision } from '@backstage/plugin-permission-common'; import { EvaluatorRequestOptions } from '@backstage/plugin-permission-common'; import express from 'express'; import { IdentifiedPermissionMessage } from '@backstage/plugin-permission-common'; -import { JsonSchema7Type } from 'zod-to-json-schema/src/parseDef'; import { NotCriteria } from '@backstage/plugin-permission-common'; import { Permission } from '@backstage/plugin-permission-common'; import { PermissionCondition } from '@backstage/plugin-permission-common'; @@ -27,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 = { @@ -172,7 +172,7 @@ export type MetaDataResponseSerializedRule = { name: string; description: string; resourceType: string; - paramsSchema?: JsonSchema7Type; + paramsSchema?: ReturnType; }; // @public diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts index f912a2c4e0..ffdd1153e2 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -36,7 +36,6 @@ import { isNotCriteria, isOrCriteria, } from './util'; -import { JsonSchema7Type } from 'zod-to-json-schema/src/parseDef'; const permissionCriteriaSchema: z.ZodSchema< PermissionCriteria @@ -113,7 +112,7 @@ export type MetaDataResponseSerializedRule = { name: string; description: string; resourceType: string; - paramsSchema?: JsonSchema7Type; + paramsSchema?: ReturnType; }; /** From fd7fc3902ec1483cd53b63f371e1e8cfa9f726c1 Mon Sep 17 00:00:00 2001 From: Harry Hogg Date: Mon, 17 Oct 2022 17:45:16 +0100 Subject: [PATCH 3/3] Updated MetaData wording to Metadata Signed-off-by: Harry Hogg --- plugins/permission-node/api-report.md | 6 +++--- .../integration/createPermissionIntegrationRouter.ts | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/permission-node/api-report.md b/plugins/permission-node/api-report.md index 02696acc80..3f712fe362 100644 --- a/plugins/permission-node/api-report.md +++ b/plugins/permission-node/api-report.md @@ -162,13 +162,13 @@ export const makeCreatePermissionRule: < ) => PermissionRule; // @public -export type MetaDataResponse = { +export type MetadataResponse = { permissions?: Permission[]; - rules: MetaDataResponseSerializedRule[]; + rules: MetadataResponseSerializedRule[]; }; // @public -export type MetaDataResponseSerializedRule = { +export type MetadataResponseSerializedRule = { name: string; description: string; resourceType: string; diff --git a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts index ffdd1153e2..23b59c9c43 100644 --- a/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts +++ b/plugins/permission-node/src/integration/createPermissionIntegrationRouter.ts @@ -108,7 +108,7 @@ export type ApplyConditionsResponse = { * * @public */ -export type MetaDataResponseSerializedRule = { +export type MetadataResponseSerializedRule = { name: string; description: string; resourceType: string; @@ -120,9 +120,9 @@ export type MetaDataResponseSerializedRule = { * * @public */ -export type MetaDataResponse = { +export type MetadataResponse = { permissions?: Permission[]; - rules: MetaDataResponseSerializedRule[]; + rules: MetadataResponseSerializedRule[]; }; const applyConditions = ( @@ -214,7 +214,7 @@ export const createPermissionIntegrationRouter = < router.use(express.json()); router.get('/.well-known/backstage/permissions/metadata', (_, res) => { - const serializedRules: MetaDataResponseSerializedRule[] = rules.map( + const serializedRules: MetadataResponseSerializedRule[] = rules.map( rule => ({ name: rule.name, description: rule.description, @@ -223,7 +223,7 @@ export const createPermissionIntegrationRouter = < }), ); - const responseJson: MetaDataResponse = { + const responseJson: MetadataResponse = { permissions, rules: serializedRules, };