@grapi/server
Version:
Grapi Schema Generator For GraphQL Server
154 lines (153 loc) • 7.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createHookMap = void 0;
const lodash_1 = require("../lodash");
const relation_1 = require("../relation");
const index_1 = require("./index");
const createHookMap = (relation) => {
const relationImpl = new relation_1.OneToManyRelation({
oneSideModel: relation.source,
manySideModel: relation.target,
oneSideField: relation.sourceField,
manySideField: relation.targetField,
foreignKey: (0, index_1.relationForeignKey)(relation.metadata),
});
const oneSideField = relationImpl.getOneSideField();
const manySideField = relationImpl.getManySideField();
const create = (sourceId, records, context) => {
return Promise.all(records.map(async (record) => await relationImpl.createAndAddFromOneSide(sourceId, record, context)));
};
const connect = (sourceId, ids, context) => {
return Promise.all(ids.map(id => relationImpl.addIdFromOneSide(sourceId, id, context)));
};
const disconnect = (sourceId, ids, context) => {
return Promise.all(ids.map(id => relationImpl.removeIdFromOneSide(sourceId, id, context)));
};
const destroy = (ids, context) => {
return Promise.all(ids.map(id => relationImpl.deleteRecordFromOneSide(id, context)));
};
const connectOne = (connectId) => {
return relationImpl.setForeignKeyOnManySide(connectId);
};
const createOne = (targetData, context) => {
return relationImpl.createAndSetForeignKeyOnManySide(targetData, context);
};
const disconnectOne = () => {
return relationImpl.unsetForeignKeyOnManySide();
};
const destroyOne = async (data, context) => {
return await relationImpl.destroyAndUnsetForeignKeyOnManySide(data, context);
};
return {
[relation.source.getName()]: {
wrapCreate: async (context, createOperation) => {
const { data, graphqlContext } = context;
const relationData = (0, lodash_1.get)(data, oneSideField);
if (!relationData) {
return createOperation();
}
const connectWhere = await (0, index_1.findUniqueObjectsOnModel)((0, lodash_1.get)(relationData, 'connect'), relation.target);
const createRecords = (0, lodash_1.get)(relationData, 'create');
context.data = (0, lodash_1.omit)(data, oneSideField);
await createOperation();
const created = context.response;
if (connectWhere) {
const connectIds = connectWhere.map(where => where.id);
await connect(created.id, connectIds, graphqlContext);
}
if (createRecords) {
await create(created.id, createRecords, graphqlContext);
}
return created;
},
wrapUpdate: async (context, updateOperation) => {
const { where, data, graphqlContext } = context;
const relationData = (0, lodash_1.get)(data, oneSideField);
if (!relationData) {
return updateOperation();
}
context.data = (0, lodash_1.omit)(data, oneSideField);
await updateOperation();
const updated = context.response;
const connectWhere = await (0, index_1.findUniqueObjectsOnModel)((0, lodash_1.get)(relationData, 'connect'), relation.target);
const createRecords = (0, lodash_1.get)(relationData, 'create');
const disconnectWhere = (0, lodash_1.get)(relationData, 'disconnect');
const deleteWhere = (0, lodash_1.get)(relationData, 'delete');
if (connectWhere) {
const connectIds = connectWhere.map(v => v.id);
await connect(where.id, connectIds, graphqlContext);
}
if (createRecords) {
await create(where.id, createRecords, graphqlContext);
}
if (disconnectWhere) {
const disconnectIds = disconnectWhere.map(v => v.id);
await disconnect(where.id, disconnectIds, graphqlContext);
}
if (deleteWhere) {
const deleteIds = deleteWhere.map(v => v.id);
await destroy(deleteIds, graphqlContext);
}
return updated;
},
resolveFields: {
[oneSideField]: (data, argument, graphqlContext) => {
return relationImpl.joinManyOnOneSide(data, argument, graphqlContext);
},
},
},
[relation.target.getName()]: {
wrapCreate: async (context, createOperation) => {
const { data, graphqlContext } = context;
const relationData = (0, lodash_1.get)(data, manySideField);
if (!relationData) {
return createOperation();
}
const connectObject = await (0, index_1.findUniqueObjectOnModel)((0, lodash_1.get)(relationData, 'connect'), relation.source);
const createData = (0, lodash_1.get)(relationData, 'create');
const dataWithoutRelation = (0, lodash_1.omit)(data, manySideField);
if (connectObject) {
const dataWithConnectId = await connectOne(connectObject.id);
context.data = { ...dataWithoutRelation, ...dataWithConnectId };
return createOperation();
}
if (createData) {
const dataWithCreateId = await createOne(createData, graphqlContext);
context.data = { ...dataWithoutRelation, ...dataWithCreateId };
return createOperation();
}
},
wrapUpdate: async (context, updateOperation) => {
const { data, graphqlContext } = context;
const relationData = (0, lodash_1.get)(data, manySideField);
if (!relationData) {
return updateOperation();
}
const connectId = await (0, index_1.findUniqueObjectOnModel)((0, lodash_1.get)(relationData, 'connect'), relation.source);
const ifDisconnect = (0, lodash_1.get)(relationData, 'disconnect');
const createData = (0, lodash_1.get)(relationData, 'create');
const ifDelete = (0, lodash_1.get)(relationData, 'delete');
const dataWithoutRelation = (0, lodash_1.omit)(data, manySideField);
let dataWithRelationField;
if (connectId) {
dataWithRelationField = await connectOne(connectId.id);
}
else if (createData) {
dataWithRelationField = await createOne(createData, graphqlContext);
}
else if (ifDisconnect) {
dataWithRelationField = await disconnectOne();
}
else if (ifDelete) {
dataWithRelationField = await destroyOne(data, graphqlContext);
}
context.data = { ...dataWithoutRelation, ...dataWithRelationField };
return updateOperation();
},
resolveFields: {
[relationImpl.getManySideField()]: (parent, _, graphqlContext) => relationImpl.joinOneOnManySide(parent, graphqlContext),
},
},
};
};
exports.createHookMap = createHookMap;