Merge pull request #14092 from backstage/permissions/metadata-response-types

Exported types for the permission router metadata endpoint
This commit is contained in:
Fredrik Adelöw
2022-10-18 09:22:14 +01:00
committed by GitHub
3 changed files with 57 additions and 7 deletions
+15
View File
@@ -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<TResource, TQuery, TResourceType, TParams>,
) => PermissionRule<TResource, TQuery, TResourceType, TParams>;
// @public
export type MetadataResponse = {
permissions?: Permission[];
rules: MetadataResponseSerializedRule[];
};
// @public
export type MetadataResponseSerializedRule = {
name: string;
description: string;
resourceType: string;
paramsSchema?: ReturnType<typeof zodToJsonSchema>;
};
// @public
export interface PermissionPolicy {
// (undocumented)
@@ -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<typeof zodToJsonSchema>;
};
/**
* Response type for the .metadata endpoint.
*
* @public
*/
export type MetadataResponse = {
permissions?: Permission[];
rules: MetadataResponseSerializedRule[];
};
const applyConditions = <TResourceType extends string, TResource>(
criteria: PermissionCriteria<PermissionCondition<TResourceType>>,
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);