@contember/engine-server 1.1.0-alpha.1 → 1.1.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/alpine.dockerfile +3 -1
  2. package/debian.dockerfile +3 -1
  3. package/dist/src/MasterContainer.d.ts +104 -8
  4. package/dist/src/MasterContainer.d.ts.map +1 -1
  5. package/dist/src/MasterContainer.js +65 -84
  6. package/dist/src/MasterContainer.js.map +1 -1
  7. package/dist/src/bootstrap/Initializer.d.ts +3 -12
  8. package/dist/src/bootstrap/Initializer.d.ts.map +1 -1
  9. package/dist/src/bootstrap/Initializer.js +8 -24
  10. package/dist/src/bootstrap/Initializer.js.map +1 -1
  11. package/dist/src/config/config.d.ts +7 -49
  12. package/dist/src/config/config.d.ts.map +1 -1
  13. package/dist/src/config/config.js +11 -188
  14. package/dist/src/config/config.js.map +1 -1
  15. package/dist/src/config/configSchema.d.ts +84 -0
  16. package/dist/src/config/configSchema.d.ts.map +1 -0
  17. package/dist/src/config/configSchema.js +80 -0
  18. package/dist/src/config/configSchema.js.map +1 -0
  19. package/dist/src/config/configTemplate.d.ts +2 -0
  20. package/dist/src/config/configTemplate.d.ts.map +1 -0
  21. package/dist/src/config/configTemplate.js +62 -0
  22. package/dist/src/config/configTemplate.js.map +1 -0
  23. package/dist/src/config/projectConfigResolver.d.ts +8 -0
  24. package/dist/src/config/projectConfigResolver.d.ts.map +1 -0
  25. package/dist/src/config/projectConfigResolver.js +63 -0
  26. package/dist/src/config/projectConfigResolver.js.map +1 -0
  27. package/dist/src/config/tenantConfigResolver.d.ts +8 -0
  28. package/dist/src/config/tenantConfigResolver.d.ts.map +1 -0
  29. package/dist/src/config/tenantConfigResolver.js +31 -0
  30. package/dist/src/config/tenantConfigResolver.js.map +1 -0
  31. package/dist/src/http/CollectHttpMetricsMiddelware.d.ts +2 -2
  32. package/dist/src/http/CollectHttpMetricsMiddelware.d.ts.map +1 -1
  33. package/dist/src/http/CollectHttpMetricsMiddelware.js +6 -5
  34. package/dist/src/http/CollectHttpMetricsMiddelware.js.map +1 -1
  35. package/dist/src/project/ProjectContainer.d.ts +14 -16
  36. package/dist/src/project/ProjectContainer.d.ts.map +1 -1
  37. package/dist/src/project/ProjectContainer.js +17 -12
  38. package/dist/src/project/ProjectContainer.js.map +1 -1
  39. package/dist/src/project/ProjectContainerResolver.d.ts +12 -10
  40. package/dist/src/project/ProjectContainerResolver.d.ts.map +1 -1
  41. package/dist/src/project/ProjectContainerResolver.js +26 -33
  42. package/dist/src/project/ProjectContainerResolver.js.map +1 -1
  43. package/dist/src/project/{ProjectGroupState.d.ts → ProjectContainerStore.d.ts} +2 -2
  44. package/dist/src/project/ProjectContainerStore.d.ts.map +1 -0
  45. package/dist/src/project/{ProjectGroupState.js → ProjectContainerStore.js} +4 -4
  46. package/dist/src/project/ProjectContainerStore.js.map +1 -0
  47. package/dist/src/project/ProjectInitializer.d.ts +3 -3
  48. package/dist/src/project/ProjectInitializer.d.ts.map +1 -1
  49. package/dist/src/project/ProjectInitializer.js +4 -4
  50. package/dist/src/project/ProjectInitializer.js.map +1 -1
  51. package/dist/src/project/ProjectSchemaResolver.d.ts +3 -3
  52. package/dist/src/project/ProjectSchemaResolver.d.ts.map +1 -1
  53. package/dist/src/project/ProjectSchemaResolver.js +5 -5
  54. package/dist/src/project/ProjectSchemaResolver.js.map +1 -1
  55. package/dist/src/projectGroup/ProjectGroupContainer.d.ts +23 -0
  56. package/dist/src/projectGroup/ProjectGroupContainer.d.ts.map +1 -0
  57. package/dist/src/projectGroup/ProjectGroupContainer.js +64 -0
  58. package/dist/src/projectGroup/ProjectGroupContainer.js.map +1 -0
  59. package/dist/src/projectGroup/ProjectGroupContainerResolver.d.ts +12 -0
  60. package/dist/src/projectGroup/ProjectGroupContainerResolver.d.ts.map +1 -0
  61. package/dist/src/projectGroup/ProjectGroupContainerResolver.js +36 -0
  62. package/dist/src/projectGroup/ProjectGroupContainerResolver.js.map +1 -0
  63. package/dist/src/start.js +9 -8
  64. package/dist/src/start.js.map +1 -1
  65. package/dist/src/tsconfig.tsbuildinfo +1 -1
  66. package/dist/src/utils/dbMetrics.d.ts +6 -2
  67. package/dist/src/utils/dbMetrics.d.ts.map +1 -1
  68. package/dist/src/utils/dbMetrics.js +13 -16
  69. package/dist/src/utils/dbMetrics.js.map +1 -1
  70. package/dist/tests/cases/http.js +30 -19
  71. package/dist/tests/cases/http.js.map +1 -1
  72. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +22 -21
  74. package/src/MasterContainer.ts +145 -204
  75. package/src/bootstrap/Initializer.ts +9 -34
  76. package/src/config/config.ts +23 -234
  77. package/src/config/configSchema.ts +114 -0
  78. package/src/config/configTemplate.ts +58 -0
  79. package/src/config/projectConfigResolver.ts +83 -0
  80. package/src/config/tenantConfigResolver.ts +41 -0
  81. package/src/http/CollectHttpMetricsMiddelware.ts +6 -5
  82. package/src/project/ProjectContainer.ts +25 -18
  83. package/src/project/ProjectContainerResolver.ts +29 -37
  84. package/src/project/{ProjectGroupState.ts → ProjectContainerStore.ts} +1 -1
  85. package/src/project/ProjectInitializer.ts +5 -9
  86. package/src/project/ProjectSchemaResolver.ts +6 -10
  87. package/src/projectGroup/ProjectGroupContainer.ts +120 -0
  88. package/src/projectGroup/ProjectGroupContainerResolver.ts +47 -0
  89. package/src/start.ts +9 -8
  90. package/src/utils/dbMetrics.ts +19 -20
  91. package/tests/cases/http.ts +35 -22
  92. package/dist/src/project/ProjectGroupState.d.ts.map +0 -1
  93. package/dist/src/project/ProjectGroupState.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contember/engine-server",
3
- "version": "1.1.0-alpha.1",
3
+ "version": "1.1.0-alpha.4",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -8,24 +8,25 @@
8
8
  "test": "uvu dist/tests/cases/ \\.js$"
9
9
  },
10
10
  "dependencies": {
11
- "@contember/authorization": "^1.1.0-alpha.1",
12
- "@contember/config-loader": "^1.1.0-alpha.1",
13
- "@contember/database": "^1.1.0-alpha.1",
14
- "@contember/database-migrations": "^1.1.0-alpha.1",
15
- "@contember/dic": "^1.1.0-alpha.1",
16
- "@contember/engine-common": "^1.1.0-alpha.1",
17
- "@contember/engine-content-api": "^1.1.0-alpha.1",
18
- "@contember/engine-http": "^1.1.0-alpha.1",
19
- "@contember/engine-plugins": "^1.1.0-alpha.1",
20
- "@contember/engine-s3-plugin": "^1.1.0-alpha.1",
21
- "@contember/engine-system-api": "^1.1.0-alpha.1",
22
- "@contember/engine-tenant-api": "^1.1.0-alpha.1",
23
- "@contember/engine-vimeo-plugin": "^1.1.0-alpha.1",
24
- "@contember/queryable": "^1.1.0-alpha.1",
25
- "@contember/schema": "^1.1.0-alpha.1",
26
- "@contember/schema-definition": "^1.1.0-alpha.1",
27
- "@contember/schema-migrations": "^1.1.0-alpha.1",
28
- "@contember/schema-utils": "^1.1.0-alpha.1",
11
+ "@contember/authorization": "^1.1.0-alpha.4",
12
+ "@contember/config-loader": "^1.1.0-alpha.4",
13
+ "@contember/database": "^1.1.0-alpha.4",
14
+ "@contember/database-migrations": "^1.1.0-alpha.4",
15
+ "@contember/dic": "^1.1.0-alpha.4",
16
+ "@contember/engine-common": "^1.1.0-alpha.4",
17
+ "@contember/engine-content-api": "^1.1.0-alpha.4",
18
+ "@contember/engine-http": "^1.1.0-alpha.4",
19
+ "@contember/engine-plugins": "^1.1.0-alpha.4",
20
+ "@contember/engine-s3-plugin": "^1.1.0-alpha.4",
21
+ "@contember/engine-system-api": "^1.1.0-alpha.4",
22
+ "@contember/engine-tenant-api": "^1.1.0-alpha.4",
23
+ "@contember/engine-vimeo-plugin": "^1.1.0-alpha.4",
24
+ "@contember/queryable": "^1.1.0-alpha.4",
25
+ "@contember/schema": "^1.1.0-alpha.4",
26
+ "@contember/schema-definition": "^1.1.0-alpha.4",
27
+ "@contember/schema-migrations": "^1.1.0-alpha.4",
28
+ "@contember/schema-utils": "^1.1.0-alpha.4",
29
+ "@koa/cors": "^3.1.0",
29
30
  "@sentry/node": "^6.8.0",
30
31
  "graphql": "^15.4.0",
31
32
  "heapdump": "^0.3.15",
@@ -36,11 +37,11 @@
36
37
  "uuid": "^8.3.1"
37
38
  },
38
39
  "devDependencies": {
39
- "@contember/engine-api-tester": "^1.1.0-alpha.1",
40
+ "@contember/engine-api-tester": "^1.1.0-alpha.4",
40
41
  "@types/koa-compress": "^4.0.1",
41
42
  "@types/node": "^17.0.5",
42
43
  "@types/supertest": "^2.0.8",
43
44
  "supertest": "^6.0.1",
44
- "uvu": "^0.5.1"
45
+ "uvu": "^0.5.3"
45
46
  }
46
47
  }
@@ -1,87 +1,74 @@
1
- import {
2
- createMapperContainer,
3
- EntitiesSelector,
4
- EntitiesSelectorMapperFactory,
5
- PermissionsByIdentityFactory,
6
- } from '@contember/engine-content-api'
7
1
  import { SystemContainerFactory } from '@contember/engine-system-api'
8
- import { ProjectInitializer as ProjectInitializerInterface, TenantContainerFactory } from '@contember/engine-tenant-api'
9
- import getSystemMigrations from '@contember/engine-system-api/migrations'
2
+ import { TenantContainerFactory } from '@contember/engine-tenant-api'
10
3
  import { Builder } from '@contember/dic'
11
- import { Config } from './config/config'
4
+ import { ServerConfig } from './config/config'
12
5
  import { createDbMetricsRegistrar, logSentryError, ProcessType } from './utils'
13
6
  import { ModificationHandlerFactory } from '@contember/schema-migrations'
14
7
  import { Initializer } from './bootstrap'
15
8
  import { Plugin } from '@contember/engine-plugins'
16
- import { DatabaseCredentials, MigrationsRunner } from '@contember/database-migrations'
17
9
  import { createColllectHttpMetricsMiddleware, createShowMetricsMiddleware } from './http'
18
10
  import {
19
- ApiMiddlewareFactory,
20
- AuthMiddlewareFactory,
21
11
  compose,
22
- ContentServerMiddlewareFactory,
12
+ ContentApiMiddlewareFactory,
13
+ ContentGraphQLContextFactory,
14
+ ContentQueryHandlerFactory,
23
15
  createHomepageMiddleware,
16
+ createModuleInfoMiddleware,
24
17
  createPlaygroundMiddleware,
25
18
  createPoweredByHeaderMiddleware,
26
19
  createProviders,
27
20
  createTimerMiddleware,
28
- ErrorFactory,
21
+ CryptoWrapper,
22
+ ErrorMiddlewareFactory,
29
23
  Koa,
30
- NotModifiedMiddlewareFactory,
31
- ProjectConfigResolver,
32
- ProjectGroupMiddlewareFactory,
33
- ProjectMemberMiddlewareFactory,
34
- ProjectResolveMiddlewareFactory,
24
+ NotModifiedChecker,
25
+ ProjectGroupResolver,
35
26
  Providers,
36
- route,
37
- StageResolveMiddlewareFactory,
38
- SystemGraphQLMiddlewareFactory,
39
- TenantGraphQLMiddlewareFactory,
27
+ route, SystemApiMiddlewareFactory, SystemGraphQLContextFactory,
28
+ SystemGraphQLHandlerFactory, TenantApiMiddlewareFactory, TenantGraphQLContextFactory,
29
+ TenantGraphQLHandlerFactory,
40
30
  } from '@contember/engine-http'
41
31
  import prom from 'prom-client'
42
- import {
43
- ProjectContainerFactory,
44
- ProjectContainerResolver,
45
- ProjectInitializer,
46
- ProjectInitializerProxy,
47
- ProjectSchemaResolver,
48
- ProjectSchemaResolverProxy,
49
- } from './project'
50
- import { ClientBase } from 'pg'
32
+ import { ProjectContainerFactoryFactory } from './project'
51
33
  import { createSecretKey } from 'crypto'
52
34
  import koaCompress from 'koa-compress'
53
35
  import bodyParser from 'koa-bodyparser'
36
+ import { ProjectConfigResolver } from './config/projectConfigResolver'
37
+ import { TenantConfigResolver } from './config/tenantConfigResolver'
38
+ import { ProjectGroupContainerResolver } from './projectGroup/ProjectGroupContainerResolver'
39
+ import { ProjectGroupContainerFactory } from './projectGroup/ProjectGroupContainer'
40
+ import corsMiddleware from '@koa/cors'
54
41
 
55
42
  export interface MasterContainer {
56
43
  initializer: Initializer
57
44
  koa: Koa
58
45
  monitoringKoa: Koa
59
- projectContainerResolver: ProjectContainerResolver
60
- projectInitializer: ProjectInitializerInterface
61
46
  providers: Providers
62
47
  }
63
48
 
64
49
  export interface MasterContainerArgs {
65
50
  debugMode: boolean
66
- config: Config
51
+ serverConfig: ServerConfig
67
52
  projectConfigResolver: ProjectConfigResolver
53
+ tenantConfigResolver: TenantConfigResolver
68
54
  plugins: Plugin[]
69
55
  processType: ProcessType
70
56
  version?: string
71
57
  }
72
58
 
73
59
  export class MasterContainerFactory {
74
- create({
75
- config,
60
+ createBuilder({
61
+ serverConfig,
76
62
  debugMode,
77
63
  plugins,
78
64
  projectConfigResolver,
65
+ tenantConfigResolver,
79
66
  processType,
80
67
  version,
81
- }: MasterContainerArgs): MasterContainer {
82
- const masterContainer = new Builder({})
83
- .addService('config', () =>
84
- config)
68
+ }: MasterContainerArgs) {
69
+ return new Builder({})
70
+ .addService('serverConfig', () =>
71
+ serverConfig)
85
72
  .addService('debugMode', () =>
86
73
  debugMode)
87
74
  .addService('processType', () =>
@@ -90,66 +77,29 @@ export class MasterContainerFactory {
90
77
  version)
91
78
  .addService('projectConfigResolver', () =>
92
79
  projectConfigResolver)
80
+ .addService('tenantConfigResolver', () =>
81
+ tenantConfigResolver)
93
82
  .addService('plugins', () =>
94
83
  plugins)
95
- .addService('tenantContainerFactory', ({ config }) =>
96
- new TenantContainerFactory(config.tenant.db, config.tenant.mailer, config.tenant.credentials))
97
- .addService('systemContainerFactory', () =>
98
- new SystemContainerFactory())
99
- .addService('providers', ({ config }) => {
100
- const encryptionKey = config.tenant.secrets.encryptionKey
101
- ? createSecretKey(Buffer.from(config.tenant.secrets.encryptionKey, 'hex'))
102
- : undefined
103
- return createProviders({ encryptionKey })
104
- })
105
- .addService('projectSchemaResolver', () =>
106
- new ProjectSchemaResolverProxy())
107
- .addService('projectInitializer', () =>
108
- new ProjectInitializerProxy())
109
- .addService('tenantContainer', ({ tenantContainerFactory, providers, projectSchemaResolver, projectInitializer }) =>
110
- tenantContainerFactory.create({
111
- providers,
112
- projectSchemaResolver,
113
- projectInitializer,
114
- }))
84
+ .addService('providers', () =>
85
+ createProviders())
86
+ .addService('tenantContainerFactory', ({ providers }) =>
87
+ new TenantContainerFactory(providers))
115
88
  .addService('modificationHandlerFactory', () =>
116
89
  new ModificationHandlerFactory(ModificationHandlerFactory.defaultFactoryMap))
117
- .addService('permissionsByIdentityFactory', ({}) =>
118
- new PermissionsByIdentityFactory())
119
- .addService('entitiesSelector', ({ permissionsByIdentityFactory, providers }) => {
120
- const mapperFactory: EntitiesSelectorMapperFactory = (db, schema, identityVariables, permissions) =>
121
- createMapperContainer({
122
- schema,
123
- identityVariables,
124
- permissions,
125
- providers,
126
- }).mapperFactory(db)
127
- return new EntitiesSelector(mapperFactory, permissionsByIdentityFactory)
128
- })
129
- .addService('systemDbMigrationsRunnerFactory', () =>
130
- (db: DatabaseCredentials, dbClient: ClientBase) =>
131
- new MigrationsRunner(db, 'system', getSystemMigrations, dbClient))
132
- .addService('systemContainer', ({ systemContainerFactory, entitiesSelector, modificationHandlerFactory, providers, systemDbMigrationsRunnerFactory, tenantContainer }) =>
133
- systemContainerFactory.create({
134
- entitiesSelector,
135
- modificationHandlerFactory,
136
- providers,
137
- systemDbMigrationsRunnerFactory,
138
- identityFetcher: tenantContainer.identityFetcher,
139
- }))
140
- .addService('schemaVersionBuilder', ({ systemContainer }) =>
141
- systemContainer.schemaVersionBuilder)
142
- .addService('projectContainerFactory', ({ debugMode, plugins, schemaVersionBuilder, providers }) =>
143
- new ProjectContainerFactory(debugMode, plugins, schemaVersionBuilder, providers))
144
- .addService('tenantProjectManager', ({ tenantContainer }) =>
145
- tenantContainer.projectManager)
146
- .addService('projectContainerResolver', ({ tenantProjectManager, projectContainerFactory, projectConfigResolver, systemContainer }) =>
147
- new ProjectContainerResolver(projectContainerFactory, projectConfigResolver, tenantProjectManager, systemContainer.projectInitializer))
148
- .addService('tenantGraphQlMiddlewareFactory', ({ tenantContainer }) =>
149
- new TenantGraphQLMiddlewareFactory(tenantContainer.resolvers, tenantContainer.resolverContextFactory, logSentryError))
150
- .addService('systemGraphQLMiddlewareFactory', ({ systemContainer, debugMode }) =>
151
- new SystemGraphQLMiddlewareFactory(systemContainer.systemResolversFactory, systemContainer.resolverContextFactory, logSentryError, debugMode))
152
- .addService('promRegistry', ({ projectContainerResolver, processType, tenantContainer }) => {
90
+ .addService('systemContainerFactory', ({ providers, modificationHandlerFactory }) =>
91
+ new SystemContainerFactory(providers, modificationHandlerFactory))
92
+ .addService('projectContainerFactoryFactory', ({ debugMode, plugins, providers }) =>
93
+ new ProjectContainerFactoryFactory(debugMode, plugins, providers))
94
+ .addService('tenantGraphQLHandlerFactory', () =>
95
+ new TenantGraphQLHandlerFactory(logSentryError))
96
+ .addService('systemGraphQLHandlerFactory', ({ debugMode }) =>
97
+ new SystemGraphQLHandlerFactory(logSentryError, debugMode))
98
+ .addService('projectGroupContainerFactory', ({ providers, systemContainerFactory, tenantContainerFactory, projectContainerFactoryFactory, projectConfigResolver, tenantGraphQLHandlerFactory, systemGraphQLHandlerFactory }) =>
99
+ new ProjectGroupContainerFactory(providers, systemContainerFactory, tenantContainerFactory, projectContainerFactoryFactory, projectConfigResolver, tenantGraphQLHandlerFactory, systemGraphQLHandlerFactory))
100
+ .addService('projectGroupContainerResolver', ({ tenantConfigResolver, projectGroupContainerFactory }) =>
101
+ new ProjectGroupContainerResolver(tenantConfigResolver, projectGroupContainerFactory))
102
+ .addService('promRegistry', ({ processType, projectGroupContainerResolver }) => {
153
103
  if (processType === ProcessType.clusterMaster) {
154
104
  const register = new prom.AggregatorRegistry()
155
105
  prom.collectDefaultMetrics({ register })
@@ -158,122 +108,113 @@ export class MasterContainerFactory {
158
108
  const register = prom.register
159
109
  prom.collectDefaultMetrics({ register })
160
110
  const registrar = createDbMetricsRegistrar(register)
161
- registrar({ connection: tenantContainer.connection, module: 'tenant', project: 'unknown' })
162
- projectContainerResolver.onCreate.push(container =>
163
- registrar({
164
- connection: container.connection,
165
- module: 'content',
166
- project: container.project.slug,
167
- }),
168
- )
111
+ projectGroupContainerResolver.onCreate.push((groupContainer, slug) => {
112
+ groupContainer.projectContainerResolver.onCreate.push(projectContainer =>
113
+ registrar({
114
+ connection: projectContainer.connection,
115
+ labels: {
116
+ contember_module: 'content',
117
+ contember_project: projectContainer.project.slug,
118
+ contember_project_group: slug ?? 'unknown',
119
+ },
120
+ }),
121
+ )
122
+ return registrar({
123
+ connection: groupContainer.tenantContainer.connection,
124
+ labels: {
125
+ contember_module: 'tenant',
126
+ contember_project_group: slug ?? 'unknown',
127
+ contember_project: 'unknown',
128
+ },
129
+ })
130
+ })
169
131
  return register
170
132
  })
171
- .addService('httpErrorFactory', ({ debugMode }) =>
172
- new ErrorFactory(debugMode))
173
- .addService('authMiddlewareFactory', ({ tenantContainer, httpErrorFactory }) =>
174
- new AuthMiddlewareFactory(tenantContainer.apiKeyManager, httpErrorFactory))
175
- .addService('projectGroupMiddlewareFactory', ({ tenantContainer, httpErrorFactory }) =>
176
- new ProjectGroupMiddlewareFactory(config.server.projectGroup?.domainMapping, tenantContainer.projectGroupProvider, httpErrorFactory))
177
- .addService('projectResolverMiddlewareFactory', ({ projectContainerResolver, httpErrorFactory }) =>
178
- new ProjectResolveMiddlewareFactory(projectContainerResolver, httpErrorFactory))
179
- .addService('apiMiddlewareFactory', ({ projectGroupMiddlewareFactory, authMiddlewareFactory }) =>
180
- new ApiMiddlewareFactory(projectGroupMiddlewareFactory, authMiddlewareFactory))
181
- .addService('stageResolveMiddlewareFactory', ({ httpErrorFactory }) =>
182
- new StageResolveMiddlewareFactory(httpErrorFactory))
183
- .addService('notModifiedMiddlewareFactory', () =>
184
- new NotModifiedMiddlewareFactory())
185
- .addService('projectMemberMiddlewareFactory', ({ debugMode, tenantContainer, httpErrorFactory }) =>
186
- new ProjectMemberMiddlewareFactory(debugMode, tenantContainer.projectMemberManager, httpErrorFactory))
187
- .addService('contentServerMiddlewareFactory', () =>
188
- new ContentServerMiddlewareFactory())
189
- .addService(
190
- 'koa',
191
- ({
192
- tenantGraphQlMiddlewareFactory,
193
- systemGraphQLMiddlewareFactory,
194
- apiMiddlewareFactory,
195
- projectResolverMiddlewareFactory,
196
- stageResolveMiddlewareFactory,
197
- notModifiedMiddlewareFactory,
198
- projectMemberMiddlewareFactory,
199
- contentServerMiddlewareFactory,
200
- promRegistry,
201
- debugMode,
202
- version,
203
- config,
204
- }) => {
205
- const app = new Koa()
206
- app.use(
207
- compose([
208
- koaCompress({
209
- br: false,
210
- }),
211
- bodyParser({
212
- jsonLimit: config.server.http.requestBodySize || '1mb',
213
- }),
214
- createPoweredByHeaderMiddleware(debugMode, version ?? 'unknown'),
215
- createColllectHttpMetricsMiddleware(promRegistry),
216
- createTimerMiddleware(),
217
- route('/playground$', createPlaygroundMiddleware()),
218
- createHomepageMiddleware(),
219
- route(
220
- '/content/:projectSlug/:stageSlug$',
221
- compose([
222
- apiMiddlewareFactory.create('content'),
223
- projectResolverMiddlewareFactory.create(),
224
- stageResolveMiddlewareFactory.create(),
225
- notModifiedMiddlewareFactory.create(),
226
- projectMemberMiddlewareFactory.create(),
227
- contentServerMiddlewareFactory.create(),
228
- ]),
229
- ),
230
- route(
231
- '/tenant$',
232
- compose([
233
- apiMiddlewareFactory.create('tenant'),
234
- tenantGraphQlMiddlewareFactory.create(),
235
- ]),
236
- ),
237
- route(
238
- '/system/:projectSlug$',
239
- compose([
240
- apiMiddlewareFactory.create('system'),
241
- projectResolverMiddlewareFactory.create(),
242
- projectMemberMiddlewareFactory.create(),
243
- systemGraphQLMiddlewareFactory.create(),
244
- ]),
245
- ),
246
- ]),
247
- )
133
+ .addService('httpErrorMiddlewareFactory', ({ debugMode }) =>
134
+ new ErrorMiddlewareFactory(debugMode))
135
+ .addService('projectGroupResolver', ({ projectGroupContainerResolver, serverConfig }) => {
136
+ const encryptionKey = serverConfig.projectGroup?.configEncryptionKey
137
+ ? createSecretKey(Buffer.from(serverConfig.projectGroup?.configEncryptionKey, 'hex'))
138
+ : undefined
139
+ return new ProjectGroupResolver(
140
+ serverConfig.projectGroup?.domainMapping,
141
+ serverConfig.projectGroup?.configHeader,
142
+ serverConfig.projectGroup?.configEncryptionKey ? new CryptoWrapper(encryptionKey) : undefined,
143
+ projectGroupContainerResolver,
144
+ )
145
+ })
146
+ .addService('notModifiedChecker', () =>
147
+ new NotModifiedChecker())
148
+ .addService('contentGraphqlContextFactory', ({ providers }) =>
149
+ new ContentGraphQLContextFactory(providers))
150
+ .addService('contentQueryHandlerFactory', ({ debugMode }) =>
151
+ new ContentQueryHandlerFactory(debugMode, logSentryError))
152
+ .addService('contentApiMiddlewareFactory', ({ debugMode, projectGroupResolver, notModifiedChecker, contentGraphqlContextFactory, contentQueryHandlerFactory }) =>
153
+ new ContentApiMiddlewareFactory(debugMode, projectGroupResolver, notModifiedChecker, contentGraphqlContextFactory, contentQueryHandlerFactory))
154
+ .addService('tenantGraphQLContextFactory', () =>
155
+ new TenantGraphQLContextFactory())
156
+ .addService('tenantApiMiddlewareFactory', ({ debugMode, projectGroupResolver, tenantGraphQLContextFactory }) =>
157
+ new TenantApiMiddlewareFactory(debugMode, projectGroupResolver, tenantGraphQLContextFactory))
158
+ .addService('systemGraphQLContextFactory', () =>
159
+ new SystemGraphQLContextFactory())
160
+ .addService('systemApiMiddlewareFactory', ({ debugMode, projectGroupResolver, systemGraphQLContextFactory }) =>
161
+ new SystemApiMiddlewareFactory(debugMode, projectGroupResolver, systemGraphQLContextFactory))
162
+ .addService('koa', ({ contentApiMiddlewareFactory, tenantApiMiddlewareFactory, systemApiMiddlewareFactory, httpErrorMiddlewareFactory, promRegistry, debugMode, version, serverConfig }) => {
163
+ const app = new Koa()
164
+ app.use(
165
+ compose([
166
+ koaCompress({
167
+ br: false,
168
+ }),
169
+ bodyParser({
170
+ jsonLimit: serverConfig.http.requestBodySize || '1mb',
171
+ }),
172
+ createPoweredByHeaderMiddleware(debugMode, version ?? 'unknown'),
173
+ httpErrorMiddlewareFactory.create(),
174
+ createColllectHttpMetricsMiddleware(promRegistry),
175
+ createTimerMiddleware(),
176
+ route('/playground$', createPlaygroundMiddleware()),
177
+ createHomepageMiddleware(),
178
+ corsMiddleware(),
179
+ route(
180
+ '/content/:projectSlug/:stageSlug$',
181
+ compose([
182
+ createModuleInfoMiddleware('content'),
183
+ contentApiMiddlewareFactory.create(),
184
+ ]),
185
+ ),
186
+ route(
187
+ '/tenant$',
188
+ compose([
189
+ createModuleInfoMiddleware('tenant'),
190
+ tenantApiMiddlewareFactory.create(),
191
+ ]),
192
+ ),
193
+ route(
194
+ '/system/:projectSlug$',
195
+ compose([
196
+ createModuleInfoMiddleware('system'),
197
+ systemApiMiddlewareFactory.create(),
198
+ ]),
199
+ ),
200
+ ]),
201
+ )
248
202
 
249
- return app
250
- },
251
- )
203
+ return app
204
+ })
252
205
  .addService('monitoringKoa', ({ promRegistry }) => {
253
206
  const app = new Koa()
254
207
  app.use(createShowMetricsMiddleware(promRegistry))
255
208
 
256
209
  return app
257
210
  })
258
- .addService(
259
- 'initializer',
260
- ({ tenantContainer, systemContainer, projectContainerResolver }) =>
261
- new Initializer(
262
- tenantContainer.migrationsRunnerFactory,
263
- tenantContainer.projectManager,
264
- systemContainer.projectInitializer,
265
- projectContainerResolver,
266
- tenantContainer.projectGroupProvider,
267
- ),
268
- )
269
- .setupService('projectSchemaResolver', (it, { projectContainerResolver, schemaVersionBuilder }) => {
270
- it.setResolver(new ProjectSchemaResolver(projectContainerResolver, schemaVersionBuilder))
271
- })
272
- .setupService('projectInitializer', (it, { projectContainerResolver }) => {
273
- it.setInitializer(new ProjectInitializer(projectContainerResolver))
274
- })
275
- .build()
211
+ .addService('initializer', ({ projectGroupContainerResolver }) =>
212
+ new Initializer(projectGroupContainerResolver))
213
+
214
+ }
276
215
 
277
- return masterContainer.pick('initializer', 'koa', 'monitoringKoa', 'projectContainerResolver', 'projectInitializer', 'providers')
216
+ create(args: MasterContainerArgs): MasterContainer {
217
+ const container = this.createBuilder(args).build()
218
+ return container.pick('initializer', 'koa', 'monitoringKoa', 'providers')
278
219
  }
279
220
  }
@@ -1,17 +1,9 @@
1
- import { MigrationsRunnerFactory, ProjectGroupProvider, ProjectManager } from '@contember/engine-tenant-api'
2
- import { ProjectInitializer } from '@contember/engine-system-api'
3
1
  import { Logger } from '@contember/engine-common'
4
- import { ProjectContainerResolver } from '../project'
5
- import { ProjectConfig } from '@contember/engine-http'
6
- import { Migration } from '@contember/schema-migrations'
2
+ import { ProjectGroupContainerResolver } from '../projectGroup/ProjectGroupContainerResolver'
7
3
 
8
4
  export class Initializer {
9
5
  constructor(
10
- private readonly tenantDbMigrationsRunnerFactory: MigrationsRunnerFactory,
11
- private readonly projectManager: ProjectManager,
12
- private readonly projectInitializer: ProjectInitializer,
13
- private readonly projectContainerResolver: ProjectContainerResolver,
14
- private readonly projectGroupProvider: ProjectGroupProvider,
6
+ private readonly projectGroupContainerResolver: ProjectGroupContainerResolver,
15
7
  ) {}
16
8
 
17
9
  public async initialize(): Promise<string[]> {
@@ -19,39 +11,22 @@ export class Initializer {
19
11
  const logger = new Logger(console.log)
20
12
  logger.group('\nInitializing tenant database')
21
13
  // todo
22
- await this.tenantDbMigrationsRunnerFactory.create('tenant').run(logger.write.bind(logger))
14
+ const groupContainer = await this.projectGroupContainerResolver.getProjectGroupContainer(undefined)
15
+
16
+ await groupContainer.tenantContainer.migrationsRunner.run(logger.write.bind(logger))
23
17
  logger.groupEnd()
24
18
 
19
+ const systemContainer = groupContainer.systemContainer
25
20
  const projects: string[] = []
26
- const group = await this.projectGroupProvider.getGroup(undefined)
27
- for (const container of await this.projectContainerResolver.getAllProjectContainers(group)) {
28
- const project = container.project
21
+ for (const projectContainer of await groupContainer.projectContainerResolver.getAllProjectContainers()) {
22
+ const project = projectContainer.project
29
23
  projects.push(project.slug)
30
24
  logger.group(`\nUpdating project ${project.slug}`)
31
- await this.projectInitializer.initialize(container.systemDatabaseContextFactory, project, logger)
25
+ await systemContainer.projectInitializer.initialize(projectContainer.systemDatabaseContextFactory, project, logger)
32
26
  logger.groupEnd()
33
27
  }
34
28
  // eslint-disable-next-line no-console
35
29
  console.log('')
36
30
  return projects
37
31
  }
38
-
39
- public async createProject(project: ProjectConfig, migrations: Migration[]): Promise<void> {
40
- const { slug, name, ...config } = project
41
- const group = await this.projectGroupProvider.getGroup(undefined)
42
- const result = await this.projectManager.createProject(group, { slug, name, config, secrets: {} }, undefined)
43
- if (!result) {
44
- throw new Error('Project already exists')
45
- }
46
- const container = await this.projectContainerResolver.getProjectContainer(group, project.slug)
47
- if (!container) {
48
- throw new Error('Should not happen')
49
- }
50
- await this.projectInitializer.initialize(
51
- container.systemDatabaseContextFactory,
52
- project,
53
- new Logger(() => null),
54
- migrations,
55
- )
56
- }
57
32
  }