Validate contribution docs against schema

Currently requires an open PR branch for the schemas, which is adding
date and time for contributions.

refs #30
This commit is contained in:
2019-04-10 18:37:02 +02:00
parent 1aae62e139
commit 130e2a7797
5 changed files with 116 additions and 90 deletions

View File

@@ -1,5 +1,20 @@
const ethers = require('ethers');
const schemas = require('kosmos-schemas');
const tv4 = require('tv4');
const validator = tv4.freshApi();
validator.addFormat({
'date': function(value) {
const dateRegexp = /^[0-9]{4,}-[0-9]{2}-[0-9]{2}$/;
return dateRegexp.test(value) ? null : "A valid ISO 8601 full-date string is expected";
},
'time': function(value) {
const timeRegexp = /^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\.[0-9]+)?(([Zz])|([\+|\-]([01][0-9]|2[0-3]):[0-5][0-9]))$/;
return timeRegexp.test(value) ? null : "A valid ISO 8601 full-time string is expected";
}
})
const ContributionSerializer = require('../serializers/contribution');
const Base = require('./base');
@@ -48,12 +63,15 @@ class Contribution extends Base {
}
addContribution(contributionAttr, callOptions = {}) {
let json = ContributionSerializer.serialize(contributionAttr);
// TODO: validate against schema
let jsonStr = ContributionSerializer.serialize(contributionAttr);
// Validate JSON document against schema
let result = validator.validate(JSON.parse(jsonStr), schemas['contribution']);
if (!result) { return Promise.reject(validator.error); }
return this.ipfs
.add(json)
.then((ipfsHashAttr) => {
.add(jsonStr)
.then(ipfsHashAttr => {
let contribution = [
contributionAttr.amount,
contributionAttr.contributorId,

View File

@@ -14,6 +14,8 @@ class Contribution {
*/
static deserialize(serialized) {
let {
date,
time,
kind,
description,
details,
@@ -21,6 +23,8 @@ class Contribution {
} = JSON.parse(serialized.toString('utf8'));
return {
date,
time,
kind,
description,
details,
@@ -38,6 +42,8 @@ class Contribution {
static serialize(deserialized) {
let {
contributorIpfsHash,
date,
time,
kind,
description,
url,
@@ -50,6 +56,8 @@ class Contribution {
"contributor": {
"ipfs": contributorIpfsHash
},
date,
time,
kind,
description,
"details": details || {}