@openactive/data-model-validator
Version:
A library to allow a developer to validate a JSON document against the OpenActive Modelling Opportunity Specification
80 lines (75 loc) • 2.77 kB
JavaScript
const Rule = require('../rule');
const ValidationErrorType = require('../../errors/validation-error-type');
const ValidationErrorCategory = require('../../errors/validation-error-category');
const ValidationErrorSeverity = require('../../errors/validation-error-severity');
const { SelfIndexingObject } = require('../../helpers/self-indexing-object');
const TEST_KEYS = SelfIndexingObject.create(/** @type {const} */([
'githubButNotIssues',
'unrecognisedFormat',
]));
module.exports = class DiscussionUrlShouldPointToRecognisedDiscussionBoardRule extends Rule {
constructor(options) {
super(options);
this.targetFields = {
Dataset: ['discussionUrl'],
};
this.meta = {
name: 'DiscussionUrlShouldPointToRecognisedDiscussionBoardRule',
description: 'Validates that the `discussionUrl` property points to a recognised discussion board.',
tests: {
[TEST_KEYS.githubButNotIssues]: {
message: 'If `discussionUrl` points to GitHub, it should be to the project\'s /issues page e.g. `https://github.com/openactive/OpenActive.Server.NET/issues`.',
category: ValidationErrorCategory.DATA_QUALITY,
severity: ValidationErrorSeverity.FAILURE,
type: ValidationErrorType.INVALID_FORMAT,
},
[TEST_KEYS.unrecognisedFormat]: {
message: 'The `discussionUrl` property does not point to a recognised discussion board. Currently recognised discussion board formats: `https://github.com/<ORG>/<REPO>/issues`.',
category: ValidationErrorCategory.CONFORMANCE,
severity: ValidationErrorSeverity.WARNING,
type: ValidationErrorType.INVALID_FORMAT,
},
},
};
}
/**
* @param {import('../../classes/model-node').ModelNodeType} node
* @param {string} field
*/
async validateField(node, field) {
const discussionUrlRaw = node.getValue(field);
const discussionUrl = new URL(discussionUrlRaw);
if (discussionUrl.hostname === 'github.com') {
return this.validateGitHubUrl(discussionUrl, node, field);
}
return [
this.createError(
TEST_KEYS.unrecognisedFormat,
{
value: node.getValue(field),
path: node.getPath(field),
},
),
];
}
/**
* @param {URL} discussionUrl
* @param {import('../../classes/model-node').ModelNodeType} node
* @param {string} field
*/
validateGitHubUrl(discussionUrl, node, field) {
const isGhIssuesUrl = discussionUrl.pathname.endsWith('/issues');
if (isGhIssuesUrl) {
return [];
}
return [
this.createError(
TEST_KEYS.githubButNotIssues,
{
value: node.getValue(field),
path: node.getPath(field),
},
),
];
}
};