UNPKG

@grapi/server

Version:

Grapi Schema Generator For GraphQL Server

154 lines (153 loc) 7.72 kB
"use strict"; 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;