Rename permission backend request and response types

Signed-off-by: Joe Porpeglia <josephp@spotify.com>
This commit is contained in:
Joe Porpeglia
2022-03-22 10:24:08 -04:00
committed by Joe Porpeglia
parent 970814ed38
commit e43290ce96
14 changed files with 114 additions and 90 deletions
@@ -19,7 +19,7 @@ import { setupServer } from 'msw/node';
import { ConfigReader } from '@backstage/config';
import { PermissionClient } from './PermissionClient';
import {
AuthorizeQuery,
EvaluatePermissionRequest,
AuthorizeResult,
IdentifiedPermissionMessage,
} from './types/api';
@@ -59,7 +59,7 @@ describe('PermissionClient', () => {
const mockAuthorizeHandler = jest.fn((req, res, { json }: RestContext) => {
const responses = req.body.items.map(
(a: IdentifiedPermissionMessage<AuthorizeQuery>) => ({
(a: IdentifiedPermissionMessage<EvaluatePermissionRequest>) => ({
id: a.id,
result: AuthorizeResult.ALLOW,
}),
@@ -147,7 +147,7 @@ describe('PermissionClient', () => {
mockAuthorizeHandler.mockImplementationOnce(
(req, res, { json }: RestContext) => {
const responses = req.body.items.map(
(a: IdentifiedPermissionMessage<AuthorizeQuery>) => ({
(a: IdentifiedPermissionMessage<EvaluatePermissionRequest>) => ({
id: a.id,
outcome: AuthorizeResult.ALLOW,
}),
@@ -165,7 +165,7 @@ describe('PermissionClient', () => {
mockAuthorizeHandler.mockImplementationOnce(
(req, res, { json }: RestContext) => {
const responses = req.body.map(
(a: IdentifiedPermissionMessage<AuthorizeQuery>) => ({
(a: IdentifiedPermissionMessage<EvaluatePermissionRequest>) => ({
id: a.id,
result: AuthorizeResult.DENY,
}),
@@ -189,7 +189,7 @@ describe('PermissionClient', () => {
mockAuthorizeHandler.mockImplementationOnce(
(req, res, { json }: RestContext) => {
const responses = req.body.map(
(a: IdentifiedPermissionMessage<AuthorizeQuery>) => ({
(a: IdentifiedPermissionMessage<EvaluatePermissionRequest>) => ({
id: a.id,
outcome: AuthorizeResult.DENY,
}),
@@ -21,13 +21,13 @@ import * as uuid from 'uuid';
import { z } from 'zod';
import {
AuthorizeResult,
AuthorizeQuery,
AuthorizeDecision,
EvaluatePermissionRequest,
EvaluatePermissionResponse,
IdentifiedPermissionMessage,
PermissionCriteria,
PermissionCondition,
AuthorizeResponse,
AuthorizeRequest,
EvaluatePermissionResponseBatch,
EvaluatePermissionRequestBatch,
} from './types/api';
import { DiscoveryApi } from './types/discovery';
import {
@@ -107,9 +107,9 @@ export class PermissionClient implements PermissionAuthorizer {
* @public
*/
async authorize(
queries: AuthorizeQuery[],
queries: EvaluatePermissionRequest[],
options?: AuthorizeRequestOptions,
): Promise<AuthorizeDecision[]> {
): Promise<EvaluatePermissionResponse[]> {
// TODO(permissions): it would be great to provide some kind of typing guarantee that
// conditional responses will only ever be returned for requests containing a resourceType
// but no resourceRef. That way clients who aren't prepared to handle filtering according
@@ -119,7 +119,7 @@ export class PermissionClient implements PermissionAuthorizer {
return queries.map(_ => ({ result: AuthorizeResult.ALLOW }));
}
const request: AuthorizeRequest = {
const request: EvaluatePermissionRequestBatch = {
items: queries.map(query => ({
id: uuid.v4(),
...query,
@@ -145,7 +145,7 @@ export class PermissionClient implements PermissionAuthorizer {
const responsesById = responseBody.items.reduce((acc, r) => {
acc[r.id] = r;
return acc;
}, {} as Record<string, IdentifiedPermissionMessage<AuthorizeDecision>>);
}, {} as Record<string, IdentifiedPermissionMessage<EvaluatePermissionResponse>>);
return request.items.map(query => responsesById[query.id]);
}
@@ -155,9 +155,9 @@ export class PermissionClient implements PermissionAuthorizer {
}
private assertValidResponse(
request: AuthorizeRequest,
request: EvaluatePermissionRequestBatch,
json: any,
): asserts json is AuthorizeResponse {
): asserts json is EvaluatePermissionResponseBatch {
const authorizedResponses = responseSchema.parse(json);
const responseIds = authorizedResponses.items.map(r => r.id);
const hasAllRequestIds = request.items.every(r =>
+21 -19
View File
@@ -90,21 +90,6 @@ export type PolicyDecision =
| DefinitivePolicyDecision
| ConditionalPolicyDecision;
/**
* An individual authorization request for {@link PermissionClient#authorize}.
* @public
*/
export type AuthorizeQuery = {
permission: Permission;
resourceRef?: string;
};
/**
* A batch of authorization requests from {@link PermissionClient#authorize}.
* @public
*/
export type AuthorizeRequest = PermissionMessageBatch<AuthorizeQuery>;
/**
* A condition returned with a CONDITIONAL authorization response.
*
@@ -159,10 +144,26 @@ export type PermissionCriteria<TQuery> =
| TQuery;
/**
* An individual authorization response from {@link PermissionClient#authorize}.
* An individual request sent to the permission backend.
* @public
*/
export type AuthorizeDecision =
export type EvaluatePermissionRequest = {
permission: Permission;
resourceRef?: string;
};
/**
* A batch of requests sent to the permission backend.
* @public
*/
export type EvaluatePermissionRequestBatch =
PermissionMessageBatch<EvaluatePermissionRequest>;
/**
* An individual response from the permission backend.
* @public
*/
export type EvaluatePermissionResponse =
| { result: AuthorizeResult.ALLOW | AuthorizeResult.DENY }
| {
result: AuthorizeResult.CONDITIONAL;
@@ -170,7 +171,8 @@ export type AuthorizeDecision =
};
/**
* A batch of authorization responses from {@link PermissionClient#authorize}.
* A batch of responses the permission backend.
* @public
*/
export type AuthorizeResponse = PermissionMessageBatch<AuthorizeDecision>;
export type EvaluatePermissionResponseBatch =
PermissionMessageBatch<EvaluatePermissionResponse>;
+4 -4
View File
@@ -16,10 +16,10 @@
export { AuthorizeResult } from './api';
export type {
AuthorizeQuery,
AuthorizeRequest,
AuthorizeDecision,
AuthorizeResponse,
EvaluatePermissionRequest,
EvaluatePermissionRequestBatch,
EvaluatePermissionResponse,
EvaluatePermissionResponseBatch,
IdentifiedPermissionMessage,
PermissionMessageBatch,
ConditionalPolicyDecision,
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import { AuthorizeQuery, AuthorizeDecision } from './api';
import { EvaluatePermissionRequest, EvaluatePermissionResponse } from './api';
/**
* The attributes related to a given permission; these should be generic and widely applicable to
@@ -94,9 +94,9 @@ export type ResourcePermission<TResourceType extends string = string> =
*/
export interface PermissionAuthorizer {
authorize(
queries: AuthorizeQuery[],
requests: EvaluatePermissionRequest[],
options?: AuthorizeRequestOptions,
): Promise<AuthorizeDecision[]>;
): Promise<EvaluatePermissionResponse[]>;
}
/**