Skip to content

Commit b934340

Browse files
committed
feature(validator) Add optional UTC offset parameter to validation
Signed-off-by: Jerome Simeon <[email protected]>
1 parent fcd27d7 commit b934340

File tree

9 files changed

+36
-18
lines changed

9 files changed

+36
-18
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"devDependencies": {
33
"colors": "1.4.0",
44
"coveralls": "3.0.4",
5-
"dayjs": "1.10.2",
5+
"dayjs": "1.10.4",
66
"eslint": "6.0.1",
77
"istanbul-combine": "0.3.0",
88
"istanbul-merge": "1.1.1",

packages/concerto-core/api.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ class SecurityException extends BaseException {
223223
class Serializer {
224224
+ void constructor(Factory,ModelManager)
225225
+ void setDefaultOptions(Object)
226-
+ Object toJSON(Resource,Object,boolean,boolean,boolean,boolean,boolean) throws Error
227-
+ Resource fromJSON(Object,Object,boolean,boolean)
226+
+ Object toJSON(Resource,Object,boolean,boolean,boolean,boolean,boolean,number) throws Error
227+
+ Resource fromJSON(Object,Object,boolean,boolean,number)
228228
+ boolean hasInstance(object)
229229
}

packages/concerto-core/changelog.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
# Note that the latest public API is documented using JSDocs and is available in api.txt.
2525
#
2626

27+
Version 1.0.0-alpha.4 {3b7ebc06a536a5e81624225c7b0079ee} 2021-04-08
28+
- Allow optional UTC offset for validating DateTime values
29+
2730
Version 1.0.0-alpha.3 {7b8763c243f937d84579350aef348c3c} 2020-12-25
2831
- Concepts may now be identified
2932
- assets/participants have a system identifier created ($identifier) automatically

packages/concerto-core/lib/serializer.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ const TypedStack = require('./serializer/typedstack');
2727

2828
const baseDefaultOptions = {
2929
validate: true,
30-
ergo: false
30+
ergo: false,
31+
utcOffset: 0,
3132
};
3233

3334
/**
@@ -85,6 +86,7 @@ class Serializer {
8586
* serialized in full, subsequent instances are replaced with a reference to the $id
8687
* @param {boolean} [options.convertResourcesToId] - Convert resources that
8788
* are specified for relationship fields into their id, false by default.
89+
* @param {number} [options.utcOffset] - UTC Offset for DateTime values.
8890
* @return {Object} - The Javascript Object that represents the resource
8991
* @throws {Error} - throws an exception if resource is not an instance of
9092
* Resource or fails validation.
@@ -114,7 +116,8 @@ class Serializer {
114116
options.permitResourcesForRelationships === true,
115117
options.deduplicateResources === true,
116118
options.convertResourcesToId === true,
117-
options.ergo === true
119+
options.ergo === true,
120+
options.utcOffset,
118121
);
119122

120123
parameters.stack.clear();
@@ -138,6 +141,7 @@ class Serializer {
138141
* in the place of strings for relationships, defaults to false.
139142
* @param {boolean} options.validate - validate the structure of the Resource
140143
* with its model prior to serialization (default to true)
144+
* @param {number} [options.utcOffset] - UTC Offset for DateTime values.
141145
* @return {Resource} The new populated resource
142146
*/
143147
fromJSON(jsonObject, options) {
@@ -180,7 +184,7 @@ class Serializer {
180184
parameters.resourceStack = new TypedStack(resource);
181185
parameters.modelManager = this.modelManager;
182186
parameters.factory = this.factory;
183-
const populator = new JSONPopulator(options.acceptResourcesForRelationships === true, options.ergo === true);
187+
const populator = new JSONPopulator(options.acceptResourcesForRelationships === true, options.ergo === true, options.utcOffset);
184188
classDeclaration.accept(populator, parameters);
185189

186190
// validate the resource against the model

packages/concerto-core/lib/serializer/jsongenerator.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@ class JSONGenerator {
4646
* @param {boolean} [convertResourcesToId] Convert resources that
4747
* are specified for relationship fields into their id, false by default.
4848
* @param {boolean} [ergo] target ergo.
49+
* @param {number} [utcOffset] UTC Offset for DateTime values.
4950
*/
50-
constructor(convertResourcesToRelationships, permitResourcesForRelationships, deduplicateResources, convertResourcesToId, ergo) {
51+
constructor(convertResourcesToRelationships, permitResourcesForRelationships, deduplicateResources, convertResourcesToId, ergo, utcOffset) {
5152
this.convertResourcesToRelationships = convertResourcesToRelationships;
5253
this.permitResourcesForRelationships = permitResourcesForRelationships;
5354
this.deduplicateResources = deduplicateResources;
5455
this.convertResourcesToId = convertResourcesToId;
5556
this.ergo = ergo;
57+
this.utcOffset = utcOffset || 0; // Defaults to UTC
5658
}
5759

5860
/**
@@ -193,10 +195,12 @@ class JSONGenerator {
193195
switch (field.getType()) {
194196
case 'DateTime':
195197
{
198+
const objWithOffset = obj.utc().utcOffset(this.utcOffset);
196199
if (this.ergo) {
197-
return obj;
200+
return objWithOffset;
198201
} else {
199-
return obj.utc().format('YYYY-MM-DDTHH:mm:ss.SSS[Z]');
202+
const inZ = objWithOffset.utcOffset() === 0;
203+
return objWithOffset.format(`YYYY-MM-DDTHH:mm:ss.SSS${inZ ? '[Z]': 'Z'}`);
200204
}
201205
}
202206
case 'Integer':

packages/concerto-core/lib/serializer/jsonpopulator.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ const ValidationException = require('./validationexception');
2424
const dayjs = require('dayjs');
2525
const utc = require('dayjs/plugin/utc');
2626
dayjs.extend(utc);
27+
const quarterOfYear = require('dayjs/plugin/quarterOfYear');
28+
dayjs.extend(quarterOfYear);
29+
const minMax = require('dayjs/plugin/minMax');
30+
dayjs.extend(minMax);
31+
const duration = require('dayjs/plugin/duration');
32+
dayjs.extend(duration);
2733

2834
/**
2935
* Check if a given property name is a system property, e.g. '$class'.
@@ -83,10 +89,12 @@ class JSONPopulator {
8389
* @param {boolean} [acceptResourcesForRelationships] Permit resources in the
8490
* place of relationships, false by default.
8591
* @param {boolean} [ergo] target ergo.
92+
* @param {number} [utcOffset] - UTC Offset for DateTime values.
8693
*/
87-
constructor(acceptResourcesForRelationships, ergo) {
94+
constructor(acceptResourcesForRelationships, ergo, utcOffset) {
8895
this.acceptResourcesForRelationships = acceptResourcesForRelationships;
8996
this.ergo = ergo;
97+
this.utcOffset = utcOffset || 0; // Defaults to UTC
9098
}
9199

92100
/**
@@ -226,12 +234,12 @@ class JSONPopulator {
226234

227235
switch(field.getType()) {
228236
case 'DateTime': {
229-
if (dayjs.isDayjs(json)) {
237+
if (json && typeof json === 'object' && typeof json.isBefore === 'function') {
230238
result = json;
231239
} else if (typeof json !== 'string') {
232240
throw new ValidationException(`Expected value ${JSON.stringify(json)} to be of type ${field.getType()}`);
233241
} else {
234-
result = dayjs.utc(json);
242+
result = dayjs.utc(json).utcOffset(this.utcOffset);
235243
}
236244
if (!result.isValid()) {
237245
throw new ValidationException(`Expected value ${JSON.stringify(json)} to be of type ${field.getType()}`);

packages/concerto-core/lib/serializer/resourcevalidator.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ const Util = require('../util');
2525
const ModelUtil = require('../modelutil');
2626
const ValidationException = require('./validationexception');
2727
const Globalize = require('../globalize');
28-
const dayjs = require('dayjs');
2928

3029
/**
3130
* <p>
@@ -315,7 +314,7 @@ class ResourceValidator {
315314
}
316315
break;
317316
case 'DateTime':
318-
if(!(dayjs.isDayjs(obj))) {
317+
if(!(typeof obj === 'object' && typeof obj.isBefore === 'function')) {
319318
invalid = true;
320319
}
321320
break;

packages/concerto-core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
"dependencies": {
6666
"axios": "0.21.1",
6767
"colors": "1.4.0",
68-
"dayjs": "1.10.2",
68+
"dayjs": "1.10.4",
6969
"debug": "4.1.1",
7070
"jsome": "2.5.0",
7171
"lorem-ipsum": "1.0.6",

0 commit comments

Comments
 (0)