Added parameter validation using the param schemas

Signed-off-by: Harry Hogg <hhogg@spotify.com>
This commit is contained in:
Harry Hogg
2022-09-28 15:08:43 +01:00
parent e9b4191071
commit 9fe88c4fab
4 changed files with 33 additions and 15 deletions
@@ -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);
};
/**