@animo-id/pex
Version:
A Typescript implementation of the v1 and v2 DIF Presentation Exchange specification
158 lines • 14.7 kB
JavaScript
import { Directives, Optionality } from '@sphereon/pex-models';
import { FieldsVB } from './fieldsVB';
import { ValidationBundler } from './validationBundler';
export class ConstraintsVB extends ValidationBundler {
disclosureLimitShouldHaveKnownValueMsg = 'limit_disclosure should have known value';
statusShouldHaveKnownValueMsg = 'Unknown status property';
statusDirectiveShouldHaveKnownValueMsg = 'status directive should have known value';
subjectIsIssuerShouldBeKnownValueMsg = 'subject_is_issuer should be known value';
fieldIdIsMandatoryMsg = 'field_id property is mandatory';
fieldIdMustBeArrayOfStringsMsg = 'field_id property must be an array of strings';
fieldIdMustCorrespondToFieldIdMsg = 'field_id must correspond to a present field object id property';
directivePropertyIsMandatoryMsg = 'directive property is mandatory';
oneOfTheKnownDirectivePropertiesMandatoryMsg = 'directive property must be one of [required, preferred]';
constructor(parentTag) {
super(parentTag, 'constraints');
}
getValidations(constraints) {
let validations = [];
if (constraints) {
validations = [
{
tag: this.getTag(),
target: constraints,
predicate: (constraints) => ConstraintsVB.disclosureLimitShouldHaveKnownValue(constraints.limit_disclosure),
message: this.disclosureLimitShouldHaveKnownValueMsg,
},
{
tag: this.getTag(),
target: constraints,
predicate: (constraints) => ConstraintsVB.statusShouldHaveKnownValue(constraints.statuses),
message: this.statusShouldHaveKnownValueMsg,
},
{
tag: this.getTag(),
target: constraints,
predicate: ConstraintsVB.statusDirectiveShouldHaveKnownValue(),
message: this.statusDirectiveShouldHaveKnownValueMsg,
},
{
tag: this.getTag(),
target: constraints,
predicate: (constraints) => ConstraintsVB.shouldBeKnownOption(constraints.is_holder),
message: this.subjectIsIssuerShouldBeKnownValueMsg,
},
{
tag: this.getTag(),
target: constraints,
predicate: (constraints) => this.fieldIdInSubjectMustCorrespondToFieldId(constraints, constraints.is_holder),
message: this.fieldIdMustCorrespondToFieldIdMsg,
},
{
tag: this.getTag(),
target: constraints,
predicate: (constraints) => this.fieldIdInSubjectMustCorrespondToFieldId(constraints, constraints.same_subject),
message: this.fieldIdMustCorrespondToFieldIdMsg,
},
...this.getSubjectsValidations(constraints?.is_holder),
...this.getSubjectsValidations(constraints?.same_subject),
...this.getFieldsValidations(constraints),
];
}
return validations;
}
getFieldsValidations(constraints) {
if (constraints?.fields?.length) {
return new FieldsVB(this.getTag()).getValidations(constraints.fields);
}
return [];
}
static disclosureLimitShouldHaveKnownValue(limit_disclosure) {
return !limit_disclosure || limit_disclosure === Optionality.Preferred || limit_disclosure === Optionality.Required;
}
static statusShouldHaveKnownValue(statuses) {
return statuses == null || statuses.active != null || statuses.revoked != null || statuses.suspended != null;
}
static statusDirectiveShouldHaveKnownValue() {
return (constraints) => this.pdStatusShouldBeKnown(constraints?.statuses?.active) &&
this.pdStatusShouldBeKnown(constraints?.statuses?.revoked) &&
this.pdStatusShouldBeKnown(constraints?.statuses?.suspended);
}
static pdStatusShouldBeKnown(pdStatus) {
return (!pdStatus ||
pdStatus.directive === Directives.Allowed ||
pdStatus.directive === Directives.Disallowed ||
pdStatus.directive === Directives.Required);
}
static shouldBeKnownOption(subjects) {
if (subjects) {
return (subjects.filter((subject) => subject.directive !== Optionality.Preferred && subject.directive !== Optionality.Required)
.length === 0);
}
return true;
}
getSubjectsValidations(holderSubjects) {
if (holderSubjects) {
let validations = [];
for (let subjectInd = 0; subjectInd < holderSubjects.length; subjectInd++) {
validations = [
{
tag: this.getMyTag(subjectInd),
target: holderSubjects[subjectInd],
predicate: (subject) => Array.isArray(subject.field_id),
message: this.fieldIdMustBeArrayOfStringsMsg,
},
{
tag: this.getMyTag(subjectInd),
target: holderSubjects[subjectInd],
predicate: (subject) => !!subject.field_id,
message: this.fieldIdIsMandatoryMsg,
},
{
tag: this.getMyTag(subjectInd),
target: holderSubjects[subjectInd],
predicate: (subject) => subject.field_id.length === subject.field_id.filter((id) => typeof id === 'string').length,
message: this.fieldIdMustBeArrayOfStringsMsg,
},
{
tag: this.getMyTag(subjectInd),
target: holderSubjects[subjectInd],
predicate: (subject) => subject.directive !== undefined,
message: this.directivePropertyIsMandatoryMsg,
},
{
tag: this.getMyTag(subjectInd),
target: holderSubjects[subjectInd],
predicate: (subject) => subject.directive === Optionality.Preferred || subject.directive === Optionality.Required,
message: this.oneOfTheKnownDirectivePropertiesMandatoryMsg,
},
];
}
return validations;
}
return [];
}
getMyTag(srInd) {
// TODO extract to make it generic
return this.parentTag + '.' + this.myTag + '[' + srInd + ']';
}
fieldIdInSubjectMustCorrespondToFieldId(constraints, subjects) {
if (subjects) {
for (const subject of subjects) {
for (const fieldId of subject.field_id) {
if (!ConstraintsVB.isValidFieldId(constraints, fieldId)) {
return false;
}
}
}
}
return true;
}
static isValidFieldId(constraints, fieldId) {
if (constraints?.fields) {
return constraints.fields.map((field) => field.id).includes(fieldId);
}
return false;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RyYWludHNWQi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi92YWxpZGF0aW9uL2J1bmRsZXJzL2NvbnN0cmFpbnRzVkIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQyxVQUFVLEVBQW1DLFdBQVcsRUFBc0IsTUFBTSxzQkFBc0IsQ0FBQztBQUlsSixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXhELE1BQU0sT0FBTyxhQUFjLFNBQVEsaUJBQW9GO0lBQ3BHLHNDQUFzQyxHQUFHLDBDQUEwQyxDQUFDO0lBQ3BGLDZCQUE2QixHQUFHLHlCQUF5QixDQUFDO0lBQzFELHNDQUFzQyxHQUFHLDBDQUEwQyxDQUFDO0lBQ3BGLG9DQUFvQyxHQUFHLHlDQUF5QyxDQUFDO0lBQ2pGLHFCQUFxQixHQUFHLGdDQUFnQyxDQUFDO0lBQ3pELDhCQUE4QixHQUFHLCtDQUErQyxDQUFDO0lBQ2pGLGlDQUFpQyxHQUFHLGdFQUFnRSxDQUFDO0lBQ3JHLCtCQUErQixHQUFHLGlDQUFpQyxDQUFDO0lBQ3BFLDRDQUE0QyxHQUFHLHlEQUF5RCxDQUFDO0lBRTFILFlBQVksU0FBaUI7UUFDM0IsS0FBSyxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sY0FBYyxDQUNuQixXQUEwQztRQUUxQyxJQUFJLFdBQVcsR0FNVCxFQUFFLENBQUM7UUFDVCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLFdBQVcsR0FBRztnQkFDWjtvQkFDRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDbEIsTUFBTSxFQUFFLFdBQVc7b0JBQ25CLFNBQVMsRUFBRSxDQUFDLFdBQTBDLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxXQUFXLENBQUMsZ0JBQWdC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