1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | import debugFactory from 'debug';
|
7 | import {DataObject} from '../../common-types';
|
8 | import {Entity} from '../../model';
|
9 | import {EntityCrudRepository} from '../../repositories';
|
10 | import {Getter, HasManyDefinition, InclusionResolver} from '../relation.types';
|
11 | import {resolveHasManyMetadata} from './has-many.helpers';
|
12 | import {createHasManyInclusionResolver} from './has-many.inclusion-resolver';
|
13 | import {
|
14 | DefaultHasManyRepository,
|
15 | HasManyRepository,
|
16 | } from './has-many.repository';
|
17 |
|
18 | const debug = debugFactory(
|
19 | 'loopback:repository:relations:has-many:repository-factory',
|
20 | );
|
21 |
|
22 | export interface HasManyRepositoryFactory<
|
23 | Target extends Entity,
|
24 | ForeignKeyType,
|
25 | > {
|
26 | |
27 |
|
28 |
|
29 | (fkValue: ForeignKeyType): HasManyRepository<Target>;
|
30 |
|
31 | |
32 |
|
33 |
|
34 | inclusionResolver: InclusionResolver<Entity, Target>;
|
35 | }
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 | export function createHasManyRepositoryFactory<
|
51 | Target extends Entity,
|
52 | TargetID,
|
53 | ForeignKeyType,
|
54 | >(
|
55 | relationMetadata: HasManyDefinition,
|
56 | targetRepositoryGetter: Getter<EntityCrudRepository<Target, TargetID>>,
|
57 | ): HasManyRepositoryFactory<Target, ForeignKeyType> {
|
58 | const meta = resolveHasManyMetadata(relationMetadata);
|
59 | debug('Resolved HasMany relation metadata: %o', meta);
|
60 | const result: HasManyRepositoryFactory<Target, ForeignKeyType> = function (
|
61 | fkValue: ForeignKeyType,
|
62 | ) {
|
63 |
|
64 | const constraint: any = {[meta.keyTo]: fkValue};
|
65 | return new DefaultHasManyRepository<
|
66 | Target,
|
67 | TargetID,
|
68 | EntityCrudRepository<Target, TargetID>
|
69 | >(targetRepositoryGetter, constraint as DataObject<Target>);
|
70 | };
|
71 | result.inclusionResolver = createHasManyInclusionResolver(
|
72 | meta,
|
73 | targetRepositoryGetter,
|
74 | );
|
75 | return result;
|
76 | }
|