@grapi/server
Version:
Grapi Schema Generator For GraphQL Server
152 lines (151 loc) • 8.76 kB
JavaScript
;
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;