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