Skip to content

Commit a624d97

Browse files
committed
feat(repository): add "keyFrom" to HasOne/HasMany resolved metadata
Signed-off-by: Miroslav Bajtoš <mbajtoss@gmail.com>
1 parent 3fcf088 commit a624d97

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ const debug = debugFactory('loopback:repository:has-many-helpers');
1515
* Relation definition with optional metadata (e.g. `keyTo`) filled in.
1616
* @internal
1717
*/
18-
export type HasManyResolvedDefinition = HasManyDefinition & {keyTo: string};
18+
export type HasManyResolvedDefinition = HasManyDefinition & {
19+
keyFrom: string;
20+
keyTo: string;
21+
};
1922

2023
/**
2124
* Resolves given hasMany metadata if target is specified to be a resolver.
@@ -54,6 +57,14 @@ export function resolveHasManyMetadata(
5457
throw new InvalidRelationError(reason, relationMeta);
5558
}
5659

60+
// TODO(bajtos) add test coverage (when keyTo is and is not set)
61+
const keyFrom = sourceModel.getIdProperties()[0];
62+
63+
if (relationMeta.keyTo) {
64+
// The explict cast is needed because of a limitation of type inference
65+
return Object.assign(relationMeta, {keyFrom}) as HasManyResolvedDefinition;
66+
}
67+
5768
debug(
5869
'Resolved model %s from given metadata: %o',
5970
targetModel.modelName,
@@ -67,5 +78,5 @@ export function resolveHasManyMetadata(
6778
throw new InvalidRelationError(reason, relationMeta);
6879
}
6980

70-
return Object.assign(relationMeta, {keyTo: defaultFkName});
81+
return Object.assign(relationMeta, {keyFrom, keyTo: defaultFkName});
7182
}

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ const debug = debugFactory('loopback:repository:has-one-helpers');
1515
* Relation definition with optional metadata (e.g. `keyTo`) filled in.
1616
* @internal
1717
*/
18-
export type HasOneResolvedDefinition = HasOneDefinition & {keyTo: string};
18+
export type HasOneResolvedDefinition = HasOneDefinition & {
19+
keyFrom: string;
20+
keyTo: string;
21+
};
1922

2023
/**
2124
* Resolves given hasOne metadata if target is specified to be a resolver.
@@ -54,6 +57,14 @@ export function resolveHasOneMetadata(
5457
throw new InvalidRelationError(reason, relationMeta);
5558
}
5659

60+
// TODO(bajtos) add test coverage (when keyTo is and is not set)
61+
const keyFrom = sourceModel.getIdProperties()[0];
62+
63+
if (relationMeta.keyTo) {
64+
// The explict cast is needed because of a limitation of type inference
65+
return Object.assign(relationMeta, {keyFrom}) as HasOneResolvedDefinition;
66+
}
67+
5768
debug(
5869
'Resolved model %s from given metadata: %o',
5970
targetModel.modelName,
@@ -67,5 +78,5 @@ export function resolveHasOneMetadata(
6778
throw new InvalidRelationError(reason, relationMeta);
6879
}
6980

70-
return Object.assign(relationMeta, {keyTo: defaultFkName});
81+
return Object.assign(relationMeta, {keyFrom, keyTo: defaultFkName});
7182
}

0 commit comments

Comments
 (0)