Skip to content

Commit 3747874

Browse files
committed
feat: generate relations while discovering models
Signed-off-by: Muhammad Aaqil <[email protected]>
1 parent 0c7708d commit 3747874

File tree

8 files changed

+442
-50
lines changed

8 files changed

+442
-50
lines changed

packages/cli/generators/discover/index.js

Lines changed: 63 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,12 @@ module.exports = class DiscoveryGenerator extends ArtifactGenerator {
363363
this.artifactInfo.indexesToBeUpdated =
364364
this.artifactInfo.indexesToBeUpdated || [];
365365

366+
const relations = [];
367+
const repositoryConfigs = {
368+
datasource: '',
369+
repositories: new Set(),
370+
repositoryBaseClass: 'DefaultCrudRepository',
371+
};
366372
// eslint-disable-next-line @typescript-eslint/prefer-for-of
367373
for (let i = 0; i < this.artifactInfo.modelDefinitions.length; i++) {
368374
const modelDefinition = this.artifactInfo.modelDefinitions[i];
@@ -391,23 +397,18 @@ module.exports = class DiscoveryGenerator extends ArtifactGenerator {
391397
);
392398
// If targetModel is not in discovered models, skip creating relation
393399
if (targetModel) {
394-
Object.assign(templateData.properties[relation.foreignKey], {
395-
relation,
396-
});
397-
if (!relationImports.includes(relation.type)) {
398-
relationImports.push(relation.type);
399-
}
400-
relationDestinationImports.push(relation.model);
401-
402-
foreignKeys[relationName] = {};
403-
Object.assign(foreignKeys[relationName], {
404-
name: relationName,
405-
entity: relation.model,
406-
entityKey: Object.entries(targetModel.properties).find(
407-
x => x?.[1].id === 1,
408-
)?.[0],
409-
foreignKey: relation.foreignKey,
410-
});
400+
const configs = {};
401+
configs['sourceModel'] = templateData.name;
402+
configs['destinationModel'] = targetModel.name;
403+
configs['foreignKeyName'] = relation.foreignKey;
404+
configs['relationType'] = relation.type;
405+
configs['registerInclusionResolver'] = true;
406+
configs['yes'] = true;
407+
relations.push(configs);
408+
repositoryConfigs['datasource'] =
409+
this.options.datasource || this.options.dataSource;
410+
repositoryConfigs.repositories.add(templateData.name);
411+
repositoryConfigs.repositories.add(targetModel.name);
411412
}
412413
}
413414
// remove model import if the model relation is with itself
@@ -462,12 +463,57 @@ module.exports = class DiscoveryGenerator extends ArtifactGenerator {
462463
// This part at the end is just for the ArtifactGenerator
463464
// end message to output something nice, before it was "Discover undefined was created in src/models/"
464465
this.artifactInfo.type = 'Models';
466+
this.artifactInfo.relationConfigs = relations;
467+
repositoryConfigs['relations'] = JSON.stringify(relations);
468+
this.artifactInfo.repositoryConfigs = repositoryConfigs;
465469
this.artifactInfo.name = this.artifactInfo.modelDefinitions
466470
.map(d => d.name)
467471
.join(',');
468472
}
469473

470474
async end() {
471475
await super.end();
476+
await this._generateRepositories();
477+
}
478+
479+
async _generateRepositories() {
480+
if (
481+
!this.artifactInfo.repositoryConfigs ||
482+
!this.artifactInfo.repositoryConfigs.repositories ||
483+
this.artifactInfo.repositoryConfigs.repositories.size === 0
484+
) {
485+
debug(
486+
'No repository configurations found, skipping repository generation',
487+
);
488+
return;
489+
}
490+
const {repositories, datasource, repositoryBaseClass, relations} =
491+
this.artifactInfo.repositoryConfigs;
492+
// Convert Set to Array and iterate
493+
const modelList = Array.from(repositories);
494+
for (let index = 0; index < modelList.length; index++) {
495+
const model = modelList[index];
496+
const repoGenOptions = {
497+
name: model,
498+
model,
499+
datasource,
500+
repositoryBaseClass,
501+
yes: true,
502+
skipInstall: true,
503+
skipCache: true,
504+
};
505+
if (index === modelList.length - 1) {
506+
repoGenOptions.relations = relations;
507+
}
508+
// Use composeWith to invoke the repository generator
509+
const repoGen = require('../repository');
510+
this.composeWith(
511+
{
512+
Generator: repoGen,
513+
path: require.resolve('../repository'),
514+
},
515+
repoGenOptions,
516+
);
517+
}
472518
}
473519
};

packages/cli/generators/repository/index.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,5 +571,37 @@ module.exports = class RepositoryGenerator extends ArtifactGenerator {
571571
);
572572
this.artifactInfo.name = `${this.artifactInfo.className}Repository`;
573573
await super.end();
574+
await this._generateRelations();
575+
}
576+
577+
async _generateRelations() {
578+
if (!this.artifactInfo.relations) {
579+
debug('No relation configurations found, skipping relation generation');
580+
return;
581+
}
582+
this.artifactInfo.relations = JSON.parse(this.artifactInfo.relations);
583+
if (!this.artifactInfo.relations.length) {
584+
debug('No relation configurations found, skipping relation generation');
585+
return;
586+
}
587+
this.artifactInfo.relations.forEach(relation => {
588+
const repoGen = require('../relation');
589+
this.composeWith(
590+
{
591+
Generator: repoGen,
592+
path: require.resolve('../relation'),
593+
},
594+
{
595+
sourceModel: relation.sourceModel,
596+
destinationModel: relation.destinationModel,
597+
foreignKeyName: relation.foreignKeyName,
598+
relationType: relation.relationType,
599+
registerInclusionResolver: relation.registerInclusionResolver,
600+
yes: true,
601+
skipInstall: true,
602+
skipCache: true,
603+
},
604+
);
605+
});
574606
}
575607
};

packages/cli/lib/base-generator.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ module.exports = class BaseGenerator extends Generator {
461461
);
462462
}
463463
}
464-
process.exit(0);
464+
// process.exit(0);
465465
}
466466

467467
/**

packages/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"node": "18 || 20 || 22"
2626
},
2727
"scripts": {
28-
"test": "lb-mocha --lang en_US.UTF-8 \"test/**/*.js\"",
28+
"test": "lb-mocha --lang en_US.UTF-8 \"test/**/discover.integration.js\"",
2929
"smoke-test": "lb-mocha --allow-console-logs \"smoke-test/**/*.smoke.js\"",
3030
"build:globalize": "slt-globalize -e && git add \"intl/en/messages.json\""
3131
},

0 commit comments

Comments
 (0)