/
sync-schema-validation-processor.ts
44 lines (39 loc) · 1.4 KB
/
sync-schema-validation-processor.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { Assertion } from '@orbit/core';
import {
RecordOperation,
RecordSchema,
StandardRecordValidator,
validateRecordOperation,
ValidationError
} from '@orbit/records';
import { StandardValidator, ValidatorForFn } from '@orbit/validators';
import { SyncRecordAccessor } from '../record-accessor';
import { RecordCache } from '../record-cache';
import { SyncOperationProcessor } from '../sync-operation-processor';
/**
* An operation processor that ensures that an operation is compatible with
* its associated schema.
*/
export class SyncSchemaValidationProcessor extends SyncOperationProcessor {
schema: RecordSchema;
validatorFor: ValidatorForFn<StandardValidator | StandardRecordValidator>;
constructor(accessor: SyncRecordAccessor) {
super(accessor);
const cache = (this.accessor as unknown) as RecordCache;
const { schema, validatorFor } = cache;
if (validatorFor === undefined || schema === undefined) {
throw new Assertion(
'SyncSchemaValidationProcessor requires a RecordCache with both a `validationFor` and a `schema`.'
);
}
this.schema = schema;
this.validatorFor = validatorFor;
}
validate(operation: RecordOperation): void {
const { schema, validatorFor } = this;
const issues = validateRecordOperation(operation, { schema, validatorFor });
if (issues) {
throw new ValidationError('Validation failed', issues);
}
}
}