-
Notifications
You must be signed in to change notification settings - Fork 568
/
configuration.ts
127 lines (117 loc) 路 3.2 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
115
116
117
118
119
120
121
122
123
124
125
126
127
import {
ILifeCycle,
IMidwayApplication,
IMidwayContainer,
MidwayApplicationManager,
MidwayDecoratorService,
App,
Configuration,
Init,
Inject,
} from '@midwayjs/core';
import {
DATA_SOURCE_KEY,
ENTITY_MANAGER_KEY,
ENTITY_MODEL_KEY,
} from './decorator';
import { MikroDataSourceManager } from './dataSourceManager';
import { EntityName, RequestContext } from '@mikro-orm/core';
@Configuration({
importConfigs: [
{
default: {
mikro: {},
},
},
],
namespace: 'mikro',
})
export class MikroConfiguration implements ILifeCycle {
@App()
app: IMidwayApplication;
@Inject()
decoratorService: MidwayDecoratorService;
@Inject()
applicationManager: MidwayApplicationManager;
dataSourceManager: MikroDataSourceManager;
@Init()
async init() {
this.decoratorService.registerPropertyHandler(
ENTITY_MODEL_KEY,
(
propertyName,
meta: {
modelKey: EntityName<any>;
connectionName?: string;
}
) => {
const name =
meta.connectionName ||
this.dataSourceManager.getDefaultDataSourceName();
if (RequestContext.getEntityManager(name)) {
return RequestContext.getEntityManager(name).getRepository(
meta.modelKey
);
} else {
return this.dataSourceManager
.getDataSource(name)
.em.getRepository(meta.modelKey);
}
}
);
this.decoratorService.registerPropertyHandler(
ENTITY_MANAGER_KEY,
(propertyName, meta: { connectionName?: string }) => {
const name =
meta.connectionName ||
this.dataSourceManager.getDefaultDataSourceName();
if (RequestContext.getEntityManager(name)) {
return RequestContext.getEntityManager(name);
} else {
return this.dataSourceManager.getDataSource(name).em;
}
}
);
this.decoratorService.registerPropertyHandler(
DATA_SOURCE_KEY,
(
propertyName,
meta: {
dataSourceName?: string;
}
) => {
return this.dataSourceManager.getDataSource(
meta.dataSourceName ||
this.dataSourceManager.getDefaultDataSourceName()
);
}
);
}
async onReady(container: IMidwayContainer) {
this.dataSourceManager = await container.getAsync(MikroDataSourceManager);
const names = this.dataSourceManager.getDataSourceNames();
const entityManagers = names.map(name => {
return this.dataSourceManager.getDataSource(name).em;
});
if (names.length > 0) {
// create mikro request scope
// https://mikro-orm.io/docs/identity-map
this.applicationManager.getApplications().forEach(app => {
app.useMiddleware(async (ctx, next) => {
if (RequestContext['createAsync']) {
// mikro-orm 5.x
return await RequestContext['createAsync'](entityManagers, next);
} else {
// mikro-orm 6.x
return await RequestContext.create(entityManagers, next);
}
});
});
}
}
async onStop(container: IMidwayContainer) {
if (this.dataSourceManager) {
await this.dataSourceManager.stop();
}
}
}