reiso
Version:
312 lines • 23.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const graphql_1 = require("graphql");
const Model_1 = require("./Model");
const Error_1 = require("../../Modules/Error");
const typesInput = {};
const types = {};
function checkQuota(context, args, quota) {
if (context.quotaLimit) {
if (quota) {
if (typeof quota === 'function') {
context.quota += quota(args, context);
}
else {
context.quota += quota;
}
}
if (context.quotaLimit < context.quota) {
throw new Error_1.LogError("Quota limit", "debug", `You have reached your quota of a query at ${context.quota} of ${context.quotaLimit}`);
}
}
}
exports.checkQuota = checkQuota;
function getInputModelType(model) {
if (typesInput[model.id]) {
return typesInput[model.id];
}
const fields = {};
for (const i in model.fields) {
let field = model.fields[i];
fields[field.name] = {
type: getInputType(field)
};
}
typesInput[model.id] = new graphql_1.GraphQLInputObjectType({
name: model.id,
fields: fields
});
return typesInput[model.id];
}
exports.getInputModelType = getInputModelType;
function getInputTypeSimple(t, arg) {
let type = graphql_1.GraphQLString;
switch (typeof t) {
case 'string':
if (t == 'string') {
type = graphql_1.GraphQLString;
}
else if (t == 'integer') {
type = graphql_1.GraphQLInt;
}
else if (t == 'float') {
type = graphql_1.GraphQLFloat;
}
else if (t == 'boolean') {
type = graphql_1.GraphQLBoolean;
}
else if (t == 'id') {
type = graphql_1.GraphQLID;
}
else {
throw new Error('Undefined arg type: ' + t + ' for ' + arg.name);
}
break;
case 'object':
if (Array.isArray(t)) {
// TODO: Make union types
// const types = t.forEach(t => getInputTypeSimple(t, arg));
// type = GraphQLUnionType;
}
else {
throw new Error('The arg type: ' + typeof arg.type + ' should be String or Function [() => Class or GraphQLType] or an array of them for ' + arg.name);
}
break;
case 'function':
// TODO: resolveType like string into Structure
let func = t();
if (typeof func == 'function') {
let inputModel = Reflect.getMetadata(Model_1.inputMetadataKey, func) || Reflect.getMetadata(Model_1.inputMetadataKey, func.prototype);
if (inputModel) {
type = getInputModelType(inputModel);
}
else {
throw new Error('The arg type: ' + typeof arg.type + ' does not have Model for ' + arg.name);
}
}
else {
type = func;
}
break;
default:
throw new Error('The arg type: ' + typeof arg.type + ' should be String or Function [() => Class or GraphQLType] or an array of them for ' + arg.name);
}
if (!arg.nullable) {
type = new graphql_1.GraphQLNonNull(type);
}
if (arg.array) {
type = new graphql_1.GraphQLList(type);
}
return type;
}
exports.getInputTypeSimple = getInputTypeSimple;
function getInputType(arg) {
if (Array.isArray(arg.type)) {
// TODO: Make union types
// const unionTypes = arg.type.map(t => ({ t, type: getInputTypeSimple(t, arg) }));
// const type = new GraphQLUnionType({
// name: 'Union' + arg.name,
// types: unionTypes.map(t => t.type),
// resolveType: (value) => {
// const resolvedType = unionTypes.find(t => t.t === arg.resolveType(value));
// return resolvedType && resolvedType.type;
// }
// })
// return type;
throw new Error('Not implemented!');
}
else {
return getInputTypeSimple(arg.type, arg);
}
}
exports.getInputType = getInputType;
function getFieldType(arg) {
let type = graphql_1.GraphQLString;
switch (typeof arg.type) {
case 'string':
if (arg.type == 'string') {
type = graphql_1.GraphQLString;
}
else if (arg.type == 'integer') {
type = graphql_1.GraphQLInt;
}
else if (arg.type == 'float') {
type = graphql_1.GraphQLFloat;
}
else if (arg.type == 'boolean') {
type = graphql_1.GraphQLBoolean;
}
else if (arg.type == 'id') {
type = graphql_1.GraphQLID;
}
else {
throw new Error('Undefined arg type: ' + arg.type + ' for ' + arg.name);
}
break;
case 'function':
let func = arg.type();
if (typeof func == 'function') {
let inputModel = Reflect.getMetadata(Model_1.typeMetadataKey, func) || Reflect.getMetadata(Model_1.typeMetadataKey, func.prototype);
if (inputModel) {
type = getModelType(inputModel);
}
else {
throw new Error('The arg type: ' + typeof arg.type + ' does not have Model for ' + arg.name);
}
}
else {
type = func;
}
break;
default:
throw new Error('The arg type: ' + typeof arg.type + ' should be a string or a function [() => Class or GraphQLType] for ' + arg.name);
}
if (arg.array) {
type = new graphql_1.GraphQLList(type);
}
return type;
}
exports.getFieldType = getFieldType;
function getModelType(model) {
if (types[model.id]) {
return types[model.id];
}
const fields = {};
types[model.id] = new graphql_1.GraphQLObjectType({
name: model.id,
fields: fields
});
for (const fieldName in model.fields) {
const fieldRaw = model.fields[fieldName];
if (fieldRaw instanceof Model_1.ModelField) {
const field = fieldRaw;
if (field.substructure) {
const func = field.type();
const inputModel = Reflect.getMetadata(Model_1.typeMetadataKey, func) || Reflect.getMetadata(Model_1.typeMetadataKey, func.prototype);
if (inputModel instanceof Model_1.Model) {
fields[field.name] = getField(inputModel);
}
else {
throw new Error('Substructure should be Model: ' + field.type);
}
}
else {
const args = {};
for (const i in field.args) {
const arg = field.args[i];
args[arg.name] = {
type: getInputType(arg)
};
}
const type = getFieldType(field);
fields[field.name] = {
type: type,
args: args,
resolve: async (obj, argsRaw, context) => {
const params = [];
for (const i in field.args) {
const arg = field.args[i];
params.push(argsRaw[arg.name]);
}
checkQuota(context, params, field.quota);
params.push(context);
if (typeof obj[fieldName] == "function") {
return await obj[fieldName].apply(obj, params);
}
else {
return obj[fieldName];
}
}
};
}
}
}
return types[model.id];
}
exports.getModelType = getModelType;
function getField(model) {
let constr = undefined;
const args = {};
if (model.constr) {
for (const i in model.constr.args) {
const arg = model.constr.args[i];
args[arg.name] = {
type: getInputType(arg)
};
}
constr = async (obj, argsRaw, context) => {
const params = [];
for (const i in model.constr.args) {
const arg = model.constr.args[i];
params.push(argsRaw[arg.name]);
}
checkQuota(context, params, model.quotaConstr);
params.push(context);
if (model.constr.name) {
let target = new (Function.prototype.bind.apply(model.target, params));
target.parent = obj;
await target[model.constr.name].apply(target, params);
return target;
}
else {
let target = new (Function.prototype.bind.apply(model.target, params));
target.parent = obj;
return target;
}
};
}
else {
constr = async (obj, argsRaw, context) => {
checkQuota(context, [], model.quotaConstr);
const target = new model.target();
target.parent = obj;
return target;
};
}
const modelType = getModelType(model);
return {
type: modelType,
args,
resolve: constr
};
}
exports.getField = getField;
function getSubscriptionField(model) {
const args = {};
for (const i in model.args) {
const arg = model.args[i];
args[arg.name] = {
type: getInputType(arg)
};
}
const resolve = async (obj, argsRaw, context) => {
const params = [];
for (const i in model.args) {
const arg = model.args[i];
params.push(argsRaw[arg.name]);
}
params.push(context);
const target = await model.value(...params);
return target;
};
const subscribe = function (obj, argsRaw, context) {
const params = [];
for (const i in model.args) {
const arg = model.args[i];
params.push(argsRaw[arg.name]);
}
checkQuota(context, params, model.quota);
params.push(context);
let target = model.subscribe(...params)(arguments);
return target;
};
const type = getFieldType(model);
return {
type: type,
args: args,
resolve: resolve,
subscribe: subscribe
};
}
exports.getSubscriptionField = getSubscriptionField;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvU2VydmVyL0dyYXBoUUwvSW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FXaUI7QUFFakIsbUNBU2lCO0FBRWpCLCtDQUU2QjtBQUU3QixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBRWpCLG9CQUEyQixPQUFPLEVBQUUsSUFBVyxFQUFFLEtBQWtEO0lBQy9GLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUNwQixJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO2dCQUM3QixPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDekM7aUJBQU07Z0JBQ0gsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7YUFDMUI7U0FDSjtRQUVELElBQUksT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxnQkFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsNkNBQTZDLE9BQU8sQ0FBQyxLQUFLLE9BQU8sT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDckk7S0FDSjtBQUNMLENBQUM7QUFkRCxnQ0FjQztBQUVELDJCQUFrQyxLQUFpQjtJQUMvQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDdEIsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQy9CO0lBRUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUMxQixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxD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