UNPKG

@grapi/server

Version:

Grapi Schema Generator For GraphQL Server

122 lines (121 loc) 6.59 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.BiOneToOneRelation({ modelA: relation.source, modelB: relation.target, modelAField: relation.sourceField, modelBField: relation.targetField, foreignKey: (0, lodash_1.get)(relation.metadata, 'foreignKey.key'), owningSideModelName: (0, lodash_1.get)(relation.metadata, 'foreignKey.side'), }); const owningSideField = relationImpl.getOwningSideField(); const refSideField = relationImpl.getRefSideField(); return { [relationImpl.getOwningSide().getName()]: { wrapCreate: async (context, createOperation) => { const { data, graphqlContext } = context; const relationData = (0, lodash_1.get)(data, owningSideField); if (!relationData) { return createOperation(); } const connectId = await (0, index_1.findUniqueObjectOnModel)((0, lodash_1.get)(relationData, 'connect'), relationImpl.getRefSide()); const createData = (0, lodash_1.get)(relationData, 'create'); const dataWithoutRelation = (0, lodash_1.omit)(data, owningSideField); if (connectId) { const dataWithConnectId = await relationImpl.setForeignKeyOnOwningSide(connectId.id); context.data = { ...dataWithoutRelation, ...dataWithConnectId }; return createOperation(); } if (createData) { const dataWithCreateId = await relationImpl.createAndSetForeignKeyOnOwningSide(createData, graphqlContext); context.data = { ...dataWithoutRelation, ...dataWithCreateId }; return createOperation(); } }, wrapUpdate: async (context, updateOperation) => { const { data, graphqlContext } = context; const relationData = (0, lodash_1.get)(data, owningSideField); if (!relationData) { return updateOperation(); } const connectId = await (0, index_1.findUniqueObjectOnModel)((0, lodash_1.get)(relationData, 'connect'), relationImpl.getRefSide()); 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, owningSideField); let dataWithRelationField; if (connectId) { dataWithRelationField = await relationImpl.setForeignKeyOnOwningSide(connectId.id); } else if (createData) { dataWithRelationField = await relationImpl.createAndSetForeignKeyOnOwningSide(createData, graphqlContext); } else if (ifDisconnect) { dataWithRelationField = await relationImpl.unsetForeignKeyOnOwningSide(); } else if (ifDelete) { dataWithRelationField = await relationImpl.deleteAndUnsetForeignKeyOnOwningSide(data, graphqlContext); } context.data = { ...dataWithoutRelation, ...dataWithRelationField }; return updateOperation(); }, resolveFields: { [relationImpl.getOwningSideField()]: (parent, _, graphqlContext) => relationImpl.joinOnOwningSide(parent, graphqlContext), }, }, [relationImpl.getRefSide().getName()]: { wrapCreate: async (context, createOperation) => { const { data, graphqlContext } = context; const relationData = (0, lodash_1.get)(data, refSideField); if (!relationData) { return createOperation(); } const connectId = await (0, index_1.findUniqueObjectOnModel)((0, lodash_1.get)(relationData, 'connect'), relationImpl.getOwningSide()); const createData = (0, lodash_1.get)(relationData, 'create'); context.data = (0, lodash_1.omit)(data, refSideField); await createOperation(); const created = context.response; if (connectId) { return relationImpl.connectOnRefSide(created.id, connectId.id, graphqlContext); } if (createData) { return relationImpl.createAndConnectOnRefSide(created.id, createData, graphqlContext); } }, wrapUpdate: async (context, updateOperation) => { const { where, data, graphqlContext } = context; const relationData = (0, lodash_1.get)(data, refSideField); if (!relationData) { return updateOperation(); } context.data = (0, lodash_1.omit)(data, refSideField); await updateOperation(); const connectId = await (0, index_1.findUniqueObjectOnModel)((0, lodash_1.get)(relationData, 'connect'), relationImpl.getOwningSide()); const ifDisconnect = (0, lodash_1.get)(relationData, 'disconnect'); const createData = (0, lodash_1.get)(relationData, 'create'); const ifDelete = (0, lodash_1.get)(relationData, 'delete'); if (connectId) { return relationImpl.connectOnRefSide(where.id, connectId.id, graphqlContext); } if (createData) { return relationImpl.createAndConnectOnRefSide(where.id, createData, graphqlContext); } if (ifDisconnect) { return relationImpl.disconnectOnRefSide(where.id, graphqlContext); } if (ifDelete) { return relationImpl.deleteAndDisconnectOnRefSide(where.id, graphqlContext); } }, resolveFields: { [relationImpl.getRefSideField()]: (data, _, graphqlContext) => relationImpl.joinOnRefSide(data, graphqlContext), }, }, }; }; exports.createHookMap = createHookMap;