Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit 094057a

Browse files
committed
Update test and query validation
Add schema validator to have a cache for body and a separate cache for query parameters. Add conditions to avoid using ALLOW_OVERPOSTING if we are validating a query parameter schema. Update unit and integration tests.
1 parent 953d600 commit 094057a

File tree

4 files changed

+131
-188
lines changed

4 files changed

+131
-188
lines changed

Meadowlark-js/packages/meadowlark-core/src/metaed/MetaEdValidation.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ export type ResourceSchemaValidators = {
2323
queryValidator: ValidateFunction;
2424
};
2525

26-
function initializeAjv(): Ajv {
27-
const removeAdditional = getBooleanFromEnvironment('ALLOW_OVERPOSTING', false);
26+
function initializeAjv(isQueryParameterValidator: boolean): Ajv {
27+
// A query parameter validator cannot have additional properties
28+
const removeAdditional = isQueryParameterValidator ? false : getBooleanFromEnvironment('ALLOW_OVERPOSTING', false);
2829
const coerceTypes = getBooleanFromEnvironment('ALLOW_TYPE_COERCION', false);
2930

3031
const ajv = new Ajv({ allErrors: true, coerceTypes, removeAdditional });
@@ -38,14 +39,19 @@ let ajv;
3839
// simple cache implementation, see: https://rewind.io/blog/simple-caching-in-aws-lambda-functions/
3940
/** This is a cache mapping MetaEd model objects to compiled ajv JSON Schema validators for the API resource */
4041
const validatorCache: Map<TopLevelEntity, ResourceSchemaValidators> = new Map();
42+
const queryValidatorCache: Map<TopLevelEntity, ResourceSchemaValidators> = new Map();
4143

4244
/**
4345
* Returns the API resource JSON Schema validator functions for the given MetaEd model. Caches results.
4446
*/
45-
function getSchemaValidatorsFor(metaEdModel: TopLevelEntity): ResourceSchemaValidators {
46-
const cachedValidators: ResourceSchemaValidators | undefined = validatorCache.get(metaEdModel);
47+
function getSchemaValidatorsFor(
48+
metaEdModel: TopLevelEntity,
49+
isQueryParameterValidator: boolean = false,
50+
): ResourceSchemaValidators {
51+
const validatorCacheObject = isQueryParameterValidator ? queryValidatorCache : validatorCache;
52+
const cachedValidators: ResourceSchemaValidators | undefined = validatorCacheObject.get(metaEdModel);
4753
if (cachedValidators != null) return cachedValidators;
48-
ajv = initializeAjv();
54+
ajv = initializeAjv(isQueryParameterValidator);
4955
const resourceValidators: ResourceSchemaValidators = {
5056
insertValidator: ajv.compile(metaEdModel.data.edfiApiSchema.jsonSchemaForInsert),
5157
updateValidator: ajv.compile(metaEdModel.data.edfiApiSchema.jsonSchemaForUpdate),
@@ -55,7 +61,7 @@ function getSchemaValidatorsFor(metaEdModel: TopLevelEntity): ResourceSchemaVali
5561
required: [],
5662
}),
5763
};
58-
validatorCache.set(metaEdModel, resourceValidators);
64+
validatorCacheObject.set(metaEdModel, resourceValidators);
5965
return resourceValidators;
6066
}
6167

@@ -64,6 +70,7 @@ function getSchemaValidatorsFor(metaEdModel: TopLevelEntity): ResourceSchemaVali
6470
*/
6571
export function clearAllValidatorCache(): void {
6672
validatorCache.clear();
73+
queryValidatorCache.clear();
6774
}
6875
/**
6976
* Creates a new empty ResourceMatchResult object
@@ -138,7 +145,7 @@ export function validateQueryParametersAgainstSchema(
138145
metaEdModel: TopLevelEntity,
139146
queryParameters: FrontendQueryParameters,
140147
): string[] {
141-
const { queryValidator } = getSchemaValidatorsFor(metaEdModel);
148+
const { queryValidator } = getSchemaValidatorsFor(metaEdModel, true);
142149

143150
let errors: string[] = [];
144151

0 commit comments

Comments
 (0)