Skip to content

Commit 206d903

Browse files
committed
[Issue #183] Move getValidationConstraints() to exported module
1 parent 8580b1e commit 206d903

5 files changed

Lines changed: 98 additions & 53 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
### Additions
66
- [Issue #187] Add HttpClient::request for proxy
7+
- [Issue #183] Move getValidationConstraints() to exported module
78

89
### Fixes
910
- npm update
11+
- Cleaned up query-tools
1012

1113
## [3.0.3] Jul-23-2019
1214

src/query-tools.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* # Query Tools
3+
*
4+
* Query tools assist in processing incoming requests and querying the database
5+
*/
6+
7+
/**
8+
* Query Tools
9+
*/
10+
export { createSearchQuery } from './query-tools/create-search-query';
11+
export { getQuery } from './query-tools/get-query';
12+
export {
13+
getValidationConstraints
14+
} from './query-tools/get-validation-constraints';
15+
export { queryTypes } from './query-tools/query-types';
16+
export { queryValidator } from './query-tools/query-validator';
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { MetadataStorage, getFromContainer } from 'class-validator';
2+
3+
/**
4+
* Get class-validator constraints for a class
5+
* @param someClass BaseModel class(e.g `request.payloadType`)
6+
* @param key (Optional) Key to get constraints for. If unset, constraints for
7+
* all keys will be returned.
8+
*/
9+
export function getValidationConstraints(someClass: Function, key?: string) {
10+
const container = <MetadataStorage>getFromContainer(MetadataStorage);
11+
const metadata = container.getTargetValidationMetadatas(
12+
someClass,
13+
JSON.stringify(someClass)
14+
);
15+
const properties = container.groupByPropertyName(metadata);
16+
17+
const validators = Object.keys(properties).reduce((schema, property) => {
18+
schema[property] = properties[
19+
property
20+
].reduce((propertySchema, { type, constraints }) => {
21+
if (Array.isArray(constraints) && constraints.length === 1) {
22+
constraints = constraints[0];
23+
}
24+
25+
if (typeof constraints === 'undefined') {
26+
propertySchema[type] = true;
27+
}
28+
else {
29+
propertySchema[type] = constraints;
30+
}
31+
32+
return propertySchema;
33+
}, {});
34+
35+
return schema;
36+
}, {});
37+
38+
if (key) {
39+
if (key in validators) {
40+
return validators[key];
41+
}
42+
else {
43+
return false;
44+
}
45+
}
46+
else {
47+
return validators;
48+
}
49+
}

src/query-tools/query-validator.ts

Lines changed: 2 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,59 +2,8 @@ import { Request, Response } from 'express';
22
import { isKeyInModel } from '../utils';
33
import { queryTypes, queryTypeKeys } from './query-types';
44
import { getReadableFields, getReadableRelations } from '../bodyguard';
5-
import {
6-
validateSync,
7-
MetadataStorage,
8-
getFromContainer
9-
} from 'class-validator';
10-
11-
/**
12-
* Get class-validator constraints for a class
13-
* @param someClass BaseModel class(e.g `request.payloadType`)
14-
* @param key (Optional) Key to get constraints for. If unset, constraints for
15-
* all keys will be returned.
16-
*/
17-
function getValidationConstraints(someClass: Function, key?: string) {
18-
const container = <MetadataStorage>getFromContainer(MetadataStorage);
19-
const metadata = container.getTargetValidationMetadatas(
20-
someClass,
21-
JSON.stringify(someClass)
22-
);
23-
const properties = container.groupByPropertyName(metadata);
24-
25-
const validators = Object.keys(properties).reduce((schema, property) => {
26-
schema[property] = properties[
27-
property
28-
].reduce((propertySchema, { type, constraints }) => {
29-
if (Array.isArray(constraints) && constraints.length === 1) {
30-
constraints = constraints[0];
31-
}
32-
33-
if (typeof constraints === 'undefined') {
34-
propertySchema[type] = true;
35-
}
36-
else {
37-
propertySchema[type] = constraints;
38-
}
39-
40-
return propertySchema;
41-
}, {});
42-
43-
return schema;
44-
}, {});
45-
46-
if (key) {
47-
if (key in validators) {
48-
return validators[key];
49-
}
50-
else {
51-
return false;
52-
}
53-
}
54-
else {
55-
return validators;
56-
}
57-
}
5+
import { validateSync } from 'class-validator';
6+
import { getValidationConstraints } from './get-validation-constraints';
587

598
/**
609
* Validate a GET query type
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { getValidationConstraints } from '../../../../src/query-tools';
2+
import { User } from '../../../examples/terms/models/user';
3+
4+
/**
5+
* getValidationConstraints()
6+
* pointyapi/query-tools
7+
*/
8+
describe('[QueryTools] getValidationConstraints()', () => {
9+
it('returns a map of constraints for model', () => {
10+
const constraints = getValidationConstraints(User);
11+
12+
expect(constraints).toEqual(jasmine.any(Object));
13+
expect('username' in constraints).toBe(true);
14+
expect(constraints.username.isAlphanumeric).toBe(true);
15+
});
16+
17+
it('returns constraint for specific key', () => {
18+
const constraints = getValidationConstraints(User, 'username');
19+
20+
expect(constraints).toEqual(jasmine.any(Object));
21+
expect(constraints.isAlphanumeric).toBe(true);
22+
});
23+
24+
it('returns false if key has no constraints', () => {
25+
const constraints = getValidationConstraints(User, 'id');
26+
27+
expect(constraints).toBe(false);
28+
});
29+
});

0 commit comments

Comments
 (0)