Skip to content

Commit

Permalink
fix: allow belongsTo relation with same table
Browse files Browse the repository at this point in the history
Signed-off-by: Muhammad Aaqil <aaqilniz@yahoo.com>
  • Loading branch information
aaqilniz authored and samarpanB committed Mar 23, 2023
1 parent 357d0c3 commit 584e4ac
Show file tree
Hide file tree
Showing 10 changed files with 311 additions and 14 deletions.
18 changes: 13 additions & 5 deletions packages/cli/generators/relation/base-relation.generator.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ module.exports = class BaseRelationGenerator extends ArtifactGenerator {
const imports = this._getRepositoryRequiredImports(
options.destinationModel,
this.artifactInfo.dstRepositoryClassName,
options.sourceModel,
);

relationUtils.addRequiredImports(
Expand Down Expand Up @@ -187,8 +188,12 @@ module.exports = class BaseRelationGenerator extends ArtifactGenerator {
this.artifactInfo.relationName = options.relationName;
}

_getRepositoryRequiredImports(dstModelClassName, dstRepositoryClassName) {
return [
_getRepositoryRequiredImports(
dstModelClassName,
dstRepositoryClassName,
srcModelClass,
) {
const imports = [
{
name: dstModelClassName,
module: '../models',
Expand All @@ -201,11 +206,14 @@ module.exports = class BaseRelationGenerator extends ArtifactGenerator {
name: 'Getter',
module: '@loopback/core',
},
{
];
if (dstModelClassName !== srcModelClass) {
imports.push({
name: dstRepositoryClassName,
module: `./${utils.toFileName(dstModelClassName)}.repository`,
},
];
});
}
return imports;
}

_getRepositoryRelationPropertyName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,11 @@ module.exports = class BelongsToRelationGenerator extends (
);

relationUtils.addProperty(sourceClass, modelProperty);
const imports = relationUtils.getRequiredImports(targetModel, relationType);
const imports = relationUtils.getRequiredImports(
targetModel,
relationType,
sourceModel,
);
relationUtils.addRequiredImports(sourceFile, imports);

sourceClass.formatText();
Expand Down Expand Up @@ -147,6 +151,7 @@ module.exports = class BelongsToRelationGenerator extends (
const importsArray = super._getRepositoryRequiredImports(
dstModelClassName,
dstRepositoryClassName,
this.artifactInfo.srcModelClass,
);
importsArray.push({
name: 'BelongsToAccessor',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import {
get,
getModelSchemaRef,
} from '@loopback/rest';
import {
<%= sourceModelClassName %>,
import {<%if (sourceModelClassName != targetModelClassName) { %>
<%= sourceModelClassName %>,<% } %>
<%= targetModelClassName %>,
} from '../models';
import {<%= sourceRepositoryClassName %>} from '../repositories';
Expand Down
15 changes: 9 additions & 6 deletions packages/cli/generators/relation/utils.generator.js
Original file line number Diff line number Diff line change
Expand Up @@ -209,17 +209,20 @@ exports.addRequiredImports = function (sourceFile, imports) {
}
};

exports.getRequiredImports = function (targetModel, relationType) {
return [
{
name: targetModel,
module: './' + utils.toFileName(targetModel) + '.model',
},
exports.getRequiredImports = function (targetModel, relationType, sourceModel) {
const requiredImports = [
{
name: relationType,
module: '@loopback/repository',
},
];
if (sourceModel !== targetModel) {
requiredImports.push({
name: targetModel,
module: './' + utils.toFileName(targetModel) + '.model',
});
}
return requiredImports;
};

exports.addCurrentImport = function (sourceFile, currentImport) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,29 @@ export class OrderRepository extends DefaultCrudRepository<
`;


exports[`lb4 relation checks generated source class repository for same table relation answers {"relationType":"belongsTo","sourceModel":"Employee","destinationModel":"Employee"} generates Employee repository file with different inputs 1`] = `
import {inject, Getter} from '@loopback/core';
import {DefaultCrudRepository, repository, BelongsToAccessor} from '@loopback/repository';
import {DbDataSource} from '../datasources';
import {Employee} from '../models';
export class EmployeeRepository extends DefaultCrudRepository<
Employee,
typeof Employee.prototype.id
> {
public readonly employee: BelongsToAccessor<Employee, typeof Employee.prototype.id>;
constructor(@inject('datasources.db') dataSource: DbDataSource, @repository.getter('EmployeeRepository') protected employeeRepositoryGetter: Getter<EmployeeRepository>,) {
super(Employee, dataSource);
this.employee = this.createBelongsToAccessorFor('employee', employeeRepositoryGetter,);
this.registerInclusionResolver('employee', this.employee.inclusionResolver);
}
}
`;


exports[`lb4 relation checks if the controller file created answers {"relationType":"belongsTo","sourceModel":"Order","destinationModel":"Customer","relationName":"my_customer"} checks controller content with belongsTo relation 1`] = `
import {
repository,
Expand Down Expand Up @@ -160,6 +183,18 @@ export * from './order-customer.controller';
`;


exports[`lb4 relation checks if the controller file created for same table relation answers {"relationType":"belongsTo","sourceModel":"Employee","destinationModel":"Employee"} checks controller content with belongsTo relation with same table 1`] = `
export class EmployeeController {}
`;


exports[`lb4 relation checks if the controller file created for same table relation answers {"relationType":"belongsTo","sourceModel":"Employee","destinationModel":"Employee"} the new controller file added to index.ts file 1`] = `
export * from './employee-employee.controller';
`;


exports[`lb4 relation generates model relation for existing property name verifies that a preexisting property will be overwritten 1`] = `
import {Entity, model, property, belongsTo} from '@loopback/repository';
import {Customer} from './customer.model';
Expand Down Expand Up @@ -245,3 +280,41 @@ export class Order extends Entity {
}
`;


exports[`lb4 relation generates model relation with same table with default foreignKeyName verifies that a preexisting property will be overwritten 1`] = `
import {Entity, model, property, belongsTo} from '@loopback/repository';
@model()
export class Employee extends Entity {
@property({
type: 'number',
id: true,
default: 0,
})
id?: number;
@property({
type: 'string',
})
firstName?: string;
@property({
type: 'string',
})
lastName?: string;
@property({
type: 'number',
})
reportsTo?: string;
@belongsTo(() => Employee, {name: 'reportsToEemployee'})
employeeId: number;
constructor(data?: Partial<Employee>) {
super(data);
}
}
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export class EmployeeController {}
19 changes: 19 additions & 0 deletions packages/cli/test/fixtures/relation/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,21 @@ const SourceEntries = {
file: 'doctor-patient.controller.ts',
content: readSourceFile('./controllers/doctor-patient.controller.ts'),
},
EmployeeModel: {
path: MODEL_APP_PATH,
file: 'employee.model.ts',
content: readSourceFile('./models/employee.model.ts'),
},
EmployeeRepository: {
path: REPOSITORY_APP_PATH,
file: 'employee.repository.ts',
content: readSourceFile('./repositories/employee.repository.ts'),
},
EmployeeController: {
path: CONTROLLER_PATH,
file: 'employee.controller.ts',
content: readSourceFile('./controllers/employee.controller.ts'),
},
};
exports.SourceEntries = SourceEntries;

Expand Down Expand Up @@ -198,6 +213,7 @@ exports.SANDBOX_FILES = [
SourceEntries.DoctorRepository,
SourceEntries.PatientRepository,
SourceEntries.AppointmentRepository,
SourceEntries.EmployeeRepository,

SourceEntries.AccountModel,
SourceEntries.CustomerModel,
Expand All @@ -208,6 +224,8 @@ exports.SANDBOX_FILES = [
SourceEntries.PatientModel,
SourceEntries.AppointmentModel,
SourceEntries.DoctorPatientController,
SourceEntries.EmployeeModel,
SourceEntries.EmployeeController,
];

exports.SANDBOX_FILES2 = [
Expand All @@ -219,6 +237,7 @@ exports.SANDBOX_FILES2 = [
SourceEntries.DoctorRepository,
SourceEntries.PatientRepository,
SourceEntries.AppointmentRepository,
SourceEntries.EmployeeRepository,

SourceEntries.CustomerModel,
SourceEntries.CustomerModelWithInheritance,
Expand Down
30 changes: 30 additions & 0 deletions packages/cli/test/fixtures/relation/models/employee.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import {Entity, model, property} from '@loopback/repository';

@model()
export class Employee extends Entity {
@property({
type: 'number',
id: true,
default: 0,
})
id?: number;

@property({
type: 'string',
})
firstName?: string;

@property({
type: 'string',
})
lastName?: string;

@property({
type: 'number',
})
reportsTo?: string;

constructor(data?: Partial<Employee>) {
super(data);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {inject} from '@loopback/core';
import {DefaultCrudRepository} from '@loopback/repository';
import {DbDataSource} from '../datasources';
import {Employee} from '../models';

export class EmployeeRepository extends DefaultCrudRepository<
Employee,
typeof Employee.prototype.id
> {
constructor(@inject('datasources.db') dataSource: DbDataSource) {
super(Employee, dataSource);
}
}
Loading

0 comments on commit 584e4ac

Please sign in to comment.