shyft
Version:
Model driven GraphQL API framework
194 lines (193 loc) • 9.23 kB
JavaScript
;
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;