Added parameter validation using the param schemas
Signed-off-by: Harry Hogg <hhogg@spotify.com>
This commit is contained in:
@@ -27,7 +27,7 @@ const transformConditions = createConditionTransformer([
|
||||
name: 'test-rule-1',
|
||||
description: 'Test rule 1',
|
||||
resourceType: 'test-resource',
|
||||
schema: z.tuple([]),
|
||||
schema: z.tuple([z.string(), z.number()]),
|
||||
apply: jest.fn(),
|
||||
toQuery: jest.fn(
|
||||
(firstParam: string, secondParam: number) =>
|
||||
@@ -38,7 +38,7 @@ const transformConditions = createConditionTransformer([
|
||||
name: 'test-rule-2',
|
||||
description: 'Test rule 2',
|
||||
resourceType: 'test-resource',
|
||||
schema: z.tuple([]),
|
||||
schema: z.tuple([z.object({})]),
|
||||
apply: jest.fn(),
|
||||
toQuery: jest.fn(
|
||||
(firstParam: object) => `test-rule-2:${JSON.stringify(firstParam)}`,
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import { InputError } from '@backstage/errors';
|
||||
import {
|
||||
AllOfCriteria,
|
||||
AnyOfCriteria,
|
||||
@@ -45,7 +46,14 @@ const mapConditions = <TQuery>(
|
||||
};
|
||||
}
|
||||
|
||||
return getRule(criteria.rule).toQuery(...criteria.params);
|
||||
const rule = getRule(criteria.rule);
|
||||
const result = rule.schema.safeParse(criteria.params);
|
||||
|
||||
if (rule.schema && !result.success) {
|
||||
throw new InputError(`Parameters to rule are invalid`, result.error);
|
||||
}
|
||||
|
||||
return rule.toQuery(...criteria.params);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -40,7 +40,10 @@ const testRule1 = createPermissionRule({
|
||||
name: 'test-rule-1',
|
||||
description: 'Test rule 1',
|
||||
resourceType: 'test-resource',
|
||||
schema: z.tuple([z.string(), z.number()]),
|
||||
schema: z.tuple([
|
||||
z.string().describe('firstParam'),
|
||||
z.number().describe('secondParam'),
|
||||
]),
|
||||
apply: (_resource: any, _firstParam: string, _secondParam: number) => true,
|
||||
toQuery: (_firstParam: string, _secondParam: number) => ({}),
|
||||
});
|
||||
@@ -49,7 +52,7 @@ const testRule2 = createPermissionRule({
|
||||
name: 'test-rule-2',
|
||||
description: 'Test rule 2',
|
||||
resourceType: 'test-resource',
|
||||
schema: z.tuple([z.object({})]),
|
||||
schema: z.tuple([z.object({}).describe('firstParam')]),
|
||||
apply: (_resource: any, _firstParam: object) => false,
|
||||
toQuery: (_firstParam: object) => ({}),
|
||||
});
|
||||
@@ -250,7 +253,7 @@ describe('createPermissionIntegrationRouter', () => {
|
||||
conditions: {
|
||||
rule: 'test-rule-1',
|
||||
resourceType: 'test-resource',
|
||||
params: [],
|
||||
params: ['a', 1],
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -260,7 +263,7 @@ describe('createPermissionIntegrationRouter', () => {
|
||||
conditions: {
|
||||
rule: 'test-rule-2',
|
||||
resourceType: 'test-resource',
|
||||
params: [],
|
||||
params: [{}],
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -271,7 +274,7 @@ describe('createPermissionIntegrationRouter', () => {
|
||||
not: {
|
||||
rule: 'test-rule-1',
|
||||
resourceType: 'test-resource',
|
||||
params: [],
|
||||
params: ['a', 1],
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -283,7 +286,7 @@ describe('createPermissionIntegrationRouter', () => {
|
||||
not: {
|
||||
rule: 'test-rule-2',
|
||||
resourceType: 'test-resource',
|
||||
params: [],
|
||||
params: [{}],
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -296,12 +299,12 @@ describe('createPermissionIntegrationRouter', () => {
|
||||
{
|
||||
rule: 'test-rule-1',
|
||||
resourceType: 'test-resource',
|
||||
params: [],
|
||||
params: ['a', 1],
|
||||
},
|
||||
{
|
||||
rule: 'test-rule-2',
|
||||
resourceType: 'test-resource',
|
||||
params: [],
|
||||
params: [{}],
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -430,7 +433,7 @@ describe('createPermissionIntegrationRouter', () => {
|
||||
conditions: {
|
||||
rule: 'test-rule-1',
|
||||
resourceType: 'test-resource',
|
||||
params: [],
|
||||
params: ['a', 1],
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -440,7 +443,7 @@ describe('createPermissionIntegrationRouter', () => {
|
||||
conditions: {
|
||||
rule: 'test-rule-1',
|
||||
resourceType: 'test-resource',
|
||||
params: [],
|
||||
params: ['a', 1],
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -450,7 +453,7 @@ describe('createPermissionIntegrationRouter', () => {
|
||||
conditions: {
|
||||
rule: 'test-rule-1',
|
||||
resourceType: 'test-resource',
|
||||
params: [],
|
||||
params: ['a', 1],
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
@@ -124,7 +124,14 @@ const applyConditions = <TResourceType extends string, TResource>(
|
||||
return !applyConditions(criteria.not, resource, getRule);
|
||||
}
|
||||
|
||||
return getRule(criteria.rule).apply(resource, ...criteria.params);
|
||||
const rule = getRule(criteria.rule);
|
||||
const result = rule.schema.safeParse(criteria.params);
|
||||
|
||||
if (rule.schema && !result.success) {
|
||||
throw new InputError(`Parameters to rule are invalid`, result.error);
|
||||
}
|
||||
|
||||
return rule.apply(resource, ...criteria.params);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user