-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathreferences-many-relation.generator.js
More file actions
144 lines (127 loc) · 4.31 KB
/
references-many-relation.generator.js
File metadata and controls
144 lines (127 loc) · 4.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
// Node module: @loopback/cli
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
'use strict';
const BaseRelationGenerator = require('./base-relation.generator');
const utils = require('../../lib/utils');
const relationUtils = require('./utils.generator');
module.exports = class ReferencesManyRelationGenerator extends (
BaseRelationGenerator
) {
constructor(args, opts) {
super(args, opts);
}
async generateControllers(options) {
// no controllers
}
async generateModels(options) {
// for repo to generate relation name
this.artifactInfo.relationName = options.relationName;
const modelDir = this.artifactInfo.modelDir;
const sourceModel = options.sourceModel;
const targetModel = options.destinationModel;
const relationType = options.relationType;
const relationName = options.relationName;
const defaultRelationName = options.defaultRelationName;
const foreignKeyName = options.foreignKeyName;
const fkType = options.destinationModelPrimaryKeyType;
const project = new relationUtils.AstLoopBackProject();
const sourceFile = relationUtils.addFileToProject(
project,
modelDir,
sourceModel,
);
const sourceClass = relationUtils.getClassObj(sourceFile, sourceModel);
// this checks if the foreign key already exists, so the 2nd param should be foreignKeyName
relationUtils.doesRelationExist(sourceClass, foreignKeyName, {
force: this.options.force,
});
const modelProperty = this.getReferencesMany(
targetModel,
relationName,
defaultRelationName,
foreignKeyName,
fkType,
);
relationUtils.addProperty(sourceClass, modelProperty);
const imports = relationUtils.getRequiredImports(targetModel, relationType);
relationUtils.addRequiredImports(sourceFile, imports);
sourceClass.formatText();
await sourceFile.save();
}
getReferencesMany(
className,
relationName,
defaultRelationName,
foreignKeyName,
fkType,
) {
// checks if relation name is customized
let relationDecorator = [
{
name: 'referencesMany',
arguments: [`() => ${className}`],
},
];
// already checked if the relation name is the same as the source key before
if (defaultRelationName !== relationName) {
relationDecorator = [
{
name: 'referencesMany',
arguments: [`() => ${className}, {name: '${relationName}'}`],
},
];
}
return {
decorators: relationDecorator,
name: foreignKeyName,
type: fkType + '[]',
};
}
_getRepositoryRequiredImports(dstModelClassName, dstRepositoryClassName) {
const importsArray = super._getRepositoryRequiredImports(
dstModelClassName,
dstRepositoryClassName,
);
importsArray.push({
name: 'ReferencesManyAccessor',
module: '@loopback/repository',
});
return importsArray;
}
_getRepositoryRelationPropertyName() {
return this.artifactInfo.relationName;
}
_initializeProperties(options) {
super._initializeProperties(options);
this.artifactInfo.dstModelPrimaryKey = options.destinationModelPrimaryKey;
}
_getRepositoryRelationPropertyType() {
return (
`ReferencesManyAccessor<` +
`${utils.toClassName(this.artifactInfo.dstModelClass)}` +
`, typeof ${utils.toClassName(this.artifactInfo.srcModelClass)}` +
`.prototype.${this.artifactInfo.srcModelPrimaryKey}>`
);
}
_addCreatorToRepositoryConstructor(classConstructor) {
const relationName = this.artifactInfo.relationName;
const statement =
`this.${relationName} = ` +
`this.createReferencesManyAccessorFor('` +
`${relationName}',` +
` ${utils.camelCase(this.artifactInfo.dstRepositoryClassName)}` +
`Getter,);`;
classConstructor.insertStatements(1, statement);
}
_registerInclusionResolverForRelation(classConstructor, options) {
const relationName = this.artifactInfo.relationName;
if (options.registerInclusionResolver) {
const statement =
`this.registerInclusionResolver(` +
`'${relationName}', this.${relationName}.inclusionResolver);`;
classConstructor.insertStatements(2, statement);
}
}
};