-
Notifications
You must be signed in to change notification settings - Fork 568
/
configuration.ts
114 lines (107 loc) 路 2.88 KB
/
configuration.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import {
ILifeCycle,
IMidwayApplication,
IMidwayContainer,
MidwayDecoratorService,
MidwayCommonError,
App,
Configuration,
Init,
Inject,
getPropertyType,
} from '@midwayjs/core';
import { ORM_DATA_SOURCE_KEY, ORM_MODEL_KEY } from './decorator';
import { TypeORMDataSourceManager } from './dataSourceManager';
import {
useContainer,
EntityTarget,
TreeRepository,
MongoRepository,
Repository,
} from 'typeorm';
@Configuration({
importConfigs: [
{
default: {
typeorm: {},
midwayLogger: {
clients: {
typeormLogger: {
lazyLoad: true,
fileLogName: 'midway-typeorm.log',
enableError: false,
level: 'info',
},
},
},
},
},
],
namespace: 'typeorm',
})
export class OrmConfiguration implements ILifeCycle {
@App()
app: IMidwayApplication;
@Inject()
decoratorService: MidwayDecoratorService;
dataSourceManager: TypeORMDataSourceManager;
@Init()
async init() {
this.decoratorService.registerPropertyHandler(
ORM_MODEL_KEY,
(
propertyName,
meta: {
modelKey: EntityTarget<unknown>;
connectionName?: string;
},
instance
) => {
const dataSource = this.dataSourceManager.getDataSource(
meta.connectionName ||
this.dataSourceManager.getDataSourceNameByModel(meta.modelKey) ||
this.dataSourceManager.getDefaultDataSourceName()
);
if (!dataSource) {
throw new MidwayCommonError(
`DataSource ${meta.connectionName} not found with current model ${meta.modelKey}, please check it.`
);
}
const type = getPropertyType(instance, propertyName);
if (type.originDesign === Repository) {
return dataSource.getRepository(meta.modelKey);
} else if (type.originDesign === TreeRepository) {
return dataSource.getTreeRepository(meta.modelKey);
} else if (type.originDesign === MongoRepository) {
return dataSource.getMongoRepository(meta.modelKey);
} else {
return dataSource.getRepository(meta.modelKey);
}
}
);
this.decoratorService.registerPropertyHandler(
ORM_DATA_SOURCE_KEY,
(
propertyName,
meta: {
dataSourceName?: string;
}
) => {
return this.dataSourceManager.getDataSource(
meta.dataSourceName ||
this.dataSourceManager.getDefaultDataSourceName()
);
}
);
}
async onReady(container: IMidwayContainer) {
useContainer(container);
this.dataSourceManager = await container.getAsync(TypeORMDataSourceManager);
}
async onStop(container: IMidwayContainer) {
const dataSourceManager = await container.getAsync(
TypeORMDataSourceManager
);
await dataSourceManager.stop();
}
}