Rename permission backend request and response types
Signed-off-by: Joe Porpeglia <josephp@spotify.com>
This commit is contained in:
committed by
Joe Porpeglia
parent
970814ed38
commit
e43290ce96
@@ -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 =>
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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[]>;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user