permission-node: added PermissionRuleAccessor

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2025-01-30 09:39:38 +01:00
parent a9621deada
commit b71f634e3b
4 changed files with 63 additions and 13 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-permission-node': patch
---
Added a new `PermissionRuleAccessor` type that encapsulates a lookup function for permission rules, which can be created by the new `PermissionsRegistryService` via the `getRuleAccessor` method. The `createConditionTransformer` and `createConditionAuthorizer` functions have been adapted to receive these accessors as arguments, with their older counterparts being deprecated.
+21 -6
View File
@@ -78,9 +78,14 @@ export type ConditionTransformer<TQuery> = (
) => PermissionCriteria<TQuery>;
// @public
export const createConditionAuthorizer: <TResource, TQuery>(
export function createConditionAuthorizer<TResource>(
permissionRuleAccessor: PermissionRuleAccessor<TResource>,
): (decision: PolicyDecision, resource: TResource | undefined) => boolean;
// @public @deprecated (undocumented)
export function createConditionAuthorizer<TResource, TQuery>(
rules: PermissionRule<TResource, TQuery, string>[],
) => (decision: PolicyDecision, resource: TResource | undefined) => boolean;
): (decision: PolicyDecision, resource: TResource | undefined) => boolean;
// @public
export function createConditionExports<
@@ -124,12 +129,15 @@ export const createConditionFactory: <
) => (params: TParams) => PermissionCondition<TResourceType, TParams>;
// @public
export const createConditionTransformer: <
export function createConditionTransformer<TQuery>(
permissionRuleAccessor: PermissionRuleAccessor<any, TQuery>,
): ConditionTransformer<TQuery>;
// @public @deprecated (undocumented)
export function createConditionTransformer<
TQuery,
TRules extends PermissionRule<any, TQuery, string>[],
>(
permissionRules: [...TRules],
) => ConditionTransformer<TQuery>;
>(permissionRules: [...TRules]): ConditionTransformer<TQuery>;
// @public
export function createPermissionIntegrationRouter<
@@ -331,6 +339,13 @@ export type PermissionRule<
toQuery(params: NoInfer_2<TParams>): PermissionCriteria<TQuery>;
};
// @public
export type PermissionRuleAccessor<
TResource = unknown,
TQuery = unknown,
TResourceType extends string = string,
> = (name: string) => PermissionRule<TResource, TQuery, TResourceType>;
// @public
export type PolicyQuery = {
permission: Permission;
@@ -20,7 +20,7 @@ import {
PermissionCondition,
PermissionCriteria,
} from '@backstage/plugin-permission-common';
import { PermissionRule } from '../types';
import { PermissionRule, PermissionRuleAccessor } from '../types';
import {
createGetRule,
isAndCriteria,
@@ -76,13 +76,26 @@ export type ConditionTransformer<TQuery> = (
*
* @public
*/
export const createConditionTransformer = <
export function createConditionTransformer<TQuery>(
permissionRuleAccessor: PermissionRuleAccessor<any, TQuery>,
): ConditionTransformer<TQuery>;
/**
* @public
* @deprecated Use the version of `createConditionTransformer` that accepts a `PermissionRuleAccessor` instead.
*/
export function createConditionTransformer<
TQuery,
TRules extends PermissionRule<any, TQuery, string>[],
>(
permissionRules: [...TRules],
): ConditionTransformer<TQuery> => {
const getRule = createGetRule(permissionRules);
>(permissionRules: [...TRules]): ConditionTransformer<TQuery>;
export function createConditionTransformer<TQuery>(
permissionRules:
| PermissionRule<any, TQuery, string>[]
| PermissionRuleAccessor<any, TQuery>,
): ConditionTransformer<TQuery> {
const getRule =
typeof permissionRules === 'function'
? permissionRules
: createGetRule(permissionRules);
return conditions => mapConditions(conditions, getRule);
};
}
+17
View File
@@ -66,3 +66,20 @@ export type PermissionRule<
*/
toQuery(params: NoInfer<TParams>): PermissionCriteria<TQuery>;
};
/**
* A function that can be used to look up permission rules by name for a particular resource type.
*
* @remarks
*
* Accessed via {@link @backstage/backend-plugin-api#PermissionsRegistryService.getRuleAccessor}.
*
* Will throw an error if a rule with the provided name does not exist.
*
* @public
*/
export type PermissionRuleAccessor<
TResource = unknown,
TQuery = unknown,
TResourceType extends string = string,
> = (name: string) => PermissionRule<TResource, TQuery, TResourceType>;