gen-jhipster
Version:
VHipster - Spring Boot + Angular/React/Vue in one handy generator
89 lines (88 loc) • 4.77 kB
JavaScript
/**
* Copyright 2013-2026 the original author or authors from the JHipster project.
*
* This file is part of the JHipster project, see https://www.jhipster.tech/
* for more information.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { lowerFirst } from 'lodash-es';
import { databaseTypes, entityOptions, validations } from "../../../lib/jhipster/index.js";
import { mutateData } from "../../../lib/utils/index.js";
import { stringifyApplicationData } from "./debug.js";
const { NEO4J, NO: DATABASE_NO } = databaseTypes;
const { MapperTypes } = entityOptions;
const { Validations: { REQUIRED }, } = validations;
const { MAPSTRUCT } = MapperTypes;
export default function prepareRelationship(entityWithConfig, relationship, ignoreMissingRequiredRelationship = false) {
const entityName = entityWithConfig.name;
// Look for fields at the other other side of the relationship
const { otherRelationship, relationshipOneToMany, relationshipName, otherEntity } = relationship;
if (!otherRelationship &&
!ignoreMissingRequiredRelationship &&
!relationship.otherEntity.embedded &&
!relationship.relationshipIgnoreBackReference &&
entityWithConfig.databaseType !== NEO4J &&
entityWithConfig.databaseType !== DATABASE_NO &&
(relationshipOneToMany || !relationship.ownerSide)) {
if (otherEntity.builtInUser) {
throw new Error(`Error at entity ${entityName}: relationships with built-in User cannot have back reference`);
}
throw new Error(`Error at entity ${entityName}: could not find the other side of the relationship ${stringifyApplicationData(relationship)}`);
}
else {
this.debug(`Entity ${entityName}: Could not find the other side of the relationship ${stringifyApplicationData(relationship)}`);
}
if (relationship.otherEntityField) {
relationship.relatedField = otherEntity.fields.find(field => field.fieldName === relationship.otherEntityField);
if (relationship.relatedField) {
relationship.relatedField.relatedByOtherEntity = true;
}
}
if (!relationship.relatedField && !otherEntity.embedded) {
Object.defineProperty(relationship, 'relatedField', {
get() {
if (!otherEntity.primaryKey) {
throw new Error(`Error at entity ${entityName}: could not find the related field for the relationship ${relationship.relationshipName}`);
}
const { otherEntityField } = relationship;
const fields = otherEntity.primaryKey.derived ? otherEntity.primaryKey.derivedFields : otherEntity.primaryKey.fields;
if (otherEntityField) {
const relatedField = fields.find(field => field.fieldName === otherEntityField);
if (!relatedField) {
throw new Error(`Error at entity ${entityName}: could not find the related field ${otherEntityField} for the relationship ${relationshipName}`);
}
return relatedField;
}
return fields[0];
},
});
}
if (relationship.otherEntityRelationshipName !== undefined || relationship.otherRelationship) {
mutateData(relationship, {
otherEntityRelationshipName: ({ otherRelationship, otherEntityRelationshipName }) => lowerFirst(otherRelationship?.relationshipName ?? otherEntityRelationshipName),
});
}
if (entityWithConfig.dto === MAPSTRUCT && otherEntity.dto !== MAPSTRUCT && !otherEntity.builtInUser) {
this.log.warn(`Entity ${entityName}: this entity has the DTO option, and it has a relationship with entity "${otherEntity.name}" that doesn't have the DTO option. This will result in an error.`);
}
if (relationship.relationshipValidateRules?.includes(REQUIRED)) {
if (entityName.toLowerCase() === relationship.otherEntityName.toLowerCase()) {
this.log.warn(`Error at entity ${entityName}: required relationships to the same entity are not supported.`);
}
else {
relationship.relationshipValidate = relationship.relationshipRequired = true;
}
}
return relationship;
}