@grapi/server
Version:
Grapi Schema Generator For GraphQL Server
71 lines (70 loc) • 3.61 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.UniToOneRelation({
sourceModel: relation.source,
targetModel: relation.target,
relationField: relation.sourceField,
foreignKey: (0, lodash_1.get)(relation.metadata, 'foreignKey'),
});
const relationField = relationImpl.getRelationField();
return {
[relation.source.getName()]: {
wrapCreate: async (context, createOperation) => {
const { data, graphqlContext } = context;
const relationData = (0, lodash_1.get)(data, relationField);
if (!relationData) {
return createOperation();
}
const connectId = await (0, index_1.findUniqueObjectOnModel)((0, lodash_1.get)(relationData, 'connect'), relation.target);
const createData = (0, lodash_1.get)(relationData, 'create');
const dataWithoutRelation = (0, lodash_1.omit)(data, relationField);
if (connectId) {
const dataWithConnectId = await relationImpl.setForeignKey(connectId.id);
context.data = { ...dataWithoutRelation, ...dataWithConnectId };
return createOperation();
}
if (createData) {
const dataWithCreateId = await relationImpl.createAndSetForeignKey(createData, graphqlContext);
context.data = { ...dataWithoutRelation, ...dataWithCreateId };
return createOperation();
}
},
wrapUpdate: async (context, updateOperation) => {
const { data, graphqlContext } = context;
const relationData = (0, lodash_1.get)(data, relationField);
if (!relationData) {
return updateOperation();
}
const connectId = await (0, index_1.findUniqueObjectOnModel)((0, lodash_1.get)(relationData, 'connect'), relation.target);
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, relationField);
let dataWithRelationField;
if (connectId) {
dataWithRelationField = await relationImpl.setForeignKey(connectId.id);
}
else if (createData) {
dataWithRelationField = await relationImpl.createAndSetForeignKey(createData, graphqlContext);
}
else if (ifDisconnect) {
dataWithRelationField = await relationImpl.unsetForeignKey();
}
else if (ifDelete) {
dataWithRelationField = await relationImpl.destroyAndUnsetForeignKey(data, graphqlContext);
}
context.data = { ...dataWithoutRelation, ...dataWithRelationField };
return updateOperation();
},
resolveFields: {
[relation.sourceField]: (parent, _, graphqlContext) => relationImpl.join(parent, graphqlContext),
},
},
};
};
exports.createHookMap = createHookMap;