UNPKG

@unito/integration-debugger

Version:

The Unito Integration Debugger

88 lines (87 loc) 3.99 kB
"use strict"; 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;