Skip to content

Commit ce75385

Browse files
committed
fix(repository): make sure foreign key property in keyTo exists in target model
1 parent f0811aa commit ce75385

File tree

3 files changed

+17
-13
lines changed

3 files changed

+17
-13
lines changed

packages/repository/src/relations/belongs-to/belongs-to-accessor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ function resolveBelongsToMetadata(relationMeta: BelongsToDefinition) {
8080
const targetProperties = targetModel.definition.properties;
8181
debug('relation metadata from %o: %o', targetName, targetProperties);
8282

83-
if (relationMeta.keyTo) {
83+
if (relationMeta.keyTo && targetProperties[relationMeta.keyTo]) {
8484
// The explict cast is needed because of a limitation of type inference
8585
return relationMeta as BelongsToResolvedDefinition;
8686
}

packages/repository/src/relations/has-many/has-many-repository.factory.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,13 @@ function resolveHasManyMetadata(
7272
throw new InvalidRelationError(reason, relationMeta);
7373
}
7474

75-
if (relationMeta.keyTo) {
75+
const targetModel = relationMeta.target();
76+
const targetModelProperties =
77+
targetModel.definition && targetModel.definition.properties;
78+
79+
// Make sure that if it already keys to the foreign key property,
80+
// the key exists in the target model
81+
if (relationMeta.keyTo && targetModelProperties[relationMeta.keyTo]) {
7682
// The explict cast is needed because of a limitation of type inference
7783
return relationMeta as HasManyResolvedDefinition;
7884
}
@@ -83,17 +89,13 @@ function resolveHasManyMetadata(
8389
throw new InvalidRelationError(reason, relationMeta);
8490
}
8591

86-
const targetModel = relationMeta.target();
8792
debug(
8893
'Resolved model %s from given metadata: %o',
8994
targetModel.modelName,
9095
targetModel,
9196
);
9297
const defaultFkName = camelCase(sourceModel.modelName + '_id');
93-
const hasDefaultFkProperty =
94-
targetModel.definition &&
95-
targetModel.definition.properties &&
96-
targetModel.definition.properties[defaultFkName];
98+
const hasDefaultFkProperty = targetModelProperties[defaultFkName];
9799

98100
if (!hasDefaultFkProperty) {
99101
const reason = `target model ${targetModel.name} is missing definition of foreign key ${defaultFkName}`;

packages/repository/src/relations/has-one/has-one-repository.factory.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,13 @@ function resolveHasOneMetadata(
6969
throw new InvalidRelationError(reason, relationMeta);
7070
}
7171

72-
if (relationMeta.keyTo) {
72+
const targetModel = relationMeta.target();
73+
const targetModelProperties =
74+
targetModel.definition && targetModel.definition.properties;
75+
76+
// Make sure that if it already keys to the foreign key property,
77+
// the key exists in the target model
78+
if (relationMeta.keyTo && targetModelProperties[relationMeta.keyTo]) {
7379
// The explict cast is needed because of a limitation of type inference
7480
return relationMeta as HasOneResolvedDefinition;
7581
}
@@ -80,17 +86,13 @@ function resolveHasOneMetadata(
8086
throw new InvalidRelationError(reason, relationMeta);
8187
}
8288

83-
const targetModel = relationMeta.target();
8489
debug(
8590
'Resolved model %s from given metadata: %o',
8691
targetModel.modelName,
8792
targetModel,
8893
);
8994
const defaultFkName = camelCase(sourceModel.modelName + '_id');
90-
const hasDefaultFkProperty =
91-
targetModel.definition &&
92-
targetModel.definition.properties &&
93-
targetModel.definition.properties[defaultFkName];
95+
const hasDefaultFkProperty = targetModelProperties[defaultFkName];
9496

9597
if (!hasDefaultFkProperty) {
9698
const reason = `target model ${targetModel.name} is missing definition of foreign key ${defaultFkName}`;

0 commit comments

Comments
 (0)