1 | // Copyright IBM Corp. and LoopBack contributors 2018,2020. All Rights Reserved.
|
2 | // Node module: @loopback/repository
|
3 | // This file is licensed under the MIT License.
|
4 | // License text available at https://opensource.org/licenses/MIT
|
5 |
|
6 | import {Entity, EntityResolver} from '../../model';
|
7 | import {relation} from '../relation.decorator';
|
8 | import {HasManyDefinition, RelationType} from '../relation.types';
|
9 |
|
10 | /**
|
11 | * Decorator for hasMany
|
12 | * Calls property.array decorator underneath the hood and infers foreign key
|
13 | * name from target model name unless explicitly specified
|
14 | * @param targetResolver - Target model for hasMany relation
|
15 | * @param definition - Optional metadata for setting up hasMany relation
|
16 | * @returns A property decorator
|
17 | */
|
18 | export function hasMany<T extends Entity>(
|
19 | targetResolver: EntityResolver<T>,
|
20 | definition?: Partial<HasManyDefinition>,
|
21 | ) {
|
22 | return function (decoratedTarget: object, key: string) {
|
23 | const meta: HasManyDefinition = Object.assign(
|
24 | // default values, can be customized by the caller
|
25 | {name: key},
|
26 | // properties provided by the caller
|
27 | definition,
|
28 | // properties enforced by the decorator
|
29 | {
|
30 | type: RelationType.hasMany,
|
31 | targetsMany: true,
|
32 | source: decoratedTarget.constructor,
|
33 | target: targetResolver,
|
34 | },
|
35 | );
|
36 | relation(meta)(decoratedTarget, key);
|
37 | };
|
38 | }
|