UNPKG

@grapi/server

Version:

Grapi Schema Generator For GraphQL Server

102 lines (101 loc) 4.62 kB
"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;