@grapi/server
Version:
Grapi Schema Generator For GraphQL Server
69 lines (68 loc) • 2.47 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 = (field) => `${field.toLowerCase()}Id`;
class UniToOne {
sourceModel;
targetModel;
relationField;
foreignKey;
constructor({ sourceModel, targetModel, relationField, foreignKey, }) {
this.sourceModel = sourceModel;
this.targetModel = targetModel;
this.relationField = relationField;
this.foreignKey = foreignKey || createForeignKey(this.relationField);
}
getType() {
return dataModel_1.RelationType.uniOneToOne;
}
getForeignKey() {
return this.foreignKey;
}
getForeignKeyConfig() {
return [{
model: this.sourceModel,
foreignKey: this.getForeignKey(),
}];
}
getRelationField() {
return this.relationField;
}
setForeignKey(targetId) {
return { [this.foreignKey]: targetId };
}
async createAndSetForeignKey(targetData, context) {
const execution = async (data) => {
const mutation = this.targetModel.getCreateMutationFactory().createMutation(data);
const created = await this.targetModel.getDataSource().create(mutation, context);
return { object: created, data: this.setForeignKey(created.id) };
};
const { rootData, createdData, executed } = await (0, index_1.InputRecursiveRelation)(targetData, this.targetModel, context, execution);
if (executed)
return executed.data;
return (await execution({ ...rootData, ...createdData })).data;
}
async destroyAndUnsetForeignKey(data, context) {
const foreignId = data[this.foreignKey];
if (!foreignId) {
return;
}
await this.targetModel.getDataSource().delete({ id: { [__1.Operator.eq]: foreignId } }, context);
return this.unsetForeignKey();
}
unsetForeignKey() {
return { [this.foreignKey]: null };
}
async join(data, _) {
const targetId = data[this.foreignKey];
if (!targetId) {
return null;
}
const toOneData = await this.targetModel.getDataSource().findOneById(targetId);
return (0, lodash_1.isEmpty)(toOneData) ? null : toOneData;
}
}
exports.default = UniToOne;