UNPKG

forest-express

Version:

Official package for all Forest Express Lianas

117 lines (116 loc) 4.29 kB
"use strict"; var _require = require('@forestadmin/context'), inject = _require.inject; var _ = require('lodash'); var logger = require('../../services/logger'); var Routes = require('./routes'); var Setup = require('./setup'); function IntercomChecker(opts, Implementation) { var _inject = inject(), modelsManager = _inject.modelsManager; var integrationValid = false; function hasIntegration() { return opts.integrations && opts.integrations.intercom; } function isProperlyIntegrated() { return opts.integrations.intercom.accessToken && opts.integrations.intercom.intercom && opts.integrations.intercom.mapping; } function isMappingValid() { var models = modelsManager.getModels(); var mappingValid = true; _.map(opts.integrations.intercom.mapping, function (mappingValue) { var collectionName = mappingValue.split('.')[0]; if (!models[collectionName]) { mappingValid = false; } }); if (!mappingValid) { logger.error("Cannot find some Intercom integration mapping values (".concat(opts.integrations.intercom.mapping, ") among the project models:\n").concat(_.keys(models).join(', '))); } return mappingValid; } function isIntegrationDeprecated() { var isIntegrationValid = opts.integrations.intercom.apiKey && opts.integrations.intercom.appId && opts.integrations.intercom.intercom && opts.integrations.intercom.mapping; if (isIntegrationValid) { logger.warn('Intercom integration attributes "apiKey" and "appId" are now deprecated, please use "accessToken" attribute.'); } return isIntegrationValid; } function castToArray(value) { return _.isString(value) ? [value] : value; } function integrationCollectionMatch(integration, model) { if (!integrationValid) { return false; } var models = modelsManager.getModels(); var collectionModelNames = _.map(integration.mapping, function (mappingValue) { var collectionName = mappingValue.split('.')[0]; if (models[collectionName]) { return Implementation.getModelName(models[collectionName]); } return null; }); return collectionModelNames.indexOf(Implementation.getModelName(model)) > -1; } if (hasIntegration()) { if (isProperlyIntegrated() || isIntegrationDeprecated()) { opts.integrations.intercom.mapping = castToArray(opts.integrations.intercom.mapping); if (opts.integrations.intercom.accessToken) { opts.integrations.intercom.credentials = { token: opts.integrations.intercom.accessToken }; } integrationValid = isMappingValid(); } else { logger.error('Cannot setup properly your Intercom integration.'); } } this.defineRoutes = function (app, model) { if (!integrationValid) { return; } if (integrationCollectionMatch(opts.integrations.intercom, model)) { new Routes(app, model, Implementation, opts).perform(); } }; this.defineCollections = function (collections) { if (!integrationValid) { return; } var collectionNames = opts.integrations.intercom.mapping.map(function (mappingValue) { return mappingValue.split('.')[0]; }); _.each(collectionNames, function (collectionName) { Setup.createCollections(Implementation, collections, collectionName); }); }; this.defineFields = function (model, schema) { if (!integrationValid) { return; } if (integrationCollectionMatch(opts.integrations.intercom, model)) { Setup.createFields(Implementation, model, schema.fields); } }; this.defineSerializationOption = function (model, schema, dest, field) { if (integrationValid && field.integration === 'intercom') { dest[field.field] = { ref: 'id', attributes: [], included: false, nullIfMissing: true, // TODO: This option in the JSONAPISerializer is weird. ignoreRelationshipData: true, relationshipLinks: { related: function related(dataSet) { return { href: "/forest/".concat(Implementation.getModelName(model), "/").concat(dataSet[schema.idField], "/").concat(field.field) }; } } }; } }; } module.exports = IntercomChecker;