@grapi/server
Version:
Grapi Schema Generator For GraphQL Server
102 lines (101 loc) • 4.62 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const __1 = require("..");
const dataModel_1 = require("../dataModel");
const lodash_1 = require("../lodash");
const index_1 = require("./index");
const createForeignKey = (model) => `${model.getNamings().singular}Id`;
class OneToMany {
oneSideModel;
manySideModel;
oneSideField;
manySideField;
foreignKey;
constructor({ oneSideModel, manySideModel, oneSideField, manySideField, foreignKey, }) {
this.oneSideModel = oneSideModel;
this.manySideModel = manySideModel;
this.oneSideField = oneSideField;
this.manySideField = manySideField;
this.foreignKey = foreignKey || createForeignKey(this.oneSideModel);
}
getType() {
return this.manySideField ? dataModel_1.RelationType.biOneToMany : dataModel_1.RelationType.uniOneToMany;
}
getForeignKey() {
return this.foreignKey;
}
getForeignKeyConfig() {
return [{
model: this.manySideModel,
foreignKey: this.getForeignKey(),
}];
}
getOneSideField() {
return this.oneSideField;
}
getManySideField() {
return this.manySideField;
}
setForeignKeyOnManySide(targetId) {
return { [this.foreignKey]: targetId };
}
async createAndSetForeignKeyOnManySide(targetData, context) {
const execution = async (data) => {
const mutation = this.oneSideModel.getCreateMutationFactory().createMutation(data);
const created = await this.oneSideModel.getDataSource().create(mutation, context);
return { data: this.setForeignKeyOnManySide(created.id), object: created };
};
const { rootData, createdData, executed } = await (0, index_1.InputRecursiveRelation)(targetData, this.oneSideModel, context, execution);
if (!executed)
return (await execution({ ...rootData, ...createdData })).data;
return (executed.data);
}
unsetForeignKeyOnManySide() {
return { [this.foreignKey]: null };
}
async destroyAndUnsetForeignKeyOnManySide(data, context) {
const foreignId = data[this.foreignKey];
if (!foreignId) {
return;
}
await this.oneSideModel.getDataSource().delete({ id: { [__1.Operator.eq]: foreignId } }, context);
return this.unsetForeignKeyOnManySide();
}
async addIdFromOneSide(oneSideId, manySideId, context) {
const mutation = this.manySideModel.getUpdateMutationFactory().createMutation({ [this.foreignKey]: oneSideId });
await this.manySideModel.getDataSource().update({ id: { [__1.Operator.eq]: manySideId } }, mutation, context);
}
async createAndAddFromOneSide(oneSideId, manySideData, context) {
const { rootData, createdData } = await (0, index_1.InputRecursiveRelation)({ ...manySideData, [this.foreignKey]: oneSideId }, this.manySideModel, context);
const mutation = await this.manySideModel
.getCreateMutationFactory()
.createMutation({ ...rootData, ...createdData });
await this.manySideModel
.getDataSource()
.create(mutation, context);
}
async removeIdFromOneSide(oneSideId, manySideId, context) {
const mutation = this.manySideModel.getUpdateMutationFactory().createMutation({ [this.foreignKey]: null });
await this.manySideModel.getDataSource().update({ id: { [__1.Operator.eq]: manySideId } }, mutation, context);
}
async deleteRecordFromOneSide(manySideId, context) {
await this.manySideModel.getDataSource().delete({ id: { [__1.Operator.eq]: manySideId } }, context);
}
async joinManyOnOneSide(data, argument, context) {
let where = (0, lodash_1.get)(argument, `where`, {});
let orderBy = (0, lodash_1.get)(argument, `orderBy`, {});
where = __1.WhereInputPlugin.parseWhereIterate(where, this.manySideModel);
orderBy = __1.OrderInputPlugin.parseOrder(orderBy);
const listFindQuery = { orderBy, where: { ...where, [this.foreignKey]: { [__1.Operator.eq]: data.id } } };
return await this.manySideModel.getDataSource().findManyFromOneRelation(listFindQuery, context);
}
async joinOneOnManySide(data, context) {
const targetId = data[this.foreignKey];
if (!targetId) {
return null;
}
const toOneData = await this.oneSideModel.getDataSource().findOneById(targetId, context);
return (0, lodash_1.isEmpty)(toOneData) ? null : toOneData;
}
}
exports.default = OneToMany;