UNPKG

@terabits/grapi

Version:

Grapi Schema Generator For GraphQL Server

322 lines (321 loc) 22.5 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; exports.__esModule = true; exports.InputRecursiveRelation = exports.InputMultipleFields = exports.UniToOneRelation = exports.OneToManyRelation = exports.ManyToManyRelation = exports.BiOneToOneRelation = void 0; var dataModel_1 = require("../dataModel"); var type_1 = require("../dataModel/type"); var interface_1 = require("../dataSource/interface"); var hooks_1 = require("../hooks"); var lodash_1 = require("../lodash"); var biOneToOne_1 = require("./biOneToOne"); __createBinding(exports, biOneToOne_1, "default", "BiOneToOneRelation"); var manyToMany_1 = require("./manyToMany"); __createBinding(exports, manyToMany_1, "default", "ManyToManyRelation"); var oneToMany_1 = require("./oneToMany"); __createBinding(exports, oneToMany_1, "default", "OneToManyRelation"); var uniToOne_1 = require("./uniToOne"); __createBinding(exports, uniToOne_1, "default", "UniToOneRelation"); var InputMultipleFields = function (fieldOne, fieldTo, fieldName) { if (!(0, lodash_1.isEmpty)(fieldOne) && !(0, lodash_1.isEmpty)(fieldTo)) { throw new Error("There can be only one input field named ".concat(fieldName)); } }; exports.InputMultipleFields = InputMultipleFields; var InputRecursiveRelation = function (rootData, nextRelation, context, execution) { if (execution === void 0) { execution = undefined; } return __awaiter(void 0, void 0, void 0, function () { var executed, createdData, keysData, keysFields, modelFields, keysRelation; return __generator(this, function (_a) { switch (_a.label) { case 0: executed = undefined; createdData = {}; keysData = (0, lodash_1.keys)(rootData); keysFields = []; modelFields = nextRelation.getFields(); (0, lodash_1.forEach)(modelFields, function (field, key) { if (!field.isScalar() && field.getType() !== type_1.DataModelType.OBJECT) { keysFields.push(key); } }); keysRelation = (0, lodash_1.intersection)(keysData, keysFields); return [4, Promise.all((0, lodash_1.map)(keysRelation, function (key) { return __awaiter(void 0, void 0, void 0, function () { var relationData, relationField, relationConfig, relationTo, create, connect, relationForeignKey, relationSide, relationSameSide, mutation, created, id, mutation, created, id, mutation, created, connectData, connectData, addId_1, connectData; return __generator(this, function (_a) { switch (_a.label) { case 0: relationData = rootData[key] || {}; relationField = modelFields[key]; relationConfig = relationField.getRelationConfig ? relationField.getRelationConfig() : {}; relationTo = relationField.getRelationTo(); create = relationData.create, connect = relationData.connect; relationForeignKey = relationConfig.foreignKey ? relationConfig.foreignKey.key || relationConfig.foreignKey : undefined; rootData = (0, lodash_1.omit)(rootData, key); if (!(relationField.getRelationType() === dataModel_1.RelationType.biOneToOne)) return [3, 11]; (0, exports.InputMultipleFields)(create, connect, key); relationSide = relationConfig.foreignKey.side; relationSameSide = relationTo.getTypename() === relationSide; if (!!(0, lodash_1.isEmpty)(create)) return [3, 5]; return [4, (0, exports.InputRecursiveRelation)(create, relationTo, context)]; case 1: _a.sent(); if (!(relationSameSide && execution)) return [3, 3]; return [4, execution(rootData)]; case 2: executed = _a.sent(); create[relationForeignKey] = executed.object.id; _a.label = 3; case 3: mutation = relationTo.getCreateMutationFactory().createMutation(create); return [4, relationTo.getDataSource().create(mutation, context)]; case 4: created = _a.sent(); if (!relationSameSide) { createdData[relationForeignKey] = created.id; } return [3, 10]; case 5: if (!!(0, lodash_1.isEmpty)(connect)) return [3, 10]; return [4, (0, hooks_1.findUniqueObjectOnModel)(connect, relationTo)]; case 6: id = (_a.sent()).id; if (!!relationSameSide) return [3, 7]; createdData[relationForeignKey] = id; return [3, 10]; case 7: if (!execution) return [3, 10]; return [4, execution(rootData)]; case 8: executed = _a.sent(); return [4, relationTo.getDataSource().updateOneRelation(id, relationForeignKey, executed.object.id, context)]; case 9: _a.sent(); _a.label = 10; case 10: return [3, 36]; case 11: if (!(relationField.getRelationType() === dataModel_1.RelationType.uniOneToOne)) return [3, 17]; (0, exports.InputMultipleFields)(create, connect, key); if (!!(0, lodash_1.isEmpty)(create)) return [3, 14]; return [4, (0, exports.InputRecursiveRelation)(create, relationTo, context)]; case 12: _a.sent(); mutation = relationTo.getCreateMutationFactory().createMutation(create); return [4, relationTo.getDataSource().create(mutation, context)]; case 13: created = _a.sent(); createdData[relationForeignKey] = created.id; _a.label = 14; case 14: if (!!(0, lodash_1.isEmpty)(connect)) return [3, 16]; return [4, (0, hooks_1.findUniqueObjectOnModel)(connect, relationTo)]; case 15: id = (_a.sent()).id; createdData[relationForeignKey] = id; _a.label = 16; case 16: return [3, 36]; case 17: if (!(relationField.getRelationType() === dataModel_1.RelationType.biOneToMany || relationField.getRelationType() === dataModel_1.RelationType.uniOneToMany)) return [3, 30]; if (!relationField.isList()) (0, exports.InputMultipleFields)(create, connect, key); if (!!(0, lodash_1.isEmpty)(create)) return [3, 23]; if (!relationField.isList()) return [3, 21]; return [4, (0, exports.InputRecursiveRelation)(create, relationTo, context)]; case 18: _a.sent(); return [4, execution(rootData)]; case 19: executed = _a.sent(); return [4, Promise.all((0, lodash_1.map)(create, function (dataToCreate) { return __awaiter(void 0, void 0, void 0, function () { var mutation; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4, relationTo .getCreateMutationFactory() .createMutation(__assign(__assign({}, dataToCreate), (_a = {}, _a[relationForeignKey] = executed.object.id, _a)))]; case 1: mutation = _b.sent(); return [4, relationTo .getDataSource() .create(mutation, context)]; case 2: _b.sent(); return [2]; } }); }); }))]; case 20: _a.sent(); return [3, 23]; case 21: mutation = relationTo.getCreateMutationFactory().createMutation(create); return [4, relationTo.getDataSource().create(mutation, context)]; case 22: created = _a.sent(); createdData[relationForeignKey] = created.id; _a.label = 23; case 23: if (!!(0, lodash_1.isEmpty)(connect)) return [3, 29]; if (!relationField.isList()) return [3, 27]; return [4, (0, hooks_1.findUniqueObjectsOnModel)(connect, relationTo)]; case 24: connectData = _a.sent(); return [4, execution(rootData)]; case 25: executed = _a.sent(); return [4, Promise.all((0, lodash_1.map)(connectData, function (_a) { var id = _a.id; return __awaiter(void 0, void 0, void 0, function () { var mutation; var _b, _c; return __generator(this, function (_d) { switch (_d.label) { case 0: return [4, relationTo .getCreateMutationFactory() .createMutation((_b = {}, _b[relationForeignKey] = executed.object.id, _b))]; case 1: mutation = _d.sent(); return [4, relationTo .getDataSource() .update({ id: (_c = {}, _c[interface_1.Operator.eq] = id, _c) }, mutation, context)]; case 2: _d.sent(); return [2]; } }); }); }))]; case 26: _a.sent(); return [3, 29]; case 27: return [4, (0, hooks_1.findUniqueObjectOnModel)(connect, relationTo)]; case 28: connectData = _a.sent(); createdData[relationForeignKey] = connectData.id; _a.label = 29; case 29: return [3, 36]; case 30: if (!(relationField.getRelationType() === dataModel_1.RelationType.biManyToMany)) return [3, 36]; return [4, execution(rootData)]; case 31: executed = _a.sent(); addId_1 = function (id) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, relationTo.getDataSource().addIdToManyRelation(nextRelation.getNamings().singular, relationTo.getNamings().singular, executed.object.id, id, context)]; case 1: _a.sent(); return [4, nextRelation.getDataSource().addIdToManyRelation(relationTo.getNamings().singular, nextRelation.getNamings().singular, id, executed.object.id, context)]; case 2: _a.sent(); return [2]; } }); }); }; if (!!(0, lodash_1.isEmpty)(create)) return [3, 33]; return [4, Promise.all((0, lodash_1.map)(create, function (data) { return __awaiter(void 0, void 0, void 0, function () { var mutation, id; return __generator(this, function (_a) { switch (_a.label) { case 0: mutation = relationTo.getCreateMutationFactory().createMutation(data); return [4, relationTo.getDataSource().create(mutation)]; case 1: id = (_a.sent()).id; return [4, addId_1(id)]; case 2: _a.sent(); return [2]; } }); }); }))]; case 32: _a.sent(); _a.label = 33; case 33: if (!!(0, lodash_1.isEmpty)(connect)) return [3, 36]; return [4, (0, hooks_1.findUniqueObjectsOnModel)(connect, relationTo)]; case 34: connectData = _a.sent(); return [4, Promise.all((0, lodash_1.map)(connectData, function (_a) { var id = _a.id; return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_b) { switch (_b.label) { case 0: return [4, addId_1(id)]; case 1: _b.sent(); return [2]; } }); }); }))]; case 35: _a.sent(); _a.label = 36; case 36: return [2]; } }); }); }))]; case 1: _a.sent(); return [2, { createdData: createdData, rootData: rootData, executed: executed }]; } }); }); }; exports.InputRecursiveRelation = InputRecursiveRelation;