UNPKG

@grapi/server

Version:

Grapi Schema Generator For GraphQL Server

92 lines (91 loc) 4.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createHookMap = void 0; const __1 = require(".."); 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 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 = (sourceId, ids, context) => { return Promise.all(ids.map(id => relationImpl.addIdFromOneSide(sourceId, id, 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(); } context.data = (0, lodash_1.omit)(data, oneSideField); await createOperation(); const created = context.response; const { connect: connectRecords, create: createRecords } = relationData; const connectWhere = await (0, index_1.findUniqueObjectsOnModel)(connectRecords, relation.target); if ((0, lodash_1.isEmpty)(connectWhere) === false) { const connectIds = connectWhere.map(v => v.id); await connect(created.id, connectIds, graphqlContext); } if (createRecords) { await create(created.id, createRecords, graphqlContext); } }, wrapUpdate: async (context, updateOperation) => { const { where, data, graphqlContext } = context; const sourceObject = await relation.source.getDataSource().findOne({ where: (0, lodash_1.mapValues)(where, value => { return { [__1.Operator.eq]: value }; }) }); 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 = await (0, index_1.findUniqueObjectsOnModel)((0, lodash_1.get)(relationData, 'disconnect'), relation.target); const deleteWhere = await (0, index_1.findUniqueObjectsOnModel)((0, lodash_1.get)(relationData, 'delete'), relation.target); if ((0, lodash_1.isEmpty)(connectWhere) === false) { const connectIds = connectWhere.map(v => v.id); await connect(sourceObject.id, connectIds, graphqlContext); } if (createRecords) { await create(sourceObject.id, createRecords, graphqlContext); } if ((0, lodash_1.isEmpty)(disconnectWhere) === false) { const disconnectIds = disconnectWhere.map(v => v.id); await disconnect(sourceObject.id, disconnectIds, graphqlContext); } if ((0, lodash_1.isEmpty)(deleteWhere) === false) { const deleteIds = deleteWhere.map(v => v.id); await destroy(sourceObject.id, deleteIds, graphqlContext); } return updated; }, resolveFields: { [relation.sourceField]: (data, argument, graphqlContext) => { return relationImpl.joinManyOnOneSide(data, argument, graphqlContext); }, }, }, }; }; exports.createHookMap = createHookMap;