UNPKG

@grapi/server

Version:

Grapi Schema Generator For GraphQL Server

152 lines (151 loc) 8.76 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.InputRecursiveRelation = exports.InputMultipleFields = exports.UniToOneRelation = exports.OneToManyRelation = exports.ManyToManyRelation = exports.BiOneToOneRelation = void 0; const __1 = require(".."); const dataModel_1 = require("../dataModel"); const type_1 = require("../dataModel/type"); const hooks_1 = require("../hooks"); const lodash_1 = require("../lodash"); var biOneToOne_1 = require("./biOneToOne"); Object.defineProperty(exports, "BiOneToOneRelation", { enumerable: true, get: function () { return __importDefault(biOneToOne_1).default; } }); var manyToMany_1 = require("./manyToMany"); Object.defineProperty(exports, "ManyToManyRelation", { enumerable: true, get: function () { return __importDefault(manyToMany_1).default; } }); var oneToMany_1 = require("./oneToMany"); Object.defineProperty(exports, "OneToManyRelation", { enumerable: true, get: function () { return __importDefault(oneToMany_1).default; } }); var uniToOne_1 = require("./uniToOne"); Object.defineProperty(exports, "UniToOneRelation", { enumerable: true, get: function () { return __importDefault(uniToOne_1).default; } }); const InputMultipleFields = (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 ${fieldName}`); } }; exports.InputMultipleFields = InputMultipleFields; const InputRecursiveRelation = async (rootData, nextRelation, context, execution = undefined) => { let executed = undefined; const createdData = {}; const keysData = (0, lodash_1.keys)(rootData); const keysFields = []; const modelFields = nextRelation.getFields(); (0, lodash_1.forEach)(modelFields, (field, key) => { if (!field.isScalar() && field.getType() !== type_1.DataModelType.OBJECT) { keysFields.push(key); } }); const keysRelation = (0, lodash_1.intersection)(keysData, keysFields); await Promise.all((0, lodash_1.map)(keysRelation, async (key) => { const relationData = rootData[key] || {}; const relationField = modelFields[key]; const relationConfig = relationField.getRelationConfig ? relationField.getRelationConfig() : {}; const relationTo = relationField.getRelationTo(); const { create, connect } = relationData; const relationForeignKey = relationConfig.foreignKey ? relationConfig.foreignKey.key || relationConfig.foreignKey : undefined; rootData = (0, lodash_1.omit)(rootData, key); if (relationField.getRelationType() === dataModel_1.RelationType.biOneToOne) { (0, exports.InputMultipleFields)(create, connect, key); const relationSide = relationConfig.foreignKey.side; const relationSameSide = relationTo.getTypename() === relationSide; if (!(0, lodash_1.isEmpty)(create)) { await (0, exports.InputRecursiveRelation)(create, relationTo, context); if (relationSameSide && execution) { executed = await execution(rootData); create[relationForeignKey] = executed.object.id; } const mutation = relationTo.getCreateMutationFactory().createMutation(create); const created = await relationTo.getDataSource().create(mutation, context); if (!relationSameSide) { createdData[relationForeignKey] = created.id; } } else if (!(0, lodash_1.isEmpty)(connect)) { const { id } = await (0, hooks_1.findUniqueObjectOnModel)(connect, relationTo); if (!relationSameSide) { createdData[relationForeignKey] = id; } else if (execution) { executed = await execution(rootData); await relationTo.getDataSource().updateOneRelation(id, relationForeignKey, executed.object.id, context); } } } else if (relationField.getRelationType() === dataModel_1.RelationType.uniOneToOne) { (0, exports.InputMultipleFields)(create, connect, key); if (!(0, lodash_1.isEmpty)(create)) { await (0, exports.InputRecursiveRelation)(create, relationTo, context); const mutation = relationTo.getCreateMutationFactory().createMutation(create); const created = await relationTo.getDataSource().create(mutation, context); createdData[relationForeignKey] = created.id; } if (!(0, lodash_1.isEmpty)(connect)) { const { id } = await (0, hooks_1.findUniqueObjectOnModel)(connect, relationTo); createdData[relationForeignKey] = id; } } else if (relationField.getRelationType() === dataModel_1.RelationType.biOneToMany || relationField.getRelationType() === dataModel_1.RelationType.uniOneToMany) { if (!relationField.isList()) (0, exports.InputMultipleFields)(create, connect, key); if (!(0, lodash_1.isEmpty)(create)) { if (relationField.isList()) { await (0, exports.InputRecursiveRelation)(create, relationTo, context); executed = await execution(rootData); await Promise.all((0, lodash_1.map)(create, async (dataToCreate) => { const mutation = await relationTo .getCreateMutationFactory() .createMutation({ ...dataToCreate, [relationForeignKey]: executed.object.id }); await relationTo .getDataSource() .create(mutation, context); })); } else { const mutation = relationTo.getCreateMutationFactory().createMutation(create); const created = await relationTo.getDataSource().create(mutation, context); createdData[relationForeignKey] = created.id; } } if (!(0, lodash_1.isEmpty)(connect)) { if (relationField.isList()) { const connectData = await (0, hooks_1.findUniqueObjectsOnModel)(connect, relationTo); executed = await execution(rootData); await Promise.all((0, lodash_1.map)(connectData, async ({ id }) => { const mutation = await relationTo .getCreateMutationFactory() .createMutation({ [relationForeignKey]: executed.object.id }); await relationTo .getDataSource() .update({ id: { [__1.Operator.eq]: id } }, mutation, context); })); } else { const connectData = await (0, hooks_1.findUniqueObjectOnModel)(connect, relationTo); createdData[relationForeignKey] = connectData.id; } } } else if (relationField.getRelationType() === dataModel_1.RelationType.biManyToMany) { executed = await execution(rootData); const addId = async (id) => { await relationTo.getDataSource().addIdToManyRelation(nextRelation.getNamings().singular, relationTo.getNamings().singular, executed.object.id, id, context); await nextRelation.getDataSource().addIdToManyRelation(relationTo.getNamings().singular, nextRelation.getNamings().singular, id, executed.object.id, context); }; if (!(0, lodash_1.isEmpty)(create)) { await Promise.all((0, lodash_1.map)(create, async (data) => { const mutation = relationTo.getCreateMutationFactory().createMutation(data); const { id } = await relationTo.getDataSource().create(mutation); await addId(id); })); } if (!(0, lodash_1.isEmpty)(connect)) { const connectData = await (0, hooks_1.findUniqueObjectsOnModel)(connect, relationTo); await Promise.all((0, lodash_1.map)(connectData, async ({ id }) => { await addId(id); })); } } })); return { createdData, rootData, executed }; }; exports.InputRecursiveRelation = InputRecursiveRelation;