@unito/integration-debugger
Version:
The Unito Integration Debugger
88 lines (87 loc) • 3.99 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const integration_api_1 = require("@unito/integration-api");
const crawler_1 = require("../crawler");
/**
* Check: Validate classic user
*
* We validate that any field of type Reference with the semantic "user" is compliant to the classic user's schema.
*
* A classic user must have:
* - One field with the DISPLAY_NAME Semantics.
* - Zero or more fields of type EMAIL.
*/
const check = {
label: 'Classic User',
prepareOnPreparedSteps: false,
validateOnError: false,
activatedByDefault: true,
prepare: async (_stepResult, _crawlerDriver) => {
return [];
},
validate: (step, _crawlerDriver) => {
if (step.operation !== crawler_1.Operation.GetItem || !step.payloadOut) {
return;
}
const item = step.payloadOut;
for (const relation of item.relations) {
// Relations with relation semantic USERS
if (relation.semantic === integration_api_1.RelationSemantics.USERS) {
const displayNameFields = relation.schema.fields?.filter(field => field.semantic === integration_api_1.Semantics.DISPLAY_NAME);
if (!displayNameFields.length) {
step.errors.push({
keyword: 'unito',
message: `The classic user relation is missing a field.`,
detailedMessage: `The relation with semantic '${integration_api_1.RelationSemantics.USERS}' must have a schema with a field having the semantic '${integration_api_1.Semantics.DISPLAY_NAME}'.`,
instancePath: step.path,
schemaPath: step.schemaPath ?? '',
params: {
code: 'DISPLAY_NAME_NOT_FOUND',
},
});
}
}
// References with semantic USER
validateFields(step, relation.schema.fields);
}
},
};
function isSelfReference(schema) {
return schema === '__self';
}
function validateFields(step, fields) {
const userReferences = fields?.filter(field => field.semantic === integration_api_1.Semantics.USER && field.type === integration_api_1.FieldValueTypes.REFERENCE);
for (const userReference of userReferences) {
const referenceFields = isSelfReference(userReference.reference.schema)
? undefined
: userReference.reference.schema.fields;
if (referenceFields) {
const displayNameField = referenceFields.find(field => field.semantic === integration_api_1.Semantics.DISPLAY_NAME);
if (!displayNameField) {
step.errors.push({
keyword: 'unito',
message: `The classic user reference is missing a field.`,
detailedMessage: `The reference with semantic '${integration_api_1.Semantics.USER}' must have a schema with a field having the semantic '${integration_api_1.Semantics.DISPLAY_NAME}'.`,
instancePath: step.path,
schemaPath: step.schemaPath ?? '',
params: {
code: 'DISPLAY_NAME_NOT_FOUND',
},
});
}
}
}
const otherObjectOrReferenceFields = fields.filter(field => Array(integration_api_1.FieldValueTypes.OBJECT, integration_api_1.FieldValueTypes.REFERENCE).includes(field.type) &&
userReferences.includes(field) === false);
for (const field of otherObjectOrReferenceFields) {
const fieldsToValidate = 'fields' in field
? field.fields
: isSelfReference(field.reference.schema)
? undefined // Skip validation for __self references
: field.reference.schema.fields;
if (fieldsToValidate) {
validateFields(step, fieldsToValidate);
}
}
}
exports.default = check;
;