1
- import { UnitOfWork , Entity } from '@entities' ;
1
+ import { Entity , UniqueEntityID } from '@entities' ;
2
+ import MapperRegistry from '../../entities/mapper-registry' ;
3
+ import { UnitOfWork } from './unit-of-work' ;
2
4
3
- export default interface Repository < T > {
4
- remove ( t : T ) : Promise < void > ;
5
- removeCollection ( t : T ) : Promise < void > ;
6
- save ( t : T ) : Promise < void > ;
7
- saveCollection ( t : Array < T > ) : Promise < void >
5
+ export interface Gateway {
6
+ startTransaction ( ) : void ;
7
+ abstractFindAll ( entityName : string , criteria : any ) : Promise < Entity < any > [ ] > ;
8
+ abstractFind ( entityName : string , id : UniqueEntityID ) : Promise < Entity < any > > ;
9
+ endTransaction ( ) : void ;
10
+ remove ( e : Entity < any > ) : Promise < void > ;
11
+ removeCollection ( entities : Entity < any > [ ] ) : Promise < void > ;
12
+ save ( e : Entity < any > ) : Promise < void > ;
13
+ saveCollection ( entities : Entity < any > [ ] ) : Promise < void >
8
14
}
9
15
10
- export class BaseGateway {
16
+ export class BaseGateway implements Gateway {
11
17
private uow : UnitOfWork | undefined ;
12
18
13
19
public startTransaction ( ) {
14
20
this . uow = new UnitOfWork ( ) ;
15
21
}
16
22
17
- public save ( e : Entity < any > ) {
23
+ public async abstractFind ( entityName : string , id : UniqueEntityID ) : Promise < Entity < any > > {
24
+ let entity = this . uow . load ( entityName , id ) ;
25
+
26
+ if ( ! entity ) {
27
+ entity = await MapperRegistry . getEntiyMapper ( entityName ) . find ( { id : id . toValue ( ) } ) ;
28
+ }
29
+
30
+ if ( ! entity ) {
31
+ return null ;
32
+ }
33
+
34
+ this . uow . registerClean ( entity ) ;
35
+ return entity ;
36
+ }
37
+
38
+ public async abstractFindAll ( entityName : string , criteria : any ) : Promise < Entity < any > [ ] > {
39
+ const reload = ( entity : Entity < any > ) => {
40
+ if ( ! this . uow )
41
+ entity ;
42
+
43
+ const loaded = this . uow . load ( entityName , entity . id ) ;
44
+
45
+ if ( ! loaded ) {
46
+ this . uow . registerClean ( loaded ) ;
47
+ return entity ;
48
+ }
49
+
50
+ return loaded ;
51
+ }
52
+
53
+ let entities = await MapperRegistry . getEntiyMapper ( entityName ) . findAll ( criteria ) ;
54
+
55
+ for ( let i = 0 ; i < entities . length ; i ++ ) {
56
+ entities [ i ] = reload ( entities [ i ] ) ;
57
+ }
58
+
59
+ return entities ;
60
+ }
61
+
62
+
63
+ public async save ( e : Entity < any > ) {
18
64
if ( this . uow . isNew ( e ) || this . uow . isClean ( e ) ) {
19
65
this . uow . registerDirty ( e ) ;
20
66
return ;
@@ -23,17 +69,17 @@ export class BaseGateway {
23
69
this . uow . registerNew ( e ) ;
24
70
}
25
71
26
- public saveCollection ( entities : Entity < any > [ ] ) {
72
+ public async saveCollection ( entities : Entity < any > [ ] ) {
27
73
for ( const e of entities ) {
28
74
this . save ( e ) ;
29
75
}
30
76
}
31
77
32
- public remove ( e : Entity < any > ) {
78
+ public async remove ( e : Entity < any > ) {
33
79
this . uow . registerRemoved ( e ) ;
34
80
}
35
81
36
- public removeCollection ( entities : Entity < any > [ ] ) {
82
+ public async removeCollection ( entities : Entity < any > [ ] ) {
37
83
for ( const e of entities ) {
38
84
this . remove ( e ) ;
39
85
}
@@ -43,5 +89,4 @@ export class BaseGateway {
43
89
await this . uow . commit ( ) ;
44
90
this . uow = undefined ;
45
91
}
46
-
47
92
}
0 commit comments