UNPKG

shyft

Version:

Model driven GraphQL API framework

194 lines (193 loc) 9.23 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processEntitySubscriptions = exports.isSubscription = exports.Subscription = exports.defaultEntitySubscription = exports.subscriptionTypes = exports.SUBSCRIPTION_TYPE_DELETE = exports.SUBSCRIPTION_TYPE_UPDATE = exports.SUBSCRIPTION_TYPE_CREATE = exports.pubsub = void 0; var lodash_1 = require("lodash"); var graphql_subscriptions_1 = require("graphql-subscriptions"); var util_1 = require("../util"); exports.pubsub = new graphql_subscriptions_1.PubSub(); exports.SUBSCRIPTION_TYPE_CREATE = 'onCreate'; exports.SUBSCRIPTION_TYPE_UPDATE = 'onUpdate'; exports.SUBSCRIPTION_TYPE_DELETE = 'onDelete'; exports.subscriptionTypes = [ exports.SUBSCRIPTION_TYPE_CREATE, exports.SUBSCRIPTION_TYPE_UPDATE, exports.SUBSCRIPTION_TYPE_DELETE, ]; exports.defaultEntitySubscription = [ { name: 'onCreate', type: exports.SUBSCRIPTION_TYPE_CREATE, description: function (typeName) { return "Watch a new **`" + typeName + "`** creation"; }, hasAttributes: true, }, { name: 'onUpdate', type: exports.SUBSCRIPTION_TYPE_UPDATE, description: function (typeName) { return "Watch a single **`" + typeName + "`** update using its node ID and a data patch"; }, hasAttributes: true, }, { name: 'onDelete', description: function (typeName) { return "Watch a single **`" + typeName + "`** deletion using its node ID"; }, type: exports.SUBSCRIPTION_TYPE_DELETE, }, ]; var Subscription = /** @class */ (function () { function Subscription(setup) { if (setup === void 0) { setup = {}; } var name = setup.name, type = setup.type, description = setup.description, attributes = setup.attributes, preProcessor = setup.preProcessor, postProcessor = setup.postProcessor; util_1.passOrThrow(name, function () { return 'Missing subscription name'; }); util_1.passOrThrow(type, function () { return "Missing type for subscription '" + name + "'"; }); util_1.passOrThrow(exports.subscriptionTypes.indexOf(type) >= 0, function () { return "Unknown subscription type '" + type + "' used, try one of these: '" + exports.subscriptionTypes.join(', ') + "'"; }); util_1.passOrThrow(description, function () { return "Missing description for subscription '" + name + "'"; }); this.name = name; this.type = type; this.description = description; if (this.type === exports.SUBSCRIPTION_TYPE_CREATE || this.type === exports.SUBSCRIPTION_TYPE_UPDATE) { this.attributes = attributes; } if (this.type === exports.SUBSCRIPTION_TYPE_CREATE) { this.isTypeCreate = true; this.ignoreRequired = true; } if (this.type === exports.SUBSCRIPTION_TYPE_UPDATE) { // this.needsInstance = true; this.ignoreRequired = true; this.isTypeUpdate = true; } if (this.type === exports.SUBSCRIPTION_TYPE_DELETE) { // this.needsInstance = true; this.isTypeDelete = true; } if (preProcessor) { util_1.passOrThrow(util_1.isFunction(preProcessor), function () { return "preProcessor of subscription '" + name + "' needs to be a valid function"; }); this.preProcessor = preProcessor; } if (postProcessor) { util_1.passOrThrow(util_1.isFunction(postProcessor), function () { return "postProcessor of subscription '" + name + "' needs to be a valid function"; }); this.postProcessor = postProcessor; } } Subscription.prototype.toString = function () { return this.name; }; return Subscription; }()); exports.Subscription = Subscription; var isSubscription = function (obj) { return obj instanceof Subscription; }; exports.isSubscription = isSubscription; var processEntitySubscriptions = function (entity, subscriptions) { util_1.passOrThrow(util_1.isArray(subscriptions), function () { return "Entity '" + entity.name + "' subscriptions definition needs to be an array of subscriptions"; }); subscriptions.map(function (subscription, idx) { util_1.passOrThrow(exports.isSubscription(subscription), function () { return "Invalid subscription definition for entity '" + entity.name + "' at position '" + idx + "'"; }); }); var entityAttributes = entity.getAttributes(); // const entityStates = entity.getStates(); var requiredAttributeNames = []; util_1.mapOverProperties(entityAttributes, function (attribute, attributeName) { if (!attribute.isSystemAttribute) { if (attribute.required && !attribute.defaultValue) { requiredAttributeNames.push(attributeName); } } }); var subscriptionNames = []; subscriptions.map(function (subscription) { util_1.passOrThrow(!subscriptionNames.includes(subscription.name), function () { return "Duplicate subscription name '" + subscription.name + "' found in '" + entity.name + "'"; }); subscriptionNames.push(subscription.name); if (subscription.attributes) { util_1.passOrThrow((util_1.isArray(subscription.attributes, true) && subscription.type === exports.SUBSCRIPTION_TYPE_CREATE) || util_1.isArray(subscription.attributes, false), function () { return "Subscription '" + entity.name + "." + subscription.name + "' needs to have a list of attributes"; }); subscription.attributes.map(function (attribute) { util_1.passOrThrow(typeof attribute === 'string', function () { return "Subscription '" + entity.name + "." + subscription.name + "' needs to have a list of attribute names"; }); }); util_1.passOrThrow(subscription.attributes.length === lodash_1.uniq(subscription.attributes).length, function () { return "Subscription '" + entity.name + "." + subscription.name + "' needs to have a list of unique attribute names"; }); subscription.attributes.map(function (attributeName) { util_1.passOrThrow(entityAttributes[attributeName], function () { return "Cannot use attribute '" + entity.name + "." + attributeName + "' in subscription '" + entity.name + "." + subscription.name + "' as it does not exist"; }); }); // if (subscription.type === SUBSCRIPTION_TYPE_CREATE) { // const missingAttributeNames = requiredAttributeNames.filter( // requiredAttributeName => { // return !subscription.attributes.includes(requiredAttributeName); // }, // ); // passOrThrow( // missingAttributeNames.length === 0, // () => // `Missing required attributes in subscription '${entity.name}.${ // subscription.name // }' need to have a defaultValue() function: [ ${missingAttributeNames.join( // ', ', // )} ]`, // ); // } } else if (subscription.type === exports.SUBSCRIPTION_TYPE_CREATE || subscription.type === exports.SUBSCRIPTION_TYPE_UPDATE) { var nonSystemAttributeNames_1 = []; util_1.mapOverProperties(entityAttributes, function (attribute, attributeName) { if (!attribute.isSystemAttribute) { nonSystemAttributeNames_1.push(attributeName); } }); subscription.attributes = nonSystemAttributeNames_1; } if (subscription.delimiter) { util_1.passOrThrow(typeof subscription.delimiter === 'string', function () { return "Subscription '" + entity.name + "." + subscription.name + "' delimiter should be a string"; }); } else { subscription.delimiter = '/'; } if (subscription.wildCard) { // todo make a list of valid wildCards (#, +, *) util_1.passOrThrow(typeof subscription.wildCard === 'string', function () { return "Subscription '" + entity.name + "." + subscription.name + "' wildCard should be a string"; }); } if (subscription.pattern) { // todo validate pattern based on entityAttributes util_1.passOrThrow(typeof subscription.pattern === 'string', function () { return "Subscription '" + entity.name + "." + subscription.name + "' pattern should be a string"; }); } // else { // subscription.pattern = Object.keys(entityAttributes).join( // subscription.delimiter, // ); // } }); return subscriptions; }; exports.processEntitySubscriptions = processEntitySubscriptions;