@contember/engine-system-api 1.1.0-alpha.0 → 1.1.0-alpha.3
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/dist/src/SystemContainer.d.ts +16 -21
- package/dist/src/SystemContainer.d.ts.map +1 -1
- package/dist/src/SystemContainer.js +14 -9
- package/dist/src/SystemContainer.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrations/2020-03-27-130000-project-migrations.d.ts +4 -0
- package/dist/src/migrations/2020-03-27-130000-project-migrations.d.ts.map +1 -0
- package/{migrations → dist/src/migrations}/2020-03-27-130000-project-migrations.js +2 -2
- package/dist/src/migrations/2020-03-27-130000-project-migrations.js.map +1 -0
- package/dist/src/migrations/2020-05-06-150000-composed-primary.d.ts +4 -0
- package/dist/src/migrations/2020-05-06-150000-composed-primary.d.ts.map +1 -0
- package/{migrations → dist/src/migrations}/2020-05-06-150000-composed-primary.js +13 -13
- package/dist/src/migrations/2020-05-06-150000-composed-primary.js.map +1 -0
- package/dist/src/migrations/2020-06-01-103000-event-trigger-perf.d.ts +4 -0
- package/dist/src/migrations/2020-06-01-103000-event-trigger-perf.d.ts.map +1 -0
- package/{migrations → dist/src/migrations}/2020-06-01-103000-event-trigger-perf.js +9 -8
- package/dist/src/migrations/2020-06-01-103000-event-trigger-perf.js.map +1 -0
- package/dist/src/migrations/2021-05-07-155800-event-log-rework.d.ts +4 -0
- package/dist/src/migrations/2021-05-07-155800-event-log-rework.d.ts.map +1 -0
- package/{migrations → dist/src/migrations}/2021-05-07-155800-event-log-rework.js +34 -33
- package/dist/src/migrations/2021-05-07-155800-event-log-rework.js.map +1 -0
- package/dist/src/migrations/2021-05-19-1232000-event-log-fix-constraint.d.ts +4 -0
- package/dist/src/migrations/2021-05-19-1232000-event-log-fix-constraint.d.ts.map +1 -0
- package/{migrations → dist/src/migrations}/2021-05-19-1232000-event-log-fix-constraint.js +4 -3
- package/dist/src/migrations/2021-05-19-1232000-event-log-fix-constraint.js.map +1 -0
- package/dist/src/migrations/index.d.ts +3 -0
- package/dist/src/migrations/index.d.ts.map +1 -0
- package/dist/src/{model/dependencies/content → migrations}/index.js +2 -1
- package/dist/src/migrations/index.js.map +1 -0
- package/dist/src/migrations/runner.d.ts +3 -0
- package/dist/src/migrations/runner.d.ts.map +1 -0
- package/{migrations/index.js → dist/src/migrations/runner.js} +5 -3
- package/dist/src/migrations/runner.js.map +1 -0
- package/dist/src/migrations/types.d.ts +7 -0
- package/dist/src/migrations/types.d.ts.map +1 -0
- package/dist/src/{migrations.js → migrations/types.js} +1 -1
- package/dist/src/migrations/types.js.map +1 -0
- package/dist/src/model/ProjectInitializer.d.ts.map +1 -1
- package/dist/src/model/ProjectInitializer.js +11 -13
- package/dist/src/model/ProjectInitializer.js.map +1 -1
- package/dist/src/model/ProjectTruncateExecutor.d.ts.map +1 -1
- package/dist/src/model/ProjectTruncateExecutor.js +4 -3
- package/dist/src/model/ProjectTruncateExecutor.js.map +1 -1
- package/dist/src/model/commands/stages/CreateStageCommand.d.ts +8 -0
- package/dist/src/model/commands/stages/CreateStageCommand.d.ts.map +1 -0
- package/dist/src/model/commands/stages/{CreateOrUpdateStageCommand.js → CreateStageCommand.js} +9 -10
- package/dist/src/model/commands/stages/CreateStageCommand.js.map +1 -0
- package/dist/src/model/commands/stages/index.d.ts +1 -1
- package/dist/src/model/commands/stages/index.d.ts.map +1 -1
- package/dist/src/model/commands/stages/index.js +1 -1
- package/dist/src/model/commands/stages/index.js.map +1 -1
- package/dist/src/model/database/DatabaseContext.d.ts +1 -1
- package/dist/src/model/database/DatabaseContext.d.ts.map +1 -1
- package/dist/src/model/database/DatabaseContext.js +4 -8
- package/dist/src/model/database/DatabaseContext.js.map +1 -1
- package/dist/src/model/dependencies/index.d.ts +0 -1
- package/dist/src/model/dependencies/index.d.ts.map +1 -1
- package/dist/src/model/dependencies/index.js +0 -1
- package/dist/src/model/dependencies/index.js.map +1 -1
- package/dist/src/model/dependencies/tenant/IdentityFetcher.d.ts +1 -2
- package/dist/src/model/dependencies/tenant/IdentityFetcher.d.ts.map +1 -1
- package/dist/src/model/dtos/Stage.d.ts +2 -4
- package/dist/src/model/dtos/Stage.d.ts.map +1 -1
- package/dist/src/model/events/EventResponseBuilder.d.ts +1 -2
- package/dist/src/model/events/EventResponseBuilder.d.ts.map +1 -1
- package/dist/src/model/events/EventResponseBuilder.js +2 -2
- package/dist/src/model/events/EventResponseBuilder.js.map +1 -1
- package/dist/src/model/migrations/ProjectMigrator.d.ts +2 -2
- package/dist/src/model/migrations/ProjectMigrator.d.ts.map +1 -1
- package/dist/src/model/migrations/ProjectMigrator.js +6 -7
- package/dist/src/model/migrations/ProjectMigrator.js.map +1 -1
- package/dist/src/model/migrations/index.d.ts +0 -1
- package/dist/src/model/migrations/index.d.ts.map +1 -1
- package/dist/src/model/migrations/index.js +0 -1
- package/dist/src/model/migrations/index.js.map +1 -1
- package/dist/src/model/queries/stages/StageBySlugQuery.d.ts +2 -2
- package/dist/src/model/queries/stages/StageBySlugQuery.d.ts.map +1 -1
- package/dist/src/model/queries/stages/StageBySlugQuery.js.map +1 -1
- package/dist/src/model/queries/stages/StageQueryFactory.d.ts +2 -2
- package/dist/src/model/queries/stages/StageQueryFactory.d.ts.map +1 -1
- package/dist/src/model/queries/stages/StageQueryFactory.js +2 -1
- package/dist/src/model/queries/stages/StageQueryFactory.js.map +1 -1
- package/dist/src/model/queries/stages/StagesQuery.d.ts +1 -1
- package/dist/src/model/queries/stages/StagesQuery.d.ts.map +1 -1
- package/dist/src/model/queries/stages/StagesQuery.js +2 -5
- package/dist/src/model/queries/stages/StagesQuery.js.map +1 -1
- package/dist/src/model/stages/StageCreator.d.ts.map +1 -1
- package/dist/src/model/stages/StageCreator.js +3 -2
- package/dist/src/model/stages/StageCreator.js.map +1 -1
- package/dist/src/resolvers/{ResolverContext.d.ts → SystemResolverContext.d.ts} +5 -8
- package/dist/src/resolvers/SystemResolverContext.d.ts.map +1 -0
- package/dist/src/resolvers/{ResolverContext.js → SystemResolverContext.js} +5 -6
- package/dist/src/resolvers/{ResolverContext.js.map → SystemResolverContext.js.map} +1 -1
- package/dist/src/resolvers/index.d.ts +1 -1
- package/dist/src/resolvers/index.d.ts.map +1 -1
- package/dist/src/resolvers/index.js +1 -1
- package/dist/src/resolvers/index.js.map +1 -1
- package/dist/src/resolvers/mutation/MigrateMutationResolver.d.ts +3 -3
- package/dist/src/resolvers/mutation/MigrateMutationResolver.d.ts.map +1 -1
- package/dist/src/resolvers/mutation/MigrateMutationResolver.js +5 -4
- package/dist/src/resolvers/mutation/MigrateMutationResolver.js.map +1 -1
- package/dist/src/resolvers/mutation/MigrationAlterMutationResolver.d.ts +3 -3
- package/dist/src/resolvers/mutation/MigrationAlterMutationResolver.d.ts.map +1 -1
- package/dist/src/resolvers/mutation/MigrationAlterMutationResolver.js.map +1 -1
- package/dist/src/resolvers/mutation/TruncateMutationResolver.d.ts +2 -2
- package/dist/src/resolvers/mutation/TruncateMutationResolver.d.ts.map +1 -1
- package/dist/src/resolvers/mutation/TruncateMutationResolver.js.map +1 -1
- package/dist/src/resolvers/query/EventsQueryResolver.d.ts +2 -2
- package/dist/src/resolvers/query/EventsQueryResolver.d.ts.map +1 -1
- package/dist/src/resolvers/query/EventsQueryResolver.js +1 -1
- package/dist/src/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/src/resolvers/query/ExecutedMigrationsQueryResolver.d.ts +2 -2
- package/dist/src/resolvers/query/ExecutedMigrationsQueryResolver.d.ts.map +1 -1
- package/dist/src/resolvers/query/ExecutedMigrationsQueryResolver.js.map +1 -1
- package/dist/src/resolvers/query/StagesQueryResolver.d.ts +2 -2
- package/dist/src/resolvers/query/StagesQueryResolver.d.ts.map +1 -1
- package/dist/src/resolvers/query/StagesQueryResolver.js.map +1 -1
- package/dist/src/resolvers/types/EventOldValuesResolver.d.ts +3 -3
- package/dist/src/resolvers/types/EventOldValuesResolver.d.ts.map +1 -1
- package/dist/src/resolvers/types/EventOldValuesResolver.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types.d.ts +1 -0
- package/dist/src/types.d.ts.map +1 -1
- package/{migrations → dist/tests/cases/migrations}/2020-05-06-150000-composed-primary.test.d.ts +0 -0
- package/dist/tests/cases/migrations/2020-05-06-150000-composed-primary.test.d.ts.map +1 -0
- package/{migrations → dist/tests/cases/migrations}/2020-05-06-150000-composed-primary.test.js +12 -12
- package/dist/tests/cases/migrations/2020-05-06-150000-composed-primary.test.js.map +1 -0
- package/{migrations → dist/tests/cases/migrations}/2020-06-01-103000-event-trigger-perf.test.d.ts +0 -0
- package/dist/tests/cases/migrations/2020-06-01-103000-event-trigger-perf.test.d.ts.map +1 -0
- package/{migrations → dist/tests/cases/migrations}/2020-06-01-103000-event-trigger-perf.test.js +7 -7
- package/dist/tests/cases/migrations/2020-06-01-103000-event-trigger-perf.test.js.map +1 -0
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -15
- package/src/SystemContainer.ts +21 -27
- package/src/index.ts +1 -0
- package/{migrations → src/migrations}/2018-08-04-102200-init.sql +9 -9
- package/{migrations → src/migrations}/2018-08-05-130501-trigger-event-function.sql +9 -9
- package/{migrations → src/migrations}/2019-01-14-143432-event-trx-id.sql +4 -4
- package/{migrations → src/migrations}/2019-02-04-154500-event-rebase.sql +6 -6
- package/{migrations → src/migrations}/2019-03-18-104147-event-run-migration-struct.sql +1 -1
- package/{migrations → src/migrations}/2019-07-29-103000-trigger-event-function-fix.sql +6 -6
- package/{migrations → src/migrations}/2019-11-28-100000-missing-setting-fallback.sql +2 -2
- package/{migrations → src/migrations}/2020-03-27-130000-project-migrations.ts +3 -4
- package/{migrations → src/migrations}/2020-05-06-150000-composed-primary.ts +13 -13
- package/{migrations → src/migrations}/2020-06-01-103000-event-trigger-perf.ts +9 -8
- package/{migrations → src/migrations}/2021-03-23-110000-timestamp-fix.sql +2 -2
- package/{migrations → src/migrations}/2021-05-07-155800-event-log-rework.ts +34 -33
- package/{migrations → src/migrations}/2021-05-19-1232000-event-log-fix-constraint.ts +4 -3
- package/src/migrations/2021-12-21-155500-events-up.sql +6 -0
- package/src/migrations/2022-02-08-132600-fn-search-path.sql +7 -0
- package/src/migrations/2022-02-08-140500-drop-deadcode.sql +2 -0
- package/src/migrations/2022-02-08-144400-dynamic-stage-schema.sql +41 -0
- package/src/migrations/index.ts +2 -0
- package/{migrations/index.ts → src/migrations/runner.ts} +2 -2
- package/src/migrations/types.ts +7 -0
- package/src/model/ProjectInitializer.ts +13 -14
- package/src/model/ProjectTruncateExecutor.ts +5 -4
- package/src/model/commands/stages/{CreateOrUpdateStageCommand.ts → CreateStageCommand.ts} +8 -11
- package/src/model/commands/stages/index.ts +1 -1
- package/src/model/database/DatabaseContext.ts +3 -8
- package/src/model/dependencies/index.ts +0 -1
- package/src/model/dependencies/tenant/IdentityFetcher.ts +1 -1
- package/src/model/dtos/Stage.ts +2 -5
- package/src/model/events/EventResponseBuilder.ts +2 -3
- package/src/model/migrations/ProjectMigrator.ts +10 -9
- package/src/model/migrations/index.ts +0 -1
- package/src/model/queries/stages/StageBySlugQuery.ts +2 -2
- package/src/model/queries/stages/StageQueryFactory.ts +3 -2
- package/src/model/queries/stages/StagesQuery.ts +4 -7
- package/src/model/stages/StageCreator.ts +4 -3
- package/src/resolvers/{ResolverContext.ts → SystemResolverContext.ts} +4 -9
- package/src/resolvers/index.ts +1 -1
- package/src/resolvers/mutation/MigrateMutationResolver.ts +9 -8
- package/src/resolvers/mutation/MigrationAlterMutationResolver.ts +3 -3
- package/src/resolvers/mutation/TruncateMutationResolver.ts +2 -2
- package/src/resolvers/query/EventsQueryResolver.ts +3 -3
- package/src/resolvers/query/ExecutedMigrationsQueryResolver.ts +2 -2
- package/src/resolvers/query/StagesQueryResolver.ts +2 -2
- package/src/resolvers/types/EventOldValuesResolver.ts +3 -3
- package/src/types.ts +1 -0
- package/{migrations → tests/cases/migrations}/2020-05-06-150000-composed-primary.test.ts +11 -12
- package/{migrations → tests/cases/migrations}/2020-06-01-103000-event-trigger-perf.test.ts +6 -7
- package/tests/tsconfig.json +0 -3
- package/tsconfig.json +0 -3
- package/dist/src/migrations.d.ts +0 -10
- package/dist/src/migrations.d.ts.map +0 -1
- package/dist/src/migrations.js.map +0 -1
- package/dist/src/model/commands/stages/CreateOrUpdateStageCommand.d.ts +0 -8
- package/dist/src/model/commands/stages/CreateOrUpdateStageCommand.d.ts.map +0 -1
- package/dist/src/model/commands/stages/CreateOrUpdateStageCommand.js.map +0 -1
- package/dist/src/model/dependencies/content/EntitiesSelector.d.ts +0 -28
- package/dist/src/model/dependencies/content/EntitiesSelector.d.ts.map +0 -1
- package/dist/src/model/dependencies/content/EntitiesSelector.js +0 -3
- package/dist/src/model/dependencies/content/EntitiesSelector.js.map +0 -1
- package/dist/src/model/dependencies/content/index.d.ts +0 -2
- package/dist/src/model/dependencies/content/index.d.ts.map +0 -1
- package/dist/src/model/dependencies/content/index.js.map +0 -1
- package/dist/src/model/migrations/MigrationExecutor.d.ts +0 -10
- package/dist/src/model/migrations/MigrationExecutor.d.ts.map +0 -1
- package/dist/src/model/migrations/MigrationExecutor.js +0 -25
- package/dist/src/model/migrations/MigrationExecutor.js.map +0 -1
- package/dist/src/resolvers/ResolverContext.d.ts.map +0 -1
- package/migrations/2020-03-27-130000-project-migrations.d.ts +0 -4
- package/migrations/2020-03-27-130000-project-migrations.d.ts.map +0 -1
- package/migrations/2020-05-06-150000-composed-primary.d.ts +0 -4
- package/migrations/2020-05-06-150000-composed-primary.d.ts.map +0 -1
- package/migrations/2020-05-06-150000-composed-primary.test.d.ts.map +0 -1
- package/migrations/2020-06-01-103000-event-trigger-perf.d.ts +0 -4
- package/migrations/2020-06-01-103000-event-trigger-perf.d.ts.map +0 -1
- package/migrations/2020-06-01-103000-event-trigger-perf.test.d.ts.map +0 -1
- package/migrations/2021-05-07-155800-event-log-rework.d.ts +0 -4
- package/migrations/2021-05-07-155800-event-log-rework.d.ts.map +0 -1
- package/migrations/2021-05-19-1232000-event-log-fix-constraint.d.ts +0 -4
- package/migrations/2021-05-19-1232000-event-log-fix-constraint.d.ts.map +0 -1
- package/migrations/2021-12-21-155500-events-up.sql +0 -6
- package/migrations/index.d.ts +0 -3
- package/migrations/index.d.ts.map +0 -1
- package/migrations/tsconfig.json +0 -15
- package/migrations/tsconfig.tsbuildinfo +0 -1
- package/src/migrations.ts +0 -10
- package/src/model/dependencies/content/EntitiesSelector.ts +0 -32
- package/src/model/dependencies/content/index.ts +0 -1
- package/src/model/migrations/MigrationExecutor.ts +0 -33
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { MigrationBuilder, Name } from '@contember/database-migrations'
|
|
2
|
-
import {
|
|
2
|
+
import { SystemMigrationArgs } from './types'
|
|
3
|
+
import { getJunctionTables } from '../model'
|
|
3
4
|
|
|
4
5
|
const createTrxEvent = (builder: MigrationBuilder, tableName: Name) => {
|
|
5
6
|
builder.createTrigger(tableName, 'log_event_trx', {
|
|
@@ -15,13 +16,13 @@ const createTrxEvent = (builder: MigrationBuilder, tableName: Name) => {
|
|
|
15
16
|
})
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
export default async function (builder: MigrationBuilder, args:
|
|
19
|
+
export default async function (builder: MigrationBuilder, args: SystemMigrationArgs) {
|
|
19
20
|
const schema = await args.schemaResolver()
|
|
20
21
|
const junctionTables = getJunctionTables(schema.model)
|
|
21
|
-
const schemas = args.project.stages.map(
|
|
22
|
-
builder.sql(`LOCK TABLE
|
|
22
|
+
const schemas = args.project.stages.map(it => `stage_${it.slug}`)
|
|
23
|
+
builder.sql(`LOCK TABLE event`)
|
|
23
24
|
builder.sql(`
|
|
24
|
-
ALTER TABLE
|
|
25
|
+
ALTER TABLE schema_migration
|
|
25
26
|
ADD PRIMARY KEY (id)
|
|
26
27
|
`)
|
|
27
28
|
builder.sql(`
|
|
@@ -29,40 +30,40 @@ export default async function (builder: MigrationBuilder, args: MigrationArgs) {
|
|
|
29
30
|
CONSTRAINT event_data_type_check CHECK (VALUE = ANY (ARRAY ['create', 'update', 'delete']));
|
|
30
31
|
`)
|
|
31
32
|
builder.sql(`
|
|
32
|
-
CREATE TABLE
|
|
33
|
+
CREATE TABLE event_data (
|
|
33
34
|
id UUID NOT NULL CONSTRAINT event_data_pkey PRIMARY KEY,
|
|
34
|
-
type
|
|
35
|
+
type event_data_type NOT NULL,
|
|
35
36
|
table_name TEXT NOT NULL,
|
|
36
37
|
row_ids JSONB NOT NULL,
|
|
37
38
|
values JSONB DEFAULT NULL,
|
|
38
39
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CLOCK_TIMESTAMP() NOT NULL,
|
|
39
|
-
schema_id INTEGER NOT NULL REFERENCES
|
|
40
|
+
schema_id INTEGER NOT NULL REFERENCES schema_migration(id),
|
|
40
41
|
identity_id UUID NOT NULL,
|
|
41
42
|
transaction_id UUID DEFAULT COALESCE(
|
|
42
43
|
(NULLIF(CURRENT_SETTING('system.transaction_id'::TEXT, TRUE), ''::TEXT))::UUID,
|
|
43
|
-
(SET_CONFIG('system.transaction_id'::TEXT, (
|
|
44
|
+
(SET_CONFIG('system.transaction_id'::TEXT, (uuid_generate_v4())::TEXT, TRUE))::UUID) NOT NULL
|
|
44
45
|
)
|
|
45
46
|
`)
|
|
46
47
|
builder.sql(`
|
|
47
48
|
CREATE INDEX system_event_row_id
|
|
48
|
-
ON
|
|
49
|
+
ON event_data(row_ids)
|
|
49
50
|
`)
|
|
50
51
|
builder.sql(`
|
|
51
52
|
CREATE INDEX system_event2_table_name
|
|
52
|
-
ON
|
|
53
|
+
ON event_data(table_name)
|
|
53
54
|
`)
|
|
54
55
|
builder.sql(`
|
|
55
56
|
CREATE INDEX system_event2_type
|
|
56
|
-
ON
|
|
57
|
+
ON event_data(type)
|
|
57
58
|
`)
|
|
58
59
|
builder.sql(`
|
|
59
60
|
CREATE INDEX system_event2_transaction
|
|
60
|
-
ON
|
|
61
|
+
ON event_data(transaction_id)
|
|
61
62
|
`)
|
|
62
63
|
builder.sql(`
|
|
63
|
-
CREATE TABLE
|
|
64
|
+
CREATE TABLE stage_transaction (
|
|
64
65
|
transaction_id UUID NOT NULL,
|
|
65
|
-
stage_id UUID NOT NULL REFERENCES
|
|
66
|
+
stage_id UUID NOT NULL REFERENCES stage(id) ON DELETE CASCADE,
|
|
66
67
|
applied_at TIMESTAMPTZ NOT NULL,
|
|
67
68
|
PRIMARY KEY (transaction_id, stage_id)
|
|
68
69
|
)
|
|
@@ -72,23 +73,23 @@ export default async function (builder: MigrationBuilder, args: MigrationArgs) {
|
|
|
72
73
|
events AS (
|
|
73
74
|
SELECT
|
|
74
75
|
e.*,
|
|
75
|
-
(SELECT MAX(id) FROM
|
|
76
|
+
(SELECT MAX(id) FROM schema_migration) AS schema_id,
|
|
76
77
|
1 AS index,
|
|
77
78
|
stage.id AS stage_id
|
|
78
|
-
FROM
|
|
79
|
-
JOIN
|
|
79
|
+
FROM stage
|
|
80
|
+
JOIN event e ON stage.event_id = e.id
|
|
80
81
|
UNION ALL
|
|
81
82
|
SELECT
|
|
82
83
|
event.*,
|
|
83
84
|
COALESCE(
|
|
84
85
|
CASE WHEN event.type = 'run_migration' THEN
|
|
85
|
-
(SELECT id FROM
|
|
86
|
+
(SELECT id FROM schema_migration WHERE version = event.data ->> 'version')
|
|
86
87
|
END,
|
|
87
88
|
events.schema_id
|
|
88
89
|
),
|
|
89
90
|
index + 1,
|
|
90
91
|
stage_id
|
|
91
|
-
FROM
|
|
92
|
+
FROM event
|
|
92
93
|
JOIN events
|
|
93
94
|
ON events.previous_id = event.id
|
|
94
95
|
),
|
|
@@ -102,7 +103,7 @@ export default async function (builder: MigrationBuilder, args: MigrationArgs) {
|
|
|
102
103
|
FROM events
|
|
103
104
|
)
|
|
104
105
|
INSERT
|
|
105
|
-
INTO
|
|
106
|
+
INTO event_data (id, type, table_name, row_ids, values, created_at, schema_id, identity_id, transaction_id)
|
|
106
107
|
SELECT
|
|
107
108
|
id,
|
|
108
109
|
type,
|
|
@@ -124,14 +125,14 @@ export default async function (builder: MigrationBuilder, args: MigrationArgs) {
|
|
|
124
125
|
e.*,
|
|
125
126
|
1 AS index,
|
|
126
127
|
stage.id AS stage_id
|
|
127
|
-
FROM
|
|
128
|
-
JOIN
|
|
128
|
+
FROM stage
|
|
129
|
+
JOIN event e ON stage.event_id = e.id
|
|
129
130
|
UNION ALL
|
|
130
131
|
SELECT
|
|
131
132
|
event.*,
|
|
132
133
|
index + 1,
|
|
133
134
|
stage_id
|
|
134
|
-
FROM
|
|
135
|
+
FROM event
|
|
135
136
|
JOIN events ON events.previous_id = event.id
|
|
136
137
|
),
|
|
137
138
|
transaction_times AS (
|
|
@@ -145,12 +146,12 @@ export default async function (builder: MigrationBuilder, args: MigrationArgs) {
|
|
|
145
146
|
ORDER BY transaction_id
|
|
146
147
|
)
|
|
147
148
|
INSERT
|
|
148
|
-
INTO
|
|
149
|
+
INTO stage_transaction (transaction_id, stage_id, applied_at)
|
|
149
150
|
SELECT transaction_id, stage_id, created_at
|
|
150
151
|
FROM transaction_times
|
|
151
152
|
`)
|
|
152
153
|
builder.sql(`
|
|
153
|
-
CREATE OR REPLACE FUNCTION "
|
|
154
|
+
CREATE OR REPLACE FUNCTION "trigger_event"() RETURNS TRIGGER AS
|
|
154
155
|
$$
|
|
155
156
|
DECLARE new_event_type TEXT;
|
|
156
157
|
DECLARE table_name TEXT;
|
|
@@ -201,14 +202,14 @@ export default async function (builder: MigrationBuilder, args: MigrationArgs) {
|
|
|
201
202
|
END CASE;
|
|
202
203
|
|
|
203
204
|
CASE WHEN NULLIF(CURRENT_SETTING('system.schema_id', true), '') IS NULL THEN
|
|
204
|
-
PERFORM SET_CONFIG('system.schema_id', (select MAX("id")::TEXT from
|
|
205
|
+
PERFORM SET_CONFIG('system.schema_id', (select MAX("id")::TEXT from schema_migration), TRUE);
|
|
205
206
|
ELSE
|
|
206
207
|
-- do nothing
|
|
207
208
|
END CASE;
|
|
208
209
|
|
|
209
|
-
INSERT INTO "
|
|
210
|
+
INSERT INTO "event_data" ("id", "type", "table_name", "row_ids", "values", "created_at", schema_id, identity_id)
|
|
210
211
|
VALUES (
|
|
211
|
-
|
|
212
|
+
uuid_generate_v4(),
|
|
212
213
|
new_event_type,
|
|
213
214
|
table_name,
|
|
214
215
|
primary_values,
|
|
@@ -233,12 +234,12 @@ export default async function (builder: MigrationBuilder, args: MigrationArgs) {
|
|
|
233
234
|
NULLIF(CURRENT_SETTING('system.transaction_id', true), '') IS NOT NULL
|
|
234
235
|
AND NULLIF(CURRENT_SETTING('system.transaction_inserted', true), '') IS NULL
|
|
235
236
|
THEN
|
|
236
|
-
INSERT INTO
|
|
237
|
+
INSERT INTO stage_transaction(transaction_id, stage_id, applied_at)
|
|
237
238
|
VALUES (
|
|
238
239
|
CURRENT_SETTING('system.transaction_id')::UUID,
|
|
239
240
|
(
|
|
240
241
|
SELECT id
|
|
241
|
-
FROM "
|
|
242
|
+
FROM "stage"
|
|
242
243
|
WHERE "slug" = RIGHT(TG_TABLE_SCHEMA, - LENGTH('stage_'))
|
|
243
244
|
),
|
|
244
245
|
CLOCK_TIMESTAMP()
|
|
@@ -268,11 +269,11 @@ export default async function (builder: MigrationBuilder, args: MigrationArgs) {
|
|
|
268
269
|
}
|
|
269
270
|
}
|
|
270
271
|
builder.sql(`
|
|
271
|
-
ALTER TABLE
|
|
272
|
+
ALTER TABLE stage
|
|
272
273
|
ALTER event_id DROP NOT NULL
|
|
273
274
|
`)
|
|
274
275
|
builder.sql(`
|
|
275
|
-
ALTER TABLE
|
|
276
|
+
ALTER TABLE event
|
|
276
277
|
RENAME TO event_bak
|
|
277
278
|
`)
|
|
278
279
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { MigrationBuilder, Name } from '@contember/database-migrations'
|
|
2
|
-
import {
|
|
2
|
+
import { SystemMigrationArgs } from './types'
|
|
3
|
+
import { getJunctionTables } from '../model'
|
|
3
4
|
|
|
4
5
|
const recreateTrigger = (builder: MigrationBuilder, tableName: Name) => {
|
|
5
6
|
builder.dropTrigger(tableName, 'log_event_trx', { ifExists: true })
|
|
@@ -18,10 +19,10 @@ const recreateTrigger = (builder: MigrationBuilder, tableName: Name) => {
|
|
|
18
19
|
})
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
export default async function (builder: MigrationBuilder, args:
|
|
22
|
+
export default async function (builder: MigrationBuilder, args: SystemMigrationArgs) {
|
|
22
23
|
const schema = await args.schemaResolver()
|
|
23
24
|
const junctionTables = getJunctionTables(schema.model)
|
|
24
|
-
const schemas = args.project.stages.map(
|
|
25
|
+
const schemas = args.project.stages.map(it => `stage_${it.slug}`)
|
|
25
26
|
|
|
26
27
|
for (const table of junctionTables) {
|
|
27
28
|
for (const schema of schemas) {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
ALTER TABLE stage
|
|
2
|
+
ADD COLUMN schema TEXT UNIQUE;
|
|
3
|
+
UPDATE stage
|
|
4
|
+
SET schema = 'stage_' || slug;
|
|
5
|
+
ALTER TABLE stage
|
|
6
|
+
ALTER schema SET NOT NULL;
|
|
7
|
+
|
|
8
|
+
CREATE OR REPLACE FUNCTION trigger_event_commit() RETURNS TRIGGER AS
|
|
9
|
+
$$
|
|
10
|
+
BEGIN
|
|
11
|
+
PERFORM PG_ADVISORY_XACT_LOCK(5218230332970456493); -- well-known random number
|
|
12
|
+
|
|
13
|
+
CASE WHEN
|
|
14
|
+
NULLIF(CURRENT_SETTING('system.transaction_id', TRUE), '') IS NOT NULL
|
|
15
|
+
AND NULLIF(CURRENT_SETTING('system.transaction_inserted', TRUE), '') IS NULL
|
|
16
|
+
THEN
|
|
17
|
+
INSERT INTO stage_transaction(transaction_id, stage_id, applied_at)
|
|
18
|
+
VALUES (CURRENT_SETTING('system.transaction_id')::UUID,
|
|
19
|
+
(
|
|
20
|
+
SELECT id
|
|
21
|
+
FROM stage
|
|
22
|
+
WHERE schema = TG_TABLE_SCHEMA
|
|
23
|
+
),
|
|
24
|
+
CLOCK_TIMESTAMP())
|
|
25
|
+
ON CONFLICT DO NOTHING;
|
|
26
|
+
|
|
27
|
+
PERFORM SET_CONFIG('system.transaction_inserted', '1', TRUE);
|
|
28
|
+
ELSE
|
|
29
|
+
-- do nothing
|
|
30
|
+
END CASE;
|
|
31
|
+
|
|
32
|
+
RETURN NULL;
|
|
33
|
+
END
|
|
34
|
+
$$ LANGUAGE plpgsql;
|
|
35
|
+
|
|
36
|
+
DO LANGUAGE plpgsql
|
|
37
|
+
$$
|
|
38
|
+
BEGIN
|
|
39
|
+
EXECUTE FORMAT('ALTER FUNCTION trigger_event_commit() SET SEARCH_PATH = %s', QUOTE_IDENT(CURRENT_SCHEMA()));
|
|
40
|
+
END
|
|
41
|
+
$$
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { loadMigrations, Migration } from '@contember/database-migrations'
|
|
2
2
|
import projectMigrations from './2020-03-27-130000-project-migrations'
|
|
3
3
|
import composedPrimary from './2020-05-06-150000-composed-primary'
|
|
4
4
|
import eventTriggerPerf from './2020-06-01-103000-event-trigger-perf'
|
|
5
5
|
import eventLogRework from './2021-05-07-155800-event-log-rework'
|
|
6
6
|
import eventLogFixConstraint from './2021-05-19-1232000-event-log-fix-constraint'
|
|
7
7
|
|
|
8
|
-
export
|
|
8
|
+
export const getSystemMigrations = (): Promise<Migration[]> => {
|
|
9
9
|
return loadMigrations(process.env.CONTEMBER_SYSTEM_MIGRATIONS_DIR || __dirname, [
|
|
10
10
|
new Migration('2020-03-27-130000-project-migrations', projectMigrations),
|
|
11
11
|
new Migration('2020-05-06-150000-composed-primary', composedPrimary),
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ProjectConfig, StageConfig } from '../types'
|
|
1
|
+
import { ProjectConfig } from '../types'
|
|
3
2
|
import { ProjectMigrator, SchemaVersionBuilder } from './migrations'
|
|
4
3
|
import { StageCreator } from './stages'
|
|
5
4
|
import { DatabaseContext, DatabaseContextFactory } from './database'
|
|
6
5
|
import { SystemDbMigrationsRunnerFactory } from '../SystemContainer'
|
|
7
6
|
import {
|
|
8
7
|
Connection,
|
|
8
|
+
createDatabaseIfNotExists,
|
|
9
9
|
DatabaseCredentials,
|
|
10
|
-
EventManager,
|
|
11
10
|
retryTransaction,
|
|
12
11
|
SingleConnection,
|
|
13
12
|
} from '@contember/database'
|
|
14
|
-
import { createDatabaseIfNotExists, createPgClient } from '@contember/database-migrations'
|
|
15
13
|
import { Logger } from '@contember/engine-common'
|
|
16
14
|
import { Migration } from '@contember/schema-migrations'
|
|
15
|
+
import { StagesQuery } from './queries'
|
|
17
16
|
|
|
18
17
|
export class ProjectInitializer {
|
|
19
18
|
constructor(
|
|
@@ -29,28 +28,26 @@ export class ProjectInitializer {
|
|
|
29
28
|
logger: Logger,
|
|
30
29
|
migrations?: Migration[],
|
|
31
30
|
) {
|
|
32
|
-
const dbContext = databaseContextFactory.create(
|
|
31
|
+
const dbContext = databaseContextFactory.create()
|
|
33
32
|
if (project.db) {
|
|
34
33
|
// todo: use dbContext
|
|
35
34
|
logger.group(`Executing system schema migration`)
|
|
36
35
|
await createDatabaseIfNotExists(project.db, logger.write.bind(logger))
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
const singleConnection = new SingleConnection(pgClient, {}, new EventManager(), true)
|
|
36
|
+
const singleConnection = new SingleConnection(project.db, {})
|
|
37
|
+
const systemSchema = dbContext.client.schema
|
|
40
38
|
const dbContextMigrations = databaseContextFactory
|
|
41
|
-
.withClient(singleConnection.createClient(
|
|
42
|
-
.create(
|
|
39
|
+
.withClient(singleConnection.createClient(systemSchema, { module: 'system' }))
|
|
40
|
+
.create()
|
|
43
41
|
|
|
44
42
|
const schemaResolver = () => this.schemaVersionBuilder.buildSchema(dbContextMigrations)
|
|
45
|
-
await this.systemDbMigrationsRunnerFactory(
|
|
43
|
+
await this.systemDbMigrationsRunnerFactory(singleConnection, systemSchema).migrate(
|
|
46
44
|
logger.write.bind(logger),
|
|
47
45
|
{
|
|
48
46
|
schemaResolver,
|
|
49
47
|
project,
|
|
50
|
-
queryHandler: dbContextMigrations.queryHandler,
|
|
51
48
|
},
|
|
52
49
|
)
|
|
53
|
-
await
|
|
50
|
+
await singleConnection.end()
|
|
54
51
|
logger.groupEnd()
|
|
55
52
|
}
|
|
56
53
|
return await retryTransaction(() =>
|
|
@@ -68,6 +65,7 @@ export class ProjectInitializer {
|
|
|
68
65
|
) {
|
|
69
66
|
|
|
70
67
|
logger.group(`Creating stages`)
|
|
68
|
+
|
|
71
69
|
for (const stage of project.stages) {
|
|
72
70
|
const created = await this.stageCreator.createStage(db, stage)
|
|
73
71
|
if (created) {
|
|
@@ -80,7 +78,8 @@ export class ProjectInitializer {
|
|
|
80
78
|
logger.groupEnd()
|
|
81
79
|
if (migrations) {
|
|
82
80
|
logger.group(`Executing project migrations`)
|
|
83
|
-
|
|
81
|
+
const stages = await db.queryHandler.fetch(new StagesQuery())
|
|
82
|
+
await this.projectMigrator.migrate(db, stages, migrations, logger.write.bind(logger))
|
|
84
83
|
logger.groupEnd()
|
|
85
84
|
}
|
|
86
85
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { DatabaseContext } from './database'
|
|
2
2
|
import { ProjectConfig } from '../types'
|
|
3
3
|
import { TruncateEventsCommand } from './commands'
|
|
4
|
-
import {
|
|
4
|
+
import { getJunctionTables } from './helpers'
|
|
5
5
|
import { Schema } from '@contember/schema'
|
|
6
6
|
import { wrapIdentifier } from '@contember/database'
|
|
7
|
+
import { StagesQuery } from './queries'
|
|
7
8
|
|
|
8
9
|
export class ProjectTruncateExecutor {
|
|
9
10
|
public async truncateProject(db: DatabaseContext, project: ProjectConfig, schema: Schema) {
|
|
@@ -12,9 +13,9 @@ export class ProjectTruncateExecutor {
|
|
|
12
13
|
const tableNames = Object.values(schema.model.entities).filter(it => !it.view).map(it => it.tableName)
|
|
13
14
|
const junctionTableNames = getJunctionTables(schema.model).map(it => it.tableName)
|
|
14
15
|
const allTableNames = [...tableNames, ...junctionTableNames]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const wrappedNames = allTableNames.map(it => `${wrapIdentifier(
|
|
16
|
+
const stages = await db.queryHandler.fetch(new StagesQuery())
|
|
17
|
+
for (const stage of stages) {
|
|
18
|
+
const wrappedNames = allTableNames.map(it => `${wrapIdentifier(stage.schema)}.${wrapIdentifier(it)}`)
|
|
18
19
|
await trx.client.query(`TRUNCATE ${wrappedNames}`)
|
|
19
20
|
}
|
|
20
21
|
await trx.client.query('SET CONSTRAINTS ALL IMMEDIATE')
|
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { formatSchemaName } from '../../helpers'
|
|
1
|
+
import { InsertBuilder, wrapIdentifier } from '@contember/database'
|
|
3
2
|
import { StageConfig } from '../../../types'
|
|
4
3
|
import { Command } from '../Command'
|
|
4
|
+
import { formatSchemaName } from '../../helpers'
|
|
5
5
|
|
|
6
|
-
export class
|
|
6
|
+
export class CreateStageCommand implements Command<void> {
|
|
7
7
|
constructor(private readonly stage: StageConfig) {}
|
|
8
8
|
|
|
9
|
-
public async execute({ db, providers }: Command.Args): Promise<
|
|
10
|
-
const
|
|
9
|
+
public async execute({ db, providers }: Command.Args): Promise<void> {
|
|
10
|
+
const schemaName = this.stage.schema ?? formatSchemaName(this.stage)
|
|
11
|
+
await InsertBuilder.create()
|
|
11
12
|
.into('stage')
|
|
12
13
|
.values({
|
|
13
14
|
id: providers.uuid(),
|
|
14
15
|
name: this.stage.name,
|
|
15
16
|
slug: this.stage.slug,
|
|
16
|
-
|
|
17
|
-
.onConflict(ConflictActionType.update, ['slug'], {
|
|
18
|
-
name: this.stage.name,
|
|
17
|
+
schema: schemaName,
|
|
19
18
|
})
|
|
20
19
|
.execute(db)
|
|
21
20
|
|
|
22
|
-
await db.query('CREATE SCHEMA IF NOT EXISTS ' + wrapIdentifier(
|
|
23
|
-
|
|
24
|
-
return result > 0
|
|
21
|
+
await db.query('CREATE SCHEMA IF NOT EXISTS ' + wrapIdentifier(schemaName))
|
|
25
22
|
}
|
|
26
23
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './CreateStageCommand'
|
|
2
2
|
export * from './TruncateStagesCommand'
|
|
@@ -2,7 +2,6 @@ import { Client, Connection, DatabaseQueryable } from '@contember/database'
|
|
|
2
2
|
import { QueryHandler } from '@contember/queryable'
|
|
3
3
|
import { UuidProvider } from '../../utils'
|
|
4
4
|
import { CommandBus } from '../commands'
|
|
5
|
-
import { setupSystemVariables } from '../helpers'
|
|
6
5
|
|
|
7
6
|
export interface DatabaseContext<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {
|
|
8
7
|
client: Client<ConnectionType>
|
|
@@ -14,8 +13,8 @@ export interface DatabaseContext<ConnectionType extends Connection.ConnectionLik
|
|
|
14
13
|
export class DatabaseContextFactory {
|
|
15
14
|
constructor(private readonly client: Client, private readonly providers: UuidProvider) {}
|
|
16
15
|
|
|
17
|
-
public create(
|
|
18
|
-
return createDatabaseContext(this.client,
|
|
16
|
+
public create(): DatabaseContext {
|
|
17
|
+
return createDatabaseContext(this.client, this.providers)
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
public withClient(client: Client) {
|
|
@@ -25,7 +24,6 @@ export class DatabaseContextFactory {
|
|
|
25
24
|
|
|
26
25
|
const createDatabaseContext = <ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike>(
|
|
27
26
|
client: Client<ConnectionType>,
|
|
28
|
-
identityId: string | undefined,
|
|
29
27
|
providers: UuidProvider,
|
|
30
28
|
): DatabaseContext<ConnectionType> => ({
|
|
31
29
|
client,
|
|
@@ -33,10 +31,7 @@ const createDatabaseContext = <ConnectionType extends Connection.ConnectionLike
|
|
|
33
31
|
transaction: cb =>
|
|
34
32
|
client.transaction(async client => {
|
|
35
33
|
await client.query(Connection.REPEATABLE_READ)
|
|
36
|
-
|
|
37
|
-
await setupSystemVariables(client, identityId, providers)
|
|
38
|
-
}
|
|
39
|
-
return cb(createDatabaseContext(client, undefined, providers))
|
|
34
|
+
return cb(createDatabaseContext(client, providers))
|
|
40
35
|
}),
|
|
41
36
|
commandBus: new CommandBus(client, providers),
|
|
42
37
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Client } from '@contember/database'
|
|
2
2
|
|
|
3
3
|
export interface IdentityFetcher {
|
|
4
|
-
fetchIdentities(
|
|
4
|
+
fetchIdentities(ids: string[]): Promise<TenantIdentity[]>
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
export type TenantIdentity = PersonIdentity | ApiKeyIdentity
|
package/src/model/dtos/Stage.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
export interface Stage {
|
|
2
|
+
readonly id: string
|
|
2
3
|
readonly name: string
|
|
3
4
|
readonly slug: string
|
|
5
|
+
readonly schema: string
|
|
4
6
|
}
|
|
5
7
|
|
|
6
|
-
export interface StageWithId extends Stage {
|
|
7
|
-
readonly id: string
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export type StageWithoutEvent = Pick<Stage, Exclude<keyof Stage, 'event_id'>>
|
|
@@ -4,19 +4,18 @@ import { assertNever } from '../../utils'
|
|
|
4
4
|
import { IdentityFetcher } from '../dependencies'
|
|
5
5
|
import { formatIdentity } from './identityUtils'
|
|
6
6
|
import { appendCreateSpecificData, appendDeleteSpecificData, appendUpdateSpecificData } from './EventResponseHelper'
|
|
7
|
-
import { Client } from '@contember/database'
|
|
8
7
|
|
|
9
8
|
export class EventResponseBuilder {
|
|
10
9
|
constructor(private readonly identityFetcher: IdentityFetcher) {}
|
|
11
10
|
|
|
12
|
-
public async buildResponse(
|
|
11
|
+
public async buildResponse(events: AnyEvent[]): Promise<(CreateEvent | DeleteEvent | UpdateEvent)[]> {
|
|
13
12
|
const apiEventTypeMapping = {
|
|
14
13
|
[EventType.create]: ApiEventType.Create,
|
|
15
14
|
[EventType.update]: ApiEventType.Update,
|
|
16
15
|
[EventType.delete]: ApiEventType.Delete,
|
|
17
16
|
}
|
|
18
17
|
const identityIds = events.map(it => it.identityId).filter((it, index, ids) => ids.indexOf(it) === index)
|
|
19
|
-
const identities = await this.identityFetcher.fetchIdentities(
|
|
18
|
+
const identities = await this.identityFetcher.fetchIdentities(identityIds)
|
|
20
19
|
const identitiesMap = Object.fromEntries(identities.map(it => [it.identityId, it]))
|
|
21
20
|
|
|
22
21
|
return events.map(it => {
|
|
@@ -3,11 +3,10 @@ import { Client, QueryError, wrapIdentifier } from '@contember/database'
|
|
|
3
3
|
import { formatSchemaName } from '../helpers'
|
|
4
4
|
import { Schema } from '@contember/schema'
|
|
5
5
|
import { SaveMigrationCommand } from '../commands'
|
|
6
|
-
import {
|
|
6
|
+
import { Stage } from '../dtos'
|
|
7
7
|
import { DatabaseContext } from '../database'
|
|
8
8
|
import { ExecutedMigrationsResolver } from './ExecutedMigrationsResolver'
|
|
9
9
|
import { MigrateErrorCode } from '../../schema'
|
|
10
|
-
import { ProjectConfig } from '../../types'
|
|
11
10
|
import { SchemaVersionBuilder } from './SchemaVersionBuilder'
|
|
12
11
|
|
|
13
12
|
export class ProjectMigrator {
|
|
@@ -19,7 +18,7 @@ export class ProjectMigrator {
|
|
|
19
18
|
|
|
20
19
|
public async migrate(
|
|
21
20
|
db: DatabaseContext,
|
|
22
|
-
|
|
21
|
+
stages: Stage[],
|
|
23
22
|
migrationsToExecute: readonly Migration[],
|
|
24
23
|
logger: (message: string) => void,
|
|
25
24
|
ignoreOrder: boolean = false,
|
|
@@ -39,11 +38,12 @@ export class ProjectMigrator {
|
|
|
39
38
|
for (const modification of migration.modifications) {
|
|
40
39
|
[schema] = await this.applyModification(
|
|
41
40
|
db.client,
|
|
42
|
-
|
|
41
|
+
stages,
|
|
43
42
|
schema,
|
|
44
43
|
modification,
|
|
45
44
|
formatVersion,
|
|
46
45
|
migration.version,
|
|
46
|
+
db.client.schema,
|
|
47
47
|
)
|
|
48
48
|
}
|
|
49
49
|
await db.commandBus.execute(new SaveMigrationCommand(migration))
|
|
@@ -68,7 +68,7 @@ export class ProjectMigrator {
|
|
|
68
68
|
if (migration.version < version && !ignoreOrder) {
|
|
69
69
|
throw new MustFollowLatestMigrationError(migration.version, `Must follow latest executed migration ${version}`)
|
|
70
70
|
}
|
|
71
|
-
const described = await this.migrationDescriber.describeModifications(schema, migration)
|
|
71
|
+
const described = await this.migrationDescriber.describeModifications(schema, migration, 'system') // system schema name not important here
|
|
72
72
|
if (described.length === 0) {
|
|
73
73
|
continue
|
|
74
74
|
}
|
|
@@ -86,25 +86,26 @@ export class ProjectMigrator {
|
|
|
86
86
|
|
|
87
87
|
private async applyModification(
|
|
88
88
|
db: Client,
|
|
89
|
-
stages:
|
|
89
|
+
stages: Stage[],
|
|
90
90
|
schema: Schema,
|
|
91
91
|
modification: Migration.Modification,
|
|
92
92
|
formatVersion: number,
|
|
93
93
|
migrationVersion: string,
|
|
94
|
+
systemSchema: string,
|
|
94
95
|
): Promise<[Schema]> {
|
|
95
96
|
const {
|
|
96
97
|
sql,
|
|
97
98
|
schema: newSchema,
|
|
98
99
|
handler,
|
|
99
|
-
} = await this.migrationDescriber.describeModification(schema, modification, formatVersion)
|
|
100
|
+
} = await this.migrationDescriber.describeModification(schema, modification, { systemSchema, formatVersion })
|
|
100
101
|
for (const stage of stages) {
|
|
101
102
|
await this.executeOnStage(db, stage, sql, migrationVersion)
|
|
102
103
|
}
|
|
103
104
|
return [newSchema]
|
|
104
105
|
}
|
|
105
106
|
|
|
106
|
-
private async executeOnStage(db: Client, stage:
|
|
107
|
-
await db.query('SET search_path TO ' + wrapIdentifier(
|
|
107
|
+
private async executeOnStage(db: Client, stage: Stage, sql: string, migrationVersion: string) {
|
|
108
|
+
await db.query('SET search_path TO ' + wrapIdentifier(stage.schema))
|
|
108
109
|
try {
|
|
109
110
|
await db.query(sql)
|
|
110
111
|
} catch (e) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DatabaseQuery, DatabaseQueryable } from '@contember/database'
|
|
2
|
-
import { StageWithId } from '../../dtos'
|
|
3
2
|
import { prepareStageQueryBuilder } from './StageQueryFactory'
|
|
3
|
+
import { Stage } from '../../dtos'
|
|
4
4
|
|
|
5
5
|
class StageBySlugQuery extends DatabaseQuery<StageBySlugQuery.Result> {
|
|
6
6
|
constructor(private readonly slug: string) {
|
|
@@ -17,7 +17,7 @@ class StageBySlugQuery extends DatabaseQuery<StageBySlugQuery.Result> {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
namespace StageBySlugQuery {
|
|
20
|
-
export type Result = null |
|
|
20
|
+
export type Result = null | Stage
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export { StageBySlugQuery }
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { SelectBuilder } from '@contember/database'
|
|
2
|
-
import {
|
|
2
|
+
import { Stage } from '../../dtos'
|
|
3
3
|
|
|
4
4
|
export const prepareStageQueryBuilder = () => {
|
|
5
|
-
return SelectBuilder.create<
|
|
5
|
+
return SelectBuilder.create<Stage>()
|
|
6
6
|
.select('id')
|
|
7
7
|
.select('name')
|
|
8
8
|
.select('slug')
|
|
9
|
+
.select('schema')
|
|
9
10
|
.from('stage')
|
|
10
11
|
}
|