@contember/engine-system-api 1.2.0-alpha.15 → 1.2.0-alpha.16

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contember/engine-system-api",
3
- "version": "1.2.0-alpha.15",
3
+ "version": "1.2.0-alpha.16",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -9,22 +9,22 @@
9
9
  "test": "vitest"
10
10
  },
11
11
  "dependencies": {
12
- "@contember/authorization": "^1.2.0-alpha.15",
13
- "@contember/database": "^1.2.0-alpha.15",
14
- "@contember/database-migrations": "^1.2.0-alpha.15",
15
- "@contember/dic": "^1.2.0-alpha.15",
16
- "@contember/engine-common": "^1.2.0-alpha.15",
17
- "@contember/graphql-utils": "^1.2.0-alpha.15",
18
- "@contember/queryable": "^1.2.0-alpha.15",
19
- "@contember/schema": "^1.2.0-alpha.15",
20
- "@contember/schema-migrations": "^1.2.0-alpha.15",
21
- "@contember/schema-utils": "^1.2.0-alpha.15",
12
+ "@contember/authorization": "^1.2.0-alpha.16",
13
+ "@contember/database": "^1.2.0-alpha.16",
14
+ "@contember/database-migrations": "^1.2.0-alpha.16",
15
+ "@contember/dic": "^1.2.0-alpha.16",
16
+ "@contember/engine-common": "^1.2.0-alpha.16",
17
+ "@contember/graphql-utils": "^1.2.0-alpha.16",
18
+ "@contember/queryable": "^1.2.0-alpha.16",
19
+ "@contember/schema": "^1.2.0-alpha.16",
20
+ "@contember/schema-migrations": "^1.2.0-alpha.16",
21
+ "@contember/schema-utils": "^1.2.0-alpha.16",
22
22
  "@graphql-tools/utils": "^8.6.13",
23
23
  "graphql-tag": "^2.12.5"
24
24
  },
25
25
  "devDependencies": {
26
- "@contember/engine-api-tester": "^1.2.0-alpha.15",
27
- "@contember/schema-definition": "^1.2.0-alpha.15",
26
+ "@contember/engine-api-tester": "^1.2.0-alpha.16",
27
+ "@contember/schema-definition": "^1.2.0-alpha.16",
28
28
  "@graphql-codegen/cli": "^2.6.2",
29
29
  "@graphql-codegen/typescript": "^2.5.1",
30
30
  "@graphql-codegen/typescript-operations": "^2.4.2",
@@ -118,7 +118,7 @@ export class SystemContainerFactory {
118
118
  new EventOldValuesResolver())
119
119
  .addService('systemResolversFactory', ({ stagesQueryResolver, executedMigrationsQueryResolver, migrateMutationResolver, truncateMutationResolver, migrationAlterMutationResolver, eventsQueryResolver, eventOldValuesResolver }) =>
120
120
  new ResolverFactory(stagesQueryResolver, executedMigrationsQueryResolver, migrateMutationResolver, truncateMutationResolver, migrationAlterMutationResolver, eventsQueryResolver, eventOldValuesResolver))
121
- .addService('resolverContextFactory', ({ authorizator, schemaVersionBuilder }) =>
122
- new SystemResolverContextFactory(authorizator, schemaVersionBuilder))
121
+ .addService('resolverContextFactory', ({ authorizator }) =>
122
+ new SystemResolverContextFactory(authorizator))
123
123
  }
124
124
  }
@@ -8,9 +8,10 @@ import {
8
8
  Connection,
9
9
  createDatabaseIfNotExists,
10
10
  DatabaseConfig,
11
+ EventManager,
11
12
  retryTransaction,
12
13
  } from '@contember/database'
13
- import { Logger } from '@contember/engine-common'
14
+ import { FingerCrossedLoggerHandler, Logger } from '@contember/logger'
14
15
 
15
16
  export class ProjectInitializer {
16
17
  constructor(
@@ -26,54 +27,54 @@ export class ProjectInitializer {
26
27
  logger: Logger,
27
28
  ) {
28
29
  const dbContext = databaseContextFactory.create()
29
- if (project.db) {
30
- // todo: use dbContext
31
- logger.group(`Executing system schema migration`)
32
- await createDatabaseIfNotExists(project.db, logger.write.bind(logger))
33
- const singleConnection = Connection.createSingle(project.db)
34
- await singleConnection.scope(async connection => {
35
- const systemSchema = dbContext.client.schema
30
+ return await logger.scope(async initLogger => {
31
+ if (project.db) {
32
+ // todo: use dbContext
33
+ initLogger.debug('Executing system schema migrations')
34
+ await createDatabaseIfNotExists(project.db, message => typeof message === 'string' ? initLogger.warn(message) : initLogger.error(message))
35
+ const singleConnection = Connection.createSingle(project.db, err => initLogger.error(err))
36
+ singleConnection.eventManager.on(EventManager.Event.clientError, err => logger.error(err, { message: 'Database client error' }))
36
37
 
37
- const schemaResolver = (connection: Connection.ConnectionLike) => {
38
- const dbContextMigrations = databaseContextFactory
39
- .withClient(new Client(connection, systemSchema, { module: 'system' }))
40
- .create()
41
- return this.schemaVersionBuilder.buildSchema(dbContextMigrations)
42
- }
43
- await this.systemDbMigrationsRunnerFactory(connection, systemSchema).migrate(
44
- logger.write.bind(logger),
45
- {
46
- schemaResolver,
47
- project,
48
- },
49
- )
50
- })
51
- await singleConnection.end()
52
- logger.groupEnd()
53
- }
54
- await retryTransaction(() =>
55
- dbContext.transaction(async trx => {
56
- await this.initStages(trx, project, logger)
57
- }),
58
- )
59
- if (dbContext.client.connection instanceof Connection) {
60
- await dbContext.client.connection.clearPool()
61
- }
38
+ await singleConnection.scope(async connection => {
39
+ const systemSchema = dbContext.client.schema
40
+
41
+ const schemaResolver = (connection: Connection.ConnectionLike) => {
42
+ const dbContextMigrations = databaseContextFactory
43
+ .withClient(new Client(connection, systemSchema, { module: 'system' }))
44
+ .create()
45
+ return this.schemaVersionBuilder.buildSchema(dbContextMigrations)
46
+ }
47
+ await this.systemDbMigrationsRunnerFactory(connection, systemSchema).migrate(
48
+ message => initLogger.warn(message),
49
+ {
50
+ schemaResolver,
51
+ project,
52
+ },
53
+ )
54
+ })
55
+ await singleConnection.end()
56
+ }
57
+ await retryTransaction(() =>
58
+ dbContext.transaction(async trx => {
59
+ await this.initStages(trx, project, initLogger)
60
+ }),
61
+ message => initLogger.warn(message),
62
+ )
63
+ if (dbContext.client.connection instanceof Connection) {
64
+ await dbContext.client.connection.clearPool()
65
+ }
66
+ }, {}, { handler: FingerCrossedLoggerHandler.factory() })
62
67
  }
63
68
 
64
69
  private async initStages(db: DatabaseContext<Connection.TransactionLike>, project: ProjectConfig, logger: Logger) {
65
-
66
- logger.group(`Creating stages`)
67
-
70
+ logger.debug(`Creating stages`)
68
71
  for (const stage of project.stages) {
69
72
  const created = await this.stageCreator.createStage(db, stage)
70
73
  if (created) {
71
- logger.write(`Created stage ${stage.slug} `)
74
+ logger.warn(`Created stage ${stage.slug}`, { stage: stage.slug })
72
75
  } else {
73
- logger.breadcrumb(`Updated stage ${stage.slug}`)
76
+ logger.debug(`Updated stage ${stage.slug}`, { stage: stage.slug })
74
77
  }
75
78
  }
76
-
77
- logger.groupEnd()
78
79
  }
79
80
  }
@@ -8,6 +8,7 @@ import { ExecutedMigrationsResolver } from './ExecutedMigrationsResolver'
8
8
  import { MigrateErrorCode } from '../../schema'
9
9
  import { SchemaVersionBuilder } from './SchemaVersionBuilder'
10
10
  import { SchemaValidator } from '@contember/schema-utils'
11
+ import { logger } from '@contember/logger'
11
12
 
12
13
  export class ProjectMigrator {
13
14
  constructor(
@@ -120,8 +121,7 @@ export class ProjectMigrator {
120
121
  await db.query(sql)
121
122
  } catch (e) {
122
123
  if (e instanceof QueryError) {
123
- // eslint-disable-next-line no-console
124
- console.error(e)
124
+ logger.error(e, { message: 'Migration failed' })
125
125
  throw new MigrationFailedError(migrationVersion, e.message)
126
126
  }
127
127
  throw e
@@ -10,15 +10,14 @@ import { ItemLoader } from '../utils/batchQuery'
10
10
  export class SystemResolverContextFactory {
11
11
  constructor(
12
12
  private readonly authorizator: Authorizator<Identity>,
13
- private readonly schemaVersionBuilder: SchemaVersionBuilder,
14
13
  ) {}
15
14
 
16
15
  public async create(
16
+ schema: Schema,
17
17
  systemDbContext: DatabaseContext,
18
18
  project: ProjectConfig,
19
19
  identity: Identity,
20
20
  ): Promise<SystemResolverContext> {
21
- const schema = await this.schemaVersionBuilder.buildSchema(systemDbContext)
22
21
  const stagePermissionsFactory = new StagePermissionsFactory(schema)
23
22
  const loaders = new Map<LoaderFactory<any, any>, ItemLoader<any, any>>()
24
23
  return {
@@ -1,10 +1,10 @@
1
1
  import { ApiTester } from '@contember/engine-api-tester'
2
2
  import { ProjectConfig, StageConfig } from '../../../../src'
3
3
  import { assert, test } from 'vitest'
4
+ import { createLogger, JsonStreamLoggerHandler } from '@contember/logger'
4
5
 
5
- import { Logger } from '@contember/engine-common'
6
6
 
7
- const nullLogger = new Logger(() => {})
7
+ const logger = createLogger(new JsonStreamLoggerHandler(process.stderr))
8
8
 
9
9
  test('create stage', async () => {
10
10
  const prodStage: StageConfig = {
@@ -22,7 +22,7 @@ test('create stage', async () => {
22
22
  },
23
23
  })
24
24
 
25
- await tester.systemContainer.projectInitializer.initialize(tester.databaseContextFactory, project, nullLogger)
25
+ await tester.systemContainer.projectInitializer.initialize(tester.databaseContextFactory, project, logger)
26
26
  const createdStagesA = await tester.stages.refreshCreatedStages()
27
27
  assert.ok(createdStagesA.has('prod'))
28
28