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