@contember/engine-system-api 2.0.0-alpha.12 → 2.0.0-alpha.13
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/development/index.cjs +2 -2
- package/dist/development/index.js +2 -2
- package/dist/development/src/SystemContainer.cjs +4 -3
- package/dist/development/src/SystemContainer.cjs.map +1 -1
- package/dist/development/src/SystemContainer.js +4 -3
- package/dist/development/src/SystemContainer.js.map +1 -1
- package/dist/development/src/migrations/2020-05-06-150000-composed-primary.cjs +1 -2
- package/dist/development/src/migrations/2020-05-06-150000-composed-primary.cjs.map +1 -1
- package/dist/development/src/migrations/2020-05-06-150000-composed-primary.js +1 -2
- package/dist/development/src/migrations/2020-05-06-150000-composed-primary.js.map +1 -1
- package/dist/development/src/migrations/2020-06-01-103000-event-trigger-perf.cjs +1 -2
- package/dist/development/src/migrations/2020-06-01-103000-event-trigger-perf.cjs.map +1 -1
- package/dist/development/src/migrations/2020-06-01-103000-event-trigger-perf.js +1 -2
- package/dist/development/src/migrations/2020-06-01-103000-event-trigger-perf.js.map +1 -1
- package/dist/development/src/migrations/2021-05-07-155800-event-log-rework.cjs +1 -2
- package/dist/development/src/migrations/2021-05-07-155800-event-log-rework.cjs.map +1 -1
- package/dist/development/src/migrations/2021-05-07-155800-event-log-rework.js +1 -2
- package/dist/development/src/migrations/2021-05-07-155800-event-log-rework.js.map +1 -1
- package/dist/development/src/migrations/2021-05-19-1232000-event-log-fix-constraint.cjs +1 -2
- package/dist/development/src/migrations/2021-05-19-1232000-event-log-fix-constraint.cjs.map +1 -1
- package/dist/development/src/migrations/2021-05-19-1232000-event-log-fix-constraint.js +1 -2
- package/dist/development/src/migrations/2021-05-19-1232000-event-log-fix-constraint.js.map +1 -1
- package/dist/development/src/migrations/2022-10-03-110000-table-on-delete.cjs +1 -1
- package/dist/development/src/migrations/2022-10-03-110000-table-on-delete.cjs.map +1 -1
- package/dist/development/src/migrations/2022-10-03-110000-table-on-delete.js +1 -1
- package/dist/development/src/migrations/2022-10-03-110000-table-on-delete.js.map +1 -1
- package/dist/development/src/migrations/2023-09-11-174000-fix-on-delete.cjs +1 -1
- package/dist/development/src/migrations/2023-09-11-174000-fix-on-delete.cjs.map +1 -1
- package/dist/development/src/migrations/2023-09-11-174000-fix-on-delete.js +1 -1
- package/dist/development/src/migrations/2023-09-11-174000-fix-on-delete.js.map +1 -1
- package/dist/development/src/migrations/2023-10-19-173000-fix-unique.cjs +1 -1
- package/dist/development/src/migrations/2023-10-19-173000-fix-unique.cjs.map +1 -1
- package/dist/development/src/migrations/2023-10-19-173000-fix-unique.js +1 -1
- package/dist/development/src/migrations/2023-10-19-173000-fix-unique.js.map +1 -1
- package/dist/development/src/migrations/2024-06-28-153000-schema.cjs +18 -0
- package/dist/development/src/migrations/2024-06-28-153000-schema.cjs.map +1 -0
- package/dist/development/src/migrations/2024-06-28-153000-schema.js +19 -0
- package/dist/development/src/migrations/2024-06-28-153000-schema.js.map +1 -0
- package/dist/development/src/migrations/2024-06-28-153001-schema-init.cjs +12 -0
- package/dist/development/src/migrations/2024-06-28-153001-schema-init.cjs.map +1 -0
- package/dist/development/src/migrations/2024-06-28-153001-schema-init.js +13 -0
- package/dist/development/src/migrations/2024-06-28-153001-schema-init.js.map +1 -0
- package/dist/development/src/migrations/2024-07-29-150000-event-data-index.cjs +11 -0
- package/dist/development/src/migrations/2024-07-29-150000-event-data-index.cjs.map +1 -0
- package/dist/development/src/migrations/2024-07-29-150000-event-data-index.js +12 -0
- package/dist/development/src/migrations/2024-07-29-150000-event-data-index.js.map +1 -0
- package/dist/development/src/migrations/runner.cjs +11 -5
- package/dist/development/src/migrations/runner.cjs.map +1 -1
- package/dist/development/src/migrations/runner.js +11 -5
- package/dist/development/src/migrations/runner.js.map +1 -1
- package/dist/development/src/migrations/snapshot.cjs +17 -1
- package/dist/development/src/migrations/snapshot.cjs.map +1 -1
- package/dist/development/src/migrations/snapshot.js +17 -1
- package/dist/development/src/migrations/snapshot.js.map +1 -1
- package/dist/development/src/model/authorization/AuthorizationActions.cjs +1 -0
- package/dist/development/src/model/authorization/AuthorizationActions.cjs.map +1 -1
- package/dist/development/src/model/authorization/AuthorizationActions.js +1 -0
- package/dist/development/src/model/authorization/AuthorizationActions.js.map +1 -1
- package/dist/development/src/model/authorization/PermissionsFactory.cjs +1 -0
- package/dist/development/src/model/authorization/PermissionsFactory.cjs.map +1 -1
- package/dist/development/src/model/authorization/PermissionsFactory.js +1 -0
- package/dist/development/src/model/authorization/PermissionsFactory.js.map +1 -1
- package/dist/development/src/model/authorization/StagePermissionsFactory.cjs +4 -5
- package/dist/development/src/model/authorization/StagePermissionsFactory.cjs.map +1 -1
- package/dist/development/src/model/authorization/StagePermissionsFactory.js +4 -5
- package/dist/development/src/model/authorization/StagePermissionsFactory.js.map +1 -1
- package/dist/development/src/model/authorization/StageScope.cjs +2 -2
- package/dist/development/src/model/authorization/StageScope.cjs.map +1 -1
- package/dist/development/src/model/authorization/StageScope.js +2 -2
- package/dist/development/src/model/authorization/StageScope.js.map +1 -1
- package/dist/development/src/model/commands/schema/SaveSchemaCommand.cjs +28 -0
- package/dist/development/src/model/commands/schema/SaveSchemaCommand.cjs.map +1 -0
- package/dist/development/src/model/commands/schema/SaveSchemaCommand.js +28 -0
- package/dist/development/src/model/commands/schema/SaveSchemaCommand.js.map +1 -0
- package/dist/development/src/model/migrations/MigrationAlterer.cjs +10 -0
- package/dist/development/src/model/migrations/MigrationAlterer.cjs.map +1 -1
- package/dist/development/src/model/migrations/MigrationAlterer.js +10 -0
- package/dist/development/src/model/migrations/MigrationAlterer.js.map +1 -1
- package/dist/development/src/model/migrations/ProjectMigrator.cjs +29 -10
- package/dist/development/src/model/migrations/ProjectMigrator.cjs.map +1 -1
- package/dist/development/src/model/migrations/ProjectMigrator.js +30 -11
- package/dist/development/src/model/migrations/ProjectMigrator.js.map +1 -1
- package/dist/development/src/model/migrations/SchemaProvider.cjs +58 -0
- package/dist/development/src/model/migrations/SchemaProvider.cjs.map +1 -0
- package/dist/development/src/model/migrations/SchemaProvider.js +58 -0
- package/dist/development/src/model/migrations/SchemaProvider.js.map +1 -0
- package/dist/development/src/model/queries/events/EventsQuery.cjs +10 -14
- package/dist/development/src/model/queries/events/EventsQuery.cjs.map +1 -1
- package/dist/development/src/model/queries/events/EventsQuery.js +10 -14
- package/dist/development/src/model/queries/events/EventsQuery.js.map +1 -1
- package/dist/development/src/model/queries/schema/SchemaQuery.cjs +34 -0
- package/dist/development/src/model/queries/schema/SchemaQuery.cjs.map +1 -0
- package/dist/development/src/model/queries/schema/SchemaQuery.js +34 -0
- package/dist/development/src/model/queries/schema/SchemaQuery.js.map +1 -0
- package/dist/development/src/resolvers/ResolverFactory.cjs +6 -2
- package/dist/development/src/resolvers/ResolverFactory.cjs.map +1 -1
- package/dist/development/src/resolvers/ResolverFactory.js +7 -3
- package/dist/development/src/resolvers/ResolverFactory.js.map +1 -1
- package/dist/development/src/resolvers/SystemResolverContext.cjs +5 -5
- package/dist/development/src/resolvers/SystemResolverContext.cjs.map +1 -1
- package/dist/development/src/resolvers/SystemResolverContext.js +5 -5
- package/dist/development/src/resolvers/SystemResolverContext.js.map +1 -1
- package/dist/development/src/resolvers/mutation/MigrateMutationResolver.cjs +0 -1
- package/dist/development/src/resolvers/mutation/MigrateMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/MigrateMutationResolver.js +0 -1
- package/dist/development/src/resolvers/mutation/MigrateMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/MigrationAlterMutationResolver.cjs +0 -1
- package/dist/development/src/resolvers/mutation/MigrationAlterMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/MigrationAlterMutationResolver.js +0 -1
- package/dist/development/src/resolvers/mutation/MigrationAlterMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/mutation/TruncateMutationResolver.cjs +1 -1
- package/dist/development/src/resolvers/mutation/TruncateMutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/mutation/TruncateMutationResolver.js +1 -1
- package/dist/development/src/resolvers/mutation/TruncateMutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/EventsQueryResolver.cjs +0 -1
- package/dist/development/src/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/EventsQueryResolver.js +0 -1
- package/dist/development/src/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/ExecutedMigrationsQueryResolver.cjs +0 -1
- package/dist/development/src/resolvers/query/ExecutedMigrationsQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/ExecutedMigrationsQueryResolver.js +0 -1
- package/dist/development/src/resolvers/query/ExecutedMigrationsQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/query/SchemaQueryResolver.cjs +23 -0
- package/dist/development/src/resolvers/query/SchemaQueryResolver.cjs.map +1 -0
- package/dist/development/src/resolvers/query/SchemaQueryResolver.js +23 -0
- package/dist/development/src/resolvers/query/SchemaQueryResolver.js.map +1 -0
- package/dist/development/src/resolvers/query/StagesQueryResolver.cjs +0 -1
- package/dist/development/src/resolvers/query/StagesQueryResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/query/StagesQueryResolver.js +0 -1
- package/dist/development/src/resolvers/query/StagesQueryResolver.js.map +1 -1
- package/dist/development/src/resolvers/types/OldValuesHelpers.cjs +0 -1
- package/dist/development/src/resolvers/types/OldValuesHelpers.cjs.map +1 -1
- package/dist/development/src/resolvers/types/OldValuesHelpers.js +0 -1
- package/dist/development/src/resolvers/types/OldValuesHelpers.js.map +1 -1
- package/dist/development/src/schema/system.graphql.cjs +3 -1
- package/dist/development/src/schema/system.graphql.cjs.map +1 -1
- package/dist/development/src/schema/system.graphql.js +3 -1
- package/dist/development/src/schema/system.graphql.js.map +1 -1
- package/dist/development/src/schema/types.cjs.map +1 -1
- package/dist/development/src/schema/types.js.map +1 -1
- package/dist/production/index.cjs +2 -2
- package/dist/production/index.js +2 -2
- package/dist/production/src/SystemContainer.cjs +4 -3
- package/dist/production/src/SystemContainer.cjs.map +1 -1
- package/dist/production/src/SystemContainer.js +4 -3
- package/dist/production/src/SystemContainer.js.map +1 -1
- package/dist/production/src/migrations/2020-05-06-150000-composed-primary.cjs +1 -2
- package/dist/production/src/migrations/2020-05-06-150000-composed-primary.cjs.map +1 -1
- package/dist/production/src/migrations/2020-05-06-150000-composed-primary.js +1 -2
- package/dist/production/src/migrations/2020-05-06-150000-composed-primary.js.map +1 -1
- package/dist/production/src/migrations/2020-06-01-103000-event-trigger-perf.cjs +1 -2
- package/dist/production/src/migrations/2020-06-01-103000-event-trigger-perf.cjs.map +1 -1
- package/dist/production/src/migrations/2020-06-01-103000-event-trigger-perf.js +1 -2
- package/dist/production/src/migrations/2020-06-01-103000-event-trigger-perf.js.map +1 -1
- package/dist/production/src/migrations/2021-05-07-155800-event-log-rework.cjs +1 -2
- package/dist/production/src/migrations/2021-05-07-155800-event-log-rework.cjs.map +1 -1
- package/dist/production/src/migrations/2021-05-07-155800-event-log-rework.js +1 -2
- package/dist/production/src/migrations/2021-05-07-155800-event-log-rework.js.map +1 -1
- package/dist/production/src/migrations/2021-05-19-1232000-event-log-fix-constraint.cjs +1 -2
- package/dist/production/src/migrations/2021-05-19-1232000-event-log-fix-constraint.cjs.map +1 -1
- package/dist/production/src/migrations/2021-05-19-1232000-event-log-fix-constraint.js +1 -2
- package/dist/production/src/migrations/2021-05-19-1232000-event-log-fix-constraint.js.map +1 -1
- package/dist/production/src/migrations/2022-10-03-110000-table-on-delete.cjs +1 -1
- package/dist/production/src/migrations/2022-10-03-110000-table-on-delete.cjs.map +1 -1
- package/dist/production/src/migrations/2022-10-03-110000-table-on-delete.js +1 -1
- package/dist/production/src/migrations/2022-10-03-110000-table-on-delete.js.map +1 -1
- package/dist/production/src/migrations/2023-09-11-174000-fix-on-delete.cjs +1 -1
- package/dist/production/src/migrations/2023-09-11-174000-fix-on-delete.cjs.map +1 -1
- package/dist/production/src/migrations/2023-09-11-174000-fix-on-delete.js +1 -1
- package/dist/production/src/migrations/2023-09-11-174000-fix-on-delete.js.map +1 -1
- package/dist/production/src/migrations/2023-10-19-173000-fix-unique.cjs +1 -1
- package/dist/production/src/migrations/2023-10-19-173000-fix-unique.cjs.map +1 -1
- package/dist/production/src/migrations/2023-10-19-173000-fix-unique.js +1 -1
- package/dist/production/src/migrations/2023-10-19-173000-fix-unique.js.map +1 -1
- package/dist/production/src/migrations/2024-06-28-153000-schema.cjs +18 -0
- package/dist/production/src/migrations/2024-06-28-153000-schema.cjs.map +1 -0
- package/dist/production/src/migrations/2024-06-28-153000-schema.js +19 -0
- package/dist/production/src/migrations/2024-06-28-153000-schema.js.map +1 -0
- package/dist/production/src/migrations/2024-06-28-153001-schema-init.cjs +12 -0
- package/dist/production/src/migrations/2024-06-28-153001-schema-init.cjs.map +1 -0
- package/dist/production/src/migrations/2024-06-28-153001-schema-init.js +13 -0
- package/dist/production/src/migrations/2024-06-28-153001-schema-init.js.map +1 -0
- package/dist/production/src/migrations/2024-07-29-150000-event-data-index.cjs +11 -0
- package/dist/production/src/migrations/2024-07-29-150000-event-data-index.cjs.map +1 -0
- package/dist/production/src/migrations/2024-07-29-150000-event-data-index.js +12 -0
- package/dist/production/src/migrations/2024-07-29-150000-event-data-index.js.map +1 -0
- package/dist/production/src/migrations/runner.cjs +11 -5
- package/dist/production/src/migrations/runner.cjs.map +1 -1
- package/dist/production/src/migrations/runner.js +11 -5
- package/dist/production/src/migrations/runner.js.map +1 -1
- package/dist/production/src/migrations/snapshot.cjs +17 -1
- package/dist/production/src/migrations/snapshot.cjs.map +1 -1
- package/dist/production/src/migrations/snapshot.js +17 -1
- package/dist/production/src/migrations/snapshot.js.map +1 -1
- package/dist/production/src/model/authorization/AuthorizationActions.cjs +1 -0
- package/dist/production/src/model/authorization/AuthorizationActions.cjs.map +1 -1
- package/dist/production/src/model/authorization/AuthorizationActions.js +1 -0
- package/dist/production/src/model/authorization/AuthorizationActions.js.map +1 -1
- package/dist/production/src/model/authorization/PermissionsFactory.cjs +1 -0
- package/dist/production/src/model/authorization/PermissionsFactory.cjs.map +1 -1
- package/dist/production/src/model/authorization/PermissionsFactory.js +1 -0
- package/dist/production/src/model/authorization/PermissionsFactory.js.map +1 -1
- package/dist/production/src/model/authorization/StagePermissionsFactory.cjs +4 -5
- package/dist/production/src/model/authorization/StagePermissionsFactory.cjs.map +1 -1
- package/dist/production/src/model/authorization/StagePermissionsFactory.js +4 -5
- package/dist/production/src/model/authorization/StagePermissionsFactory.js.map +1 -1
- package/dist/production/src/model/authorization/StageScope.cjs +2 -2
- package/dist/production/src/model/authorization/StageScope.cjs.map +1 -1
- package/dist/production/src/model/authorization/StageScope.js +2 -2
- package/dist/production/src/model/authorization/StageScope.js.map +1 -1
- package/dist/production/src/model/commands/schema/SaveSchemaCommand.cjs +28 -0
- package/dist/production/src/model/commands/schema/SaveSchemaCommand.cjs.map +1 -0
- package/dist/production/src/model/commands/schema/SaveSchemaCommand.js +28 -0
- package/dist/production/src/model/commands/schema/SaveSchemaCommand.js.map +1 -0
- package/dist/production/src/model/migrations/MigrationAlterer.cjs +10 -0
- package/dist/production/src/model/migrations/MigrationAlterer.cjs.map +1 -1
- package/dist/production/src/model/migrations/MigrationAlterer.js +10 -0
- package/dist/production/src/model/migrations/MigrationAlterer.js.map +1 -1
- package/dist/production/src/model/migrations/ProjectMigrator.cjs +29 -10
- package/dist/production/src/model/migrations/ProjectMigrator.cjs.map +1 -1
- package/dist/production/src/model/migrations/ProjectMigrator.js +30 -11
- package/dist/production/src/model/migrations/ProjectMigrator.js.map +1 -1
- package/dist/production/src/model/migrations/SchemaProvider.cjs +58 -0
- package/dist/production/src/model/migrations/SchemaProvider.cjs.map +1 -0
- package/dist/production/src/model/migrations/SchemaProvider.js +58 -0
- package/dist/production/src/model/migrations/SchemaProvider.js.map +1 -0
- package/dist/production/src/model/queries/events/EventsQuery.cjs +10 -14
- package/dist/production/src/model/queries/events/EventsQuery.cjs.map +1 -1
- package/dist/production/src/model/queries/events/EventsQuery.js +10 -14
- package/dist/production/src/model/queries/events/EventsQuery.js.map +1 -1
- package/dist/production/src/model/queries/schema/SchemaQuery.cjs +34 -0
- package/dist/production/src/model/queries/schema/SchemaQuery.cjs.map +1 -0
- package/dist/production/src/model/queries/schema/SchemaQuery.js +34 -0
- package/dist/production/src/model/queries/schema/SchemaQuery.js.map +1 -0
- package/dist/production/src/resolvers/ResolverFactory.cjs +6 -2
- package/dist/production/src/resolvers/ResolverFactory.cjs.map +1 -1
- package/dist/production/src/resolvers/ResolverFactory.js +7 -3
- package/dist/production/src/resolvers/ResolverFactory.js.map +1 -1
- package/dist/production/src/resolvers/SystemResolverContext.cjs +5 -5
- package/dist/production/src/resolvers/SystemResolverContext.cjs.map +1 -1
- package/dist/production/src/resolvers/SystemResolverContext.js +5 -5
- package/dist/production/src/resolvers/SystemResolverContext.js.map +1 -1
- package/dist/production/src/resolvers/mutation/MigrateMutationResolver.cjs +0 -1
- package/dist/production/src/resolvers/mutation/MigrateMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/MigrateMutationResolver.js +0 -1
- package/dist/production/src/resolvers/mutation/MigrateMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/MigrationAlterMutationResolver.cjs +0 -1
- package/dist/production/src/resolvers/mutation/MigrationAlterMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/MigrationAlterMutationResolver.js +0 -1
- package/dist/production/src/resolvers/mutation/MigrationAlterMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/mutation/TruncateMutationResolver.cjs +1 -1
- package/dist/production/src/resolvers/mutation/TruncateMutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/mutation/TruncateMutationResolver.js +1 -1
- package/dist/production/src/resolvers/mutation/TruncateMutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/EventsQueryResolver.cjs +0 -1
- package/dist/production/src/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/EventsQueryResolver.js +0 -1
- package/dist/production/src/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/ExecutedMigrationsQueryResolver.cjs +0 -1
- package/dist/production/src/resolvers/query/ExecutedMigrationsQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/ExecutedMigrationsQueryResolver.js +0 -1
- package/dist/production/src/resolvers/query/ExecutedMigrationsQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/query/SchemaQueryResolver.cjs +23 -0
- package/dist/production/src/resolvers/query/SchemaQueryResolver.cjs.map +1 -0
- package/dist/production/src/resolvers/query/SchemaQueryResolver.js +23 -0
- package/dist/production/src/resolvers/query/SchemaQueryResolver.js.map +1 -0
- package/dist/production/src/resolvers/query/StagesQueryResolver.cjs +0 -1
- package/dist/production/src/resolvers/query/StagesQueryResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/query/StagesQueryResolver.js +0 -1
- package/dist/production/src/resolvers/query/StagesQueryResolver.js.map +1 -1
- package/dist/production/src/resolvers/types/OldValuesHelpers.cjs +0 -1
- package/dist/production/src/resolvers/types/OldValuesHelpers.cjs.map +1 -1
- package/dist/production/src/resolvers/types/OldValuesHelpers.js +0 -1
- package/dist/production/src/resolvers/types/OldValuesHelpers.js.map +1 -1
- package/dist/production/src/schema/system.graphql.cjs +3 -1
- package/dist/production/src/schema/system.graphql.cjs.map +1 -1
- package/dist/production/src/schema/system.graphql.js +3 -1
- package/dist/production/src/schema/system.graphql.js.map +1 -1
- package/dist/production/src/schema/types.cjs.map +1 -1
- package/dist/production/src/schema/types.js.map +1 -1
- package/dist/tests/cases/unit/eventsQuery.test.d.ts +2 -0
- package/dist/tests/cases/unit/eventsQuery.test.d.ts.map +1 -0
- package/dist/tests/src/uuid.d.ts +3 -0
- package/dist/tests/src/uuid.d.ts.map +1 -0
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/SystemContainer.d.ts +7 -3
- package/dist/types/SystemContainer.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/migrations/2024-06-28-153000-schema.d.ts +3 -0
- package/dist/types/migrations/2024-06-28-153000-schema.d.ts.map +1 -0
- package/dist/types/migrations/2024-06-28-153001-schema-init.d.ts +4 -0
- package/dist/types/migrations/2024-06-28-153001-schema-init.d.ts.map +1 -0
- package/dist/types/migrations/2024-07-29-150000-event-data-index.d.ts +3 -0
- package/dist/types/migrations/2024-07-29-150000-event-data-index.d.ts.map +1 -0
- package/dist/types/migrations/runner.d.ts +3 -3
- package/dist/types/migrations/runner.d.ts.map +1 -1
- package/dist/types/migrations/snapshot.d.ts.map +1 -1
- package/dist/types/migrations/types.d.ts +2 -2
- package/dist/types/migrations/types.d.ts.map +1 -1
- package/dist/types/model/SchemaGetter.d.ts +6 -0
- package/dist/types/model/SchemaGetter.d.ts.map +1 -0
- package/dist/types/model/authorization/AuthorizationActions.d.ts +5 -0
- package/dist/types/model/authorization/AuthorizationActions.d.ts.map +1 -1
- package/dist/types/model/authorization/PermissionsFactory.d.ts.map +1 -1
- package/dist/types/model/authorization/StagePermissionsFactory.d.ts +4 -4
- package/dist/types/model/authorization/StagePermissionsFactory.d.ts.map +1 -1
- package/dist/types/model/authorization/StageScope.d.ts.map +1 -1
- package/dist/types/model/commands/schema/SaveSchemaCommand.d.ts +8 -0
- package/dist/types/model/commands/schema/SaveSchemaCommand.d.ts.map +1 -0
- package/dist/types/model/dependencies/content/ContentQueryExecutor.d.ts +3 -2
- package/dist/types/model/dependencies/content/ContentQueryExecutor.d.ts.map +1 -1
- package/dist/types/model/migrations/MigrationAlterer.d.ts +4 -0
- package/dist/types/model/migrations/MigrationAlterer.d.ts.map +1 -1
- package/dist/types/model/migrations/ProjectMigrator.d.ts +3 -3
- package/dist/types/model/migrations/ProjectMigrator.d.ts.map +1 -1
- package/dist/types/model/migrations/SchemaProvider.d.ts +28 -0
- package/dist/types/model/migrations/SchemaProvider.d.ts.map +1 -0
- package/dist/types/model/migrations/index.d.ts +1 -1
- package/dist/types/model/migrations/index.d.ts.map +1 -1
- package/dist/types/model/queries/events/EventsQuery.d.ts.map +1 -1
- package/dist/types/model/queries/index.d.ts +1 -0
- package/dist/types/model/queries/index.d.ts.map +1 -1
- package/dist/types/model/queries/schema/SchemaQuery.d.ts +8 -0
- package/dist/types/model/queries/schema/SchemaQuery.d.ts.map +1 -0
- package/dist/types/model/queries/schema/index.d.ts +2 -0
- package/dist/types/model/queries/schema/index.d.ts.map +1 -0
- package/dist/types/resolvers/ResolverFactory.d.ts +3 -1
- package/dist/types/resolvers/ResolverFactory.d.ts.map +1 -1
- package/dist/types/resolvers/SystemResolverContext.d.ts +4 -4
- package/dist/types/resolvers/SystemResolverContext.d.ts.map +1 -1
- package/dist/types/resolvers/query/SchemaQueryResolver.d.ts +7 -0
- package/dist/types/resolvers/query/SchemaQueryResolver.d.ts.map +1 -0
- package/dist/types/schema/system.graphql.d.ts.map +1 -1
- package/dist/types/schema/types.d.ts +15 -3
- package/dist/types/schema/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/graphql.codegen.yml +2 -0
- package/package.json +12 -12
- package/src/SystemContainer.ts +14 -11
- package/src/bin/runMigrations.ts +4 -4
- package/src/index.ts +3 -2
- package/src/migrations/2020-05-06-150000-composed-primary.ts +1 -1
- package/src/migrations/2020-06-01-103000-event-trigger-perf.ts +1 -1
- package/src/migrations/2021-05-07-155800-event-log-rework.ts +1 -1
- package/src/migrations/2021-05-19-1232000-event-log-fix-constraint.ts +1 -1
- package/src/migrations/2022-10-03-110000-table-on-delete.ts +1 -1
- package/src/migrations/2023-09-11-174000-fix-on-delete.ts +1 -1
- package/src/migrations/2023-10-19-173000-fix-unique.ts +1 -1
- package/src/migrations/2024-06-28-153000-schema.ts +20 -0
- package/src/migrations/2024-06-28-153001-schema-init.ts +12 -0
- package/src/migrations/2024-07-29-150000-event-data-index.ts +11 -0
- package/src/migrations/runner.ts +10 -4
- package/src/migrations/snapshot.ts +17 -1
- package/src/migrations/types.ts +2 -2
- package/src/model/SchemaGetter.ts +3 -0
- package/src/model/authorization/AuthorizationActions.ts +1 -0
- package/src/model/authorization/PermissionsFactory.ts +1 -0
- package/src/model/authorization/StagePermissionsFactory.ts +5 -5
- package/src/model/authorization/StageScope.ts +2 -2
- package/src/model/commands/schema/SaveSchemaCommand.ts +31 -0
- package/src/model/dependencies/content/ContentQueryExecutor.ts +3 -2
- package/src/model/migrations/MigrationAlterer.ts +14 -0
- package/src/model/migrations/ProjectMigrator.ts +34 -12
- package/src/model/migrations/SchemaProvider.ts +77 -0
- package/src/model/migrations/index.ts +1 -1
- package/src/model/queries/events/EventsQuery.ts +15 -17
- package/src/model/queries/index.ts +1 -0
- package/src/model/queries/schema/SchemaQuery.ts +48 -0
- package/src/model/queries/schema/index.ts +1 -0
- package/src/resolvers/ResolverFactory.ts +9 -1
- package/src/resolvers/SystemResolverContext.ts +8 -13
- package/src/resolvers/mutation/TruncateMutationResolver.ts +1 -1
- package/src/resolvers/query/SchemaQueryResolver.ts +19 -0
- package/src/schema/system.graphql.ts +3 -1
- package/src/schema/types.ts +12 -2
- package/tests/cases/migrations/2020-05-06-150000-composed-primary.test.ts +9 -1
- package/tests/cases/migrations/2020-06-01-103000-event-trigger-perf.test.ts +9 -1
- package/tests/cases/migrations/2022-10-03-110000-table-on-delete.test.ts +17 -6
- package/tests/cases/migrations/2023-09-11-174000-fix-on-delete.test.ts +32 -12
- package/tests/cases/migrations/2023-10-19-173000-fix-unique.test.ts +9 -1
- package/tests/cases/unit/eventsQuery.test.ts +39 -0
- package/tests/src/uuid.ts +4 -0
- package/dist/development/src/model/migrations/SchemaVersionBuilder.cjs +0 -37
- package/dist/development/src/model/migrations/SchemaVersionBuilder.cjs.map +0 -1
- package/dist/development/src/model/migrations/SchemaVersionBuilder.js +0 -37
- package/dist/development/src/model/migrations/SchemaVersionBuilder.js.map +0 -1
- package/dist/production/src/model/migrations/SchemaVersionBuilder.cjs +0 -37
- package/dist/production/src/model/migrations/SchemaVersionBuilder.cjs.map +0 -1
- package/dist/production/src/model/migrations/SchemaVersionBuilder.js +0 -37
- package/dist/production/src/model/migrations/SchemaVersionBuilder.js.map +0 -1
- package/dist/types/model/migrations/SchemaVersionBuilder.d.ts +0 -37
- package/dist/types/model/migrations/SchemaVersionBuilder.d.ts.map +0 -1
- package/src/model/migrations/SchemaVersionBuilder.ts +0 -43
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const Database = require("@contember/database");
|
|
4
|
+
class SaveSchemaCommand {
|
|
5
|
+
constructor(input) {
|
|
6
|
+
this.input = input;
|
|
7
|
+
}
|
|
8
|
+
async execute({ db }) {
|
|
9
|
+
if (!this.input.meta.updatedAt) {
|
|
10
|
+
throw new Error("Cannot persist empty schema");
|
|
11
|
+
}
|
|
12
|
+
await Database.InsertBuilder.create().into("schema").values({
|
|
13
|
+
schema: this.input.schema,
|
|
14
|
+
updated_at: this.input.meta.updatedAt.toISOString(),
|
|
15
|
+
checksum: this.input.meta.checksum,
|
|
16
|
+
version: this.input.meta.version,
|
|
17
|
+
migration_id: this.input.meta.id
|
|
18
|
+
}).onConflict(Database.ConflictActionType.update, ["id"], {
|
|
19
|
+
schema: (expr) => expr.select(["excluded", "schema"]),
|
|
20
|
+
updated_at: (expr) => expr.select(["excluded", "updated_at"]),
|
|
21
|
+
checksum: (expr) => expr.select(["excluded", "checksum"]),
|
|
22
|
+
version: (expr) => expr.select(["excluded", "version"]),
|
|
23
|
+
migration_id: (expr) => expr.select(["excluded", "migration_id"])
|
|
24
|
+
}).execute(db);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.SaveSchemaCommand = SaveSchemaCommand;
|
|
28
|
+
//# sourceMappingURL=SaveSchemaCommand.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaveSchemaCommand.cjs","sources":["../../../../../../../packages/engine-system-api/src/model/commands/schema/SaveSchemaCommand.ts"],"sourcesContent":["import { ConflictActionType, InsertBuilder } from '@contember/database'\nimport { Command } from '../Command'\nimport { SchemaWithMeta } from '../../migrations'\n\nexport class SaveSchemaCommand implements Command<void> {\n\tconstructor(private readonly input: SchemaWithMeta) {}\n\n\tpublic async execute({ db }: Command.Args): Promise<void> {\n\t\tif (!this.input.meta.updatedAt) {\n\t\t\tthrow new Error('Cannot persist empty schema')\n\t\t}\n\n\t\tawait InsertBuilder.create()\n\t\t\t.into('schema')\n\t\t\t.values({\n\t\t\t\tschema: this.input.schema,\n\t\t\t\tupdated_at: this.input.meta.updatedAt.toISOString(),\n\t\t\t\tchecksum: this.input.meta.checksum,\n\t\t\t\tversion: this.input.meta.version,\n\t\t\t\tmigration_id: this.input.meta.id,\n\t\t\t})\n\t\t\t.onConflict(ConflictActionType.update, ['id'], {\n\t\t\t\tschema: expr => expr.select(['excluded', 'schema']),\n\t\t\t\tupdated_at: expr => expr.select(['excluded', 'updated_at']),\n\t\t\t\tchecksum: expr => expr.select(['excluded', 'checksum']),\n\t\t\t\tversion: expr => expr.select(['excluded', 'version']),\n\t\t\t\tmigration_id: expr => expr.select(['excluded', 'migration_id']),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n"],"names":["InsertBuilder","ConflictActionType"],"mappings":";;;AAIO,MAAM,kBAA2C;AAAA,EACvD,YAA6B,OAAuB;AAAvB,SAAA,QAAA;AAAA,EAAwB;AAAA,EAErD,MAAa,QAAQ,EAAE,MAAmC;AACzD,QAAI,CAAC,KAAK,MAAM,KAAK,WAAW;AACzB,YAAA,IAAI,MAAM,6BAA6B;AAAA,IAC9C;AAEA,UAAMA,SAAAA,cAAc,OAAO,EACzB,KAAK,QAAQ,EACb,OAAO;AAAA,MACP,QAAQ,KAAK,MAAM;AAAA,MACnB,YAAY,KAAK,MAAM,KAAK,UAAU,YAAY;AAAA,MAClD,UAAU,KAAK,MAAM,KAAK;AAAA,MAC1B,SAAS,KAAK,MAAM,KAAK;AAAA,MACzB,cAAc,KAAK,MAAM,KAAK;AAAA,IAC9B,CAAA,EACA,WAAWC,SAAAA,mBAAmB,QAAQ,CAAC,IAAI,GAAG;AAAA,MAC9C,QAAQ,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,QAAQ,CAAC;AAAA,MAClD,YAAY,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,YAAY,CAAC;AAAA,MAC1D,UAAU,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,UAAU,CAAC;AAAA,MACtD,SAAS,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,SAAS,CAAC;AAAA,MACpD,cAAc,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,cAAc,CAAC;AAAA,IAAA,CAC9D,EACA,QAAQ,EAAE;AAAA,EACb;AACD;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { InsertBuilder as InsertBuilder$1, ConflictActionType } from "@contember/database";
|
|
2
|
+
class SaveSchemaCommand {
|
|
3
|
+
constructor(input) {
|
|
4
|
+
this.input = input;
|
|
5
|
+
}
|
|
6
|
+
async execute({ db }) {
|
|
7
|
+
if (!this.input.meta.updatedAt) {
|
|
8
|
+
throw new Error("Cannot persist empty schema");
|
|
9
|
+
}
|
|
10
|
+
await InsertBuilder$1.create().into("schema").values({
|
|
11
|
+
schema: this.input.schema,
|
|
12
|
+
updated_at: this.input.meta.updatedAt.toISOString(),
|
|
13
|
+
checksum: this.input.meta.checksum,
|
|
14
|
+
version: this.input.meta.version,
|
|
15
|
+
migration_id: this.input.meta.id
|
|
16
|
+
}).onConflict(ConflictActionType.update, ["id"], {
|
|
17
|
+
schema: (expr) => expr.select(["excluded", "schema"]),
|
|
18
|
+
updated_at: (expr) => expr.select(["excluded", "updated_at"]),
|
|
19
|
+
checksum: (expr) => expr.select(["excluded", "checksum"]),
|
|
20
|
+
version: (expr) => expr.select(["excluded", "version"]),
|
|
21
|
+
migration_id: (expr) => expr.select(["excluded", "migration_id"])
|
|
22
|
+
}).execute(db);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
SaveSchemaCommand
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=SaveSchemaCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaveSchemaCommand.js","sources":["../../../../../../../packages/engine-system-api/src/model/commands/schema/SaveSchemaCommand.ts"],"sourcesContent":["import { ConflictActionType, InsertBuilder } from '@contember/database'\nimport { Command } from '../Command'\nimport { SchemaWithMeta } from '../../migrations'\n\nexport class SaveSchemaCommand implements Command<void> {\n\tconstructor(private readonly input: SchemaWithMeta) {}\n\n\tpublic async execute({ db }: Command.Args): Promise<void> {\n\t\tif (!this.input.meta.updatedAt) {\n\t\t\tthrow new Error('Cannot persist empty schema')\n\t\t}\n\n\t\tawait InsertBuilder.create()\n\t\t\t.into('schema')\n\t\t\t.values({\n\t\t\t\tschema: this.input.schema,\n\t\t\t\tupdated_at: this.input.meta.updatedAt.toISOString(),\n\t\t\t\tchecksum: this.input.meta.checksum,\n\t\t\t\tversion: this.input.meta.version,\n\t\t\t\tmigration_id: this.input.meta.id,\n\t\t\t})\n\t\t\t.onConflict(ConflictActionType.update, ['id'], {\n\t\t\t\tschema: expr => expr.select(['excluded', 'schema']),\n\t\t\t\tupdated_at: expr => expr.select(['excluded', 'updated_at']),\n\t\t\t\tchecksum: expr => expr.select(['excluded', 'checksum']),\n\t\t\t\tversion: expr => expr.select(['excluded', 'version']),\n\t\t\t\tmigration_id: expr => expr.select(['excluded', 'migration_id']),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n"],"names":["InsertBuilder"],"mappings":";AAIO,MAAM,kBAA2C;AAAA,EACvD,YAA6B,OAAuB;AAAvB,SAAA,QAAA;AAAA,EAAwB;AAAA,EAErD,MAAa,QAAQ,EAAE,MAAmC;AACzD,QAAI,CAAC,KAAK,MAAM,KAAK,WAAW;AACzB,YAAA,IAAI,MAAM,6BAA6B;AAAA,IAC9C;AAEA,UAAMA,gBAAc,OAAO,EACzB,KAAK,QAAQ,EACb,OAAO;AAAA,MACP,QAAQ,KAAK,MAAM;AAAA,MACnB,YAAY,KAAK,MAAM,KAAK,UAAU,YAAY;AAAA,MAClD,UAAU,KAAK,MAAM,KAAK;AAAA,MAC1B,SAAS,KAAK,MAAM,KAAK;AAAA,MACzB,cAAc,KAAK,MAAM,KAAK;AAAA,IAC9B,CAAA,EACA,WAAW,mBAAmB,QAAQ,CAAC,IAAI,GAAG;AAAA,MAC9C,QAAQ,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,QAAQ,CAAC;AAAA,MAClD,YAAY,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,YAAY,CAAC;AAAA,MAC1D,UAAU,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,UAAU,CAAC;AAAA,MACtD,SAAS,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,SAAS,CAAC;AAAA,MACpD,cAAc,CAAQ,SAAA,KAAK,OAAO,CAAC,YAAY,cAAc,CAAC;AAAA,IAAA,CAC9D,EACA,QAAQ,EAAE;AAAA,EACb;AACD;"}
|
|
@@ -6,7 +6,11 @@ require("@contember/schema-migrations");
|
|
|
6
6
|
require("@contember/schema-utils");
|
|
7
7
|
const Response = require("../../utils/Response.cjs");
|
|
8
8
|
const ModifyMigrationCommand = require("../commands/migrations/ModifyMigrationCommand.cjs");
|
|
9
|
+
const SaveSchemaCommand = require("../commands/schema/SaveSchemaCommand.cjs");
|
|
9
10
|
class MigrationAlterer {
|
|
11
|
+
constructor(schemaProvider) {
|
|
12
|
+
this.schemaProvider = schemaProvider;
|
|
13
|
+
}
|
|
10
14
|
async deleteMigration(db, version) {
|
|
11
15
|
return await db.transaction(async (db2) => {
|
|
12
16
|
const result = await db2.commandBus.execute(new DeleteMigrationCommand.DeleteMigrationCommand(version));
|
|
@@ -14,6 +18,7 @@ class MigrationAlterer {
|
|
|
14
18
|
await db2.client.connection.rollback();
|
|
15
19
|
return new Response.ResponseError("notFound", `Migration ${version} was not found`);
|
|
16
20
|
}
|
|
21
|
+
await this.refreshSchema(db2);
|
|
17
22
|
return new Response.ResponseOk(void 0);
|
|
18
23
|
});
|
|
19
24
|
}
|
|
@@ -24,9 +29,14 @@ class MigrationAlterer {
|
|
|
24
29
|
await db2.client.connection.rollback();
|
|
25
30
|
return new Response.ResponseError("notFound", `Migration ${version} was not found`);
|
|
26
31
|
}
|
|
32
|
+
await this.refreshSchema(db2);
|
|
27
33
|
return new Response.ResponseOk(void 0);
|
|
28
34
|
});
|
|
29
35
|
}
|
|
36
|
+
async refreshSchema(db) {
|
|
37
|
+
const schemaWithMeta = await this.schemaProvider.buildSchemaFromMigrations(db);
|
|
38
|
+
await db.commandBus.execute(new SaveSchemaCommand.SaveSchemaCommand(schemaWithMeta));
|
|
39
|
+
}
|
|
30
40
|
}
|
|
31
41
|
var DeleteMigrationErrorCode = /* @__PURE__ */ ((DeleteMigrationErrorCode2) => {
|
|
32
42
|
DeleteMigrationErrorCode2["notFound"] = "notFound";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrationAlterer.cjs","sources":["../../../../../../packages/engine-system-api/src/model/migrations/MigrationAlterer.ts"],"sourcesContent":["import { DatabaseContext } from '../database'\nimport { DeleteMigrationCommand } from '../commands'\nimport { Response, ResponseError, ResponseOk } from '../../utils'\nimport { Migration } from '@contember/schema-migrations'\nimport { ModifyMigrationCommand } from '../commands/migrations/ModifyMigrationCommand'\n\nexport class MigrationAlterer {\n\tpublic async deleteMigration(\n\t\tdb: DatabaseContext,\n\t\tversion: string,\n\t): Promise<Response<undefined, DeleteMigrationErrorCode>> {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst result = await db.commandBus.execute(new DeleteMigrationCommand(version))\n\t\t\tif (!result) {\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(DeleteMigrationErrorCode.notFound, `Migration ${version} was not found`)\n\t\t\t}\n\t\t\treturn new ResponseOk(undefined)\n\t\t})\n\t}\n\n\tpublic async modifyMigration(\n\t\tdb: DatabaseContext,\n\t\tversion: string,\n\t\tmigration: Partial<Migration>,\n\t): Promise<Response<undefined, UpdateMigrationErrorCode>> {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst result = await db.commandBus.execute(new ModifyMigrationCommand(version, migration))\n\t\t\tif (!result) {\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(UpdateMigrationErrorCode.notFound, `Migration ${version} was not found`)\n\t\t\t}\n\t\t\treturn new ResponseOk(undefined)\n\t\t})\n\t}\n}\n\nexport enum DeleteMigrationErrorCode {\n\tnotFound = 'notFound',\n}\n\nexport enum UpdateMigrationErrorCode {\n\tnotFound = 'notFound',\n}\n"],"names":["db","DeleteMigrationCommand","ResponseError","ResponseOk","ModifyMigrationCommand","DeleteMigrationErrorCode","UpdateMigrationErrorCode"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MigrationAlterer.cjs","sources":["../../../../../../packages/engine-system-api/src/model/migrations/MigrationAlterer.ts"],"sourcesContent":["import { DatabaseContext } from '../database'\nimport { DeleteMigrationCommand } from '../commands'\nimport { Response, ResponseError, ResponseOk } from '../../utils'\nimport { Migration } from '@contember/schema-migrations'\nimport { ModifyMigrationCommand } from '../commands/migrations/ModifyMigrationCommand'\nimport { SchemaProvider } from './SchemaProvider'\nimport { SaveSchemaCommand } from '../commands/schema/SaveSchemaCommand'\n\nexport class MigrationAlterer {\n\tconstructor(\n\t\tprivate readonly schemaProvider: SchemaProvider,\n\t) {\n\t}\n\n\tpublic async deleteMigration(\n\t\tdb: DatabaseContext,\n\t\tversion: string,\n\t): Promise<Response<undefined, DeleteMigrationErrorCode>> {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst result = await db.commandBus.execute(new DeleteMigrationCommand(version))\n\t\t\tif (!result) {\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(DeleteMigrationErrorCode.notFound, `Migration ${version} was not found`)\n\t\t\t}\n\t\t\tawait this.refreshSchema(db)\n\t\t\treturn new ResponseOk(undefined)\n\t\t})\n\t}\n\n\tpublic async modifyMigration(\n\t\tdb: DatabaseContext,\n\t\tversion: string,\n\t\tmigration: Partial<Migration>,\n\t): Promise<Response<undefined, UpdateMigrationErrorCode>> {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst result = await db.commandBus.execute(new ModifyMigrationCommand(version, migration))\n\t\t\tif (!result) {\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(UpdateMigrationErrorCode.notFound, `Migration ${version} was not found`)\n\t\t\t}\n\t\t\tawait this.refreshSchema(db)\n\t\t\treturn new ResponseOk(undefined)\n\t\t})\n\t}\n\n\tprivate async refreshSchema(db: DatabaseContext): Promise<void> {\n\t\tconst schemaWithMeta = await this.schemaProvider.buildSchemaFromMigrations(db)\n\t\tawait db.commandBus.execute(new SaveSchemaCommand(schemaWithMeta))\n\t}\n}\n\nexport enum DeleteMigrationErrorCode {\n\tnotFound = 'notFound',\n}\n\nexport enum UpdateMigrationErrorCode {\n\tnotFound = 'notFound',\n}\n"],"names":["db","DeleteMigrationCommand","ResponseError","ResponseOk","ModifyMigrationCommand","SaveSchemaCommand","DeleteMigrationErrorCode","UpdateMigrationErrorCode"],"mappings":";;;;;;;;;AAQO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,gBACZ,IACA,SACyD;AACzD,WAAO,MAAM,GAAG,YAAY,OAAMA,QAAM;AACjC,YAAA,SAAS,MAAMA,IAAG,WAAW,QAAQ,IAAIC,uBAAA,uBAAuB,OAAO,CAAC;AAC9E,UAAI,CAAC,QAAQ;AACND,cAAAA,IAAG,OAAO,WAAW,SAAS;AACpC,eAAO,IAAIE,SAAA,cAAc,YAAmC,aAAa,OAAO,gBAAgB;AAAA,MACjG;AACM,YAAA,KAAK,cAAcF,GAAE;AACpB,aAAA,IAAIG,SAAAA,WAAW,MAAS;AAAA,IAAA,CAC/B;AAAA,EACF;AAAA,EAEA,MAAa,gBACZ,IACA,SACA,WACyD;AACzD,WAAO,MAAM,GAAG,YAAY,OAAMH,QAAM;AACjC,YAAA,SAAS,MAAMA,IAAG,WAAW,QAAQ,IAAII,8CAAuB,SAAS,SAAS,CAAC;AACzF,UAAI,CAAC,QAAQ;AACNJ,cAAAA,IAAG,OAAO,WAAW,SAAS;AACpC,eAAO,IAAIE,SAAA,cAAc,YAAmC,aAAa,OAAO,gBAAgB;AAAA,MACjG;AACM,YAAA,KAAK,cAAcF,GAAE;AACpB,aAAA,IAAIG,SAAAA,WAAW,MAAS;AAAA,IAAA,CAC/B;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,IAAoC;AAC/D,UAAM,iBAAiB,MAAM,KAAK,eAAe,0BAA0B,EAAE;AAC7E,UAAM,GAAG,WAAW,QAAQ,IAAIE,kBAAA,kBAAkB,cAAc,CAAC;AAAA,EAClE;AACD;AAEY,IAAA,6CAAAC,8BAAL;AACNA,4BAAA,UAAW,IAAA;AADAA,SAAAA;AAAA,GAAA,4BAAA,CAAA,CAAA;AAIA,IAAA,6CAAAC,8BAAL;AACNA,4BAAA,UAAW,IAAA;AADAA,SAAAA;AAAA,GAAA,4BAAA,CAAA,CAAA;;;;"}
|
|
@@ -4,7 +4,11 @@ import "@contember/schema-migrations";
|
|
|
4
4
|
import "@contember/schema-utils";
|
|
5
5
|
import { ResponseError, ResponseOk } from "../../utils/Response.js";
|
|
6
6
|
import { ModifyMigrationCommand } from "../commands/migrations/ModifyMigrationCommand.js";
|
|
7
|
+
import { SaveSchemaCommand } from "../commands/schema/SaveSchemaCommand.js";
|
|
7
8
|
class MigrationAlterer {
|
|
9
|
+
constructor(schemaProvider) {
|
|
10
|
+
this.schemaProvider = schemaProvider;
|
|
11
|
+
}
|
|
8
12
|
async deleteMigration(db, version) {
|
|
9
13
|
return await db.transaction(async (db2) => {
|
|
10
14
|
const result = await db2.commandBus.execute(new DeleteMigrationCommand(version));
|
|
@@ -12,6 +16,7 @@ class MigrationAlterer {
|
|
|
12
16
|
await db2.client.connection.rollback();
|
|
13
17
|
return new ResponseError("notFound", `Migration ${version} was not found`);
|
|
14
18
|
}
|
|
19
|
+
await this.refreshSchema(db2);
|
|
15
20
|
return new ResponseOk(void 0);
|
|
16
21
|
});
|
|
17
22
|
}
|
|
@@ -22,9 +27,14 @@ class MigrationAlterer {
|
|
|
22
27
|
await db2.client.connection.rollback();
|
|
23
28
|
return new ResponseError("notFound", `Migration ${version} was not found`);
|
|
24
29
|
}
|
|
30
|
+
await this.refreshSchema(db2);
|
|
25
31
|
return new ResponseOk(void 0);
|
|
26
32
|
});
|
|
27
33
|
}
|
|
34
|
+
async refreshSchema(db) {
|
|
35
|
+
const schemaWithMeta = await this.schemaProvider.buildSchemaFromMigrations(db);
|
|
36
|
+
await db.commandBus.execute(new SaveSchemaCommand(schemaWithMeta));
|
|
37
|
+
}
|
|
28
38
|
}
|
|
29
39
|
var DeleteMigrationErrorCode = /* @__PURE__ */ ((DeleteMigrationErrorCode2) => {
|
|
30
40
|
DeleteMigrationErrorCode2["notFound"] = "notFound";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrationAlterer.js","sources":["../../../../../../packages/engine-system-api/src/model/migrations/MigrationAlterer.ts"],"sourcesContent":["import { DatabaseContext } from '../database'\nimport { DeleteMigrationCommand } from '../commands'\nimport { Response, ResponseError, ResponseOk } from '../../utils'\nimport { Migration } from '@contember/schema-migrations'\nimport { ModifyMigrationCommand } from '../commands/migrations/ModifyMigrationCommand'\n\nexport class MigrationAlterer {\n\tpublic async deleteMigration(\n\t\tdb: DatabaseContext,\n\t\tversion: string,\n\t): Promise<Response<undefined, DeleteMigrationErrorCode>> {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst result = await db.commandBus.execute(new DeleteMigrationCommand(version))\n\t\t\tif (!result) {\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(DeleteMigrationErrorCode.notFound, `Migration ${version} was not found`)\n\t\t\t}\n\t\t\treturn new ResponseOk(undefined)\n\t\t})\n\t}\n\n\tpublic async modifyMigration(\n\t\tdb: DatabaseContext,\n\t\tversion: string,\n\t\tmigration: Partial<Migration>,\n\t): Promise<Response<undefined, UpdateMigrationErrorCode>> {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst result = await db.commandBus.execute(new ModifyMigrationCommand(version, migration))\n\t\t\tif (!result) {\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(UpdateMigrationErrorCode.notFound, `Migration ${version} was not found`)\n\t\t\t}\n\t\t\treturn new ResponseOk(undefined)\n\t\t})\n\t}\n}\n\nexport enum DeleteMigrationErrorCode {\n\tnotFound = 'notFound',\n}\n\nexport enum UpdateMigrationErrorCode {\n\tnotFound = 'notFound',\n}\n"],"names":["db","DeleteMigrationErrorCode","UpdateMigrationErrorCode"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MigrationAlterer.js","sources":["../../../../../../packages/engine-system-api/src/model/migrations/MigrationAlterer.ts"],"sourcesContent":["import { DatabaseContext } from '../database'\nimport { DeleteMigrationCommand } from '../commands'\nimport { Response, ResponseError, ResponseOk } from '../../utils'\nimport { Migration } from '@contember/schema-migrations'\nimport { ModifyMigrationCommand } from '../commands/migrations/ModifyMigrationCommand'\nimport { SchemaProvider } from './SchemaProvider'\nimport { SaveSchemaCommand } from '../commands/schema/SaveSchemaCommand'\n\nexport class MigrationAlterer {\n\tconstructor(\n\t\tprivate readonly schemaProvider: SchemaProvider,\n\t) {\n\t}\n\n\tpublic async deleteMigration(\n\t\tdb: DatabaseContext,\n\t\tversion: string,\n\t): Promise<Response<undefined, DeleteMigrationErrorCode>> {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst result = await db.commandBus.execute(new DeleteMigrationCommand(version))\n\t\t\tif (!result) {\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(DeleteMigrationErrorCode.notFound, `Migration ${version} was not found`)\n\t\t\t}\n\t\t\tawait this.refreshSchema(db)\n\t\t\treturn new ResponseOk(undefined)\n\t\t})\n\t}\n\n\tpublic async modifyMigration(\n\t\tdb: DatabaseContext,\n\t\tversion: string,\n\t\tmigration: Partial<Migration>,\n\t): Promise<Response<undefined, UpdateMigrationErrorCode>> {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst result = await db.commandBus.execute(new ModifyMigrationCommand(version, migration))\n\t\t\tif (!result) {\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(UpdateMigrationErrorCode.notFound, `Migration ${version} was not found`)\n\t\t\t}\n\t\t\tawait this.refreshSchema(db)\n\t\t\treturn new ResponseOk(undefined)\n\t\t})\n\t}\n\n\tprivate async refreshSchema(db: DatabaseContext): Promise<void> {\n\t\tconst schemaWithMeta = await this.schemaProvider.buildSchemaFromMigrations(db)\n\t\tawait db.commandBus.execute(new SaveSchemaCommand(schemaWithMeta))\n\t}\n}\n\nexport enum DeleteMigrationErrorCode {\n\tnotFound = 'notFound',\n}\n\nexport enum UpdateMigrationErrorCode {\n\tnotFound = 'notFound',\n}\n"],"names":["db","DeleteMigrationErrorCode","UpdateMigrationErrorCode"],"mappings":";;;;;;;AAQO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,gBACZ,IACA,SACyD;AACzD,WAAO,MAAM,GAAG,YAAY,OAAMA,QAAM;AACjC,YAAA,SAAS,MAAMA,IAAG,WAAW,QAAQ,IAAI,uBAAuB,OAAO,CAAC;AAC9E,UAAI,CAAC,QAAQ;AACNA,cAAAA,IAAG,OAAO,WAAW,SAAS;AACpC,eAAO,IAAI,cAAc,YAAmC,aAAa,OAAO,gBAAgB;AAAA,MACjG;AACM,YAAA,KAAK,cAAcA,GAAE;AACpB,aAAA,IAAI,WAAW,MAAS;AAAA,IAAA,CAC/B;AAAA,EACF;AAAA,EAEA,MAAa,gBACZ,IACA,SACA,WACyD;AACzD,WAAO,MAAM,GAAG,YAAY,OAAMA,QAAM;AACjC,YAAA,SAAS,MAAMA,IAAG,WAAW,QAAQ,IAAI,uBAAuB,SAAS,SAAS,CAAC;AACzF,UAAI,CAAC,QAAQ;AACNA,cAAAA,IAAG,OAAO,WAAW,SAAS;AACpC,eAAO,IAAI,cAAc,YAAmC,aAAa,OAAO,gBAAgB;AAAA,MACjG;AACM,YAAA,KAAK,cAAcA,GAAE;AACpB,aAAA,IAAI,WAAW,MAAS;AAAA,IAAA,CAC/B;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,IAAoC;AAC/D,UAAM,iBAAiB,MAAM,KAAK,eAAe,0BAA0B,EAAE;AAC7E,UAAM,GAAG,WAAW,QAAQ,IAAI,kBAAkB,cAAc,CAAC;AAAA,EAClE;AACD;AAEY,IAAA,6CAAAC,8BAAL;AACNA,4BAAA,UAAW,IAAA;AADAA,SAAAA;AAAA,GAAA,4BAAA,CAAA,CAAA;AAIA,IAAA,6CAAAC,8BAAL;AACNA,4BAAA,UAAW,IAAA;AADAA,SAAAA;AAAA,GAAA,4BAAA,CAAA,CAAA;"}
|
|
@@ -8,13 +8,15 @@ const types = require("../../schema/types.cjs");
|
|
|
8
8
|
require("../../schema/dev.graphql.cjs");
|
|
9
9
|
require("../../schema/system.graphql.cjs");
|
|
10
10
|
const logger = require("@contember/logger");
|
|
11
|
+
const SaveSchemaCommand = require("../commands/schema/SaveSchemaCommand.cjs");
|
|
12
|
+
const exceptions = require("../../utils/exceptions.cjs");
|
|
11
13
|
var __defProp = Object.defineProperty;
|
|
12
14
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
15
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
14
16
|
class ProjectMigrator {
|
|
15
|
-
constructor(migrationDescriber,
|
|
17
|
+
constructor(migrationDescriber, schemaProvider, executedMigrationsResolver, migrationsDatabaseMetadataResolverStoreFactory, contentQueryExecutor) {
|
|
16
18
|
this.migrationDescriber = migrationDescriber;
|
|
17
|
-
this.
|
|
19
|
+
this.schemaProvider = schemaProvider;
|
|
18
20
|
this.executedMigrationsResolver = executedMigrationsResolver;
|
|
19
21
|
this.migrationsDatabaseMetadataResolverStoreFactory = migrationsDatabaseMetadataResolverStoreFactory;
|
|
20
22
|
this.contentQueryExecutor = contentQueryExecutor;
|
|
@@ -23,8 +25,13 @@ class ProjectMigrator {
|
|
|
23
25
|
if (migrationsToExecute.length === 0) {
|
|
24
26
|
return;
|
|
25
27
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
const schemaWithMeta = await this.schemaProvider.fetch({ db });
|
|
29
|
+
let schema = schemaWithMeta.schema;
|
|
30
|
+
let id = schemaWithMeta.meta.id;
|
|
31
|
+
const validated = await this.validateMigrations(db, schema, schemaWithMeta.meta.version ?? null, migrationsToExecute, { ignoreOrder, skipExecuted });
|
|
32
|
+
if (validated.length === 0) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
28
35
|
const sorted = [...validated].sort((a, b) => a.version.localeCompare(b.version));
|
|
29
36
|
const metadataStore = this.migrationsDatabaseMetadataResolverStoreFactory.create(db);
|
|
30
37
|
for (const migration of sorted) {
|
|
@@ -43,16 +50,16 @@ class ProjectMigrator {
|
|
|
43
50
|
);
|
|
44
51
|
}
|
|
45
52
|
} else if (migration.type === "content") {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
};
|
|
53
|
+
if (!id) {
|
|
54
|
+
throw new FailedContentMigrationError(migration.version, `Cannot execute content migration without schema`);
|
|
55
|
+
}
|
|
50
56
|
for (const query of migration.queries) {
|
|
51
57
|
await this.executeContentMigration({
|
|
52
58
|
version: migration.version,
|
|
53
59
|
query,
|
|
54
60
|
db,
|
|
55
|
-
schema
|
|
61
|
+
schema,
|
|
62
|
+
schemaMeta: { id },
|
|
56
63
|
stages,
|
|
57
64
|
databaseMetadata: await metadataStore.getMetadata(db.client.schema),
|
|
58
65
|
identity,
|
|
@@ -64,6 +71,18 @@ class ProjectMigrator {
|
|
|
64
71
|
}
|
|
65
72
|
id = await db.commandBus.execute(new SaveMigrationCommand.SaveMigrationCommand(migration));
|
|
66
73
|
}
|
|
74
|
+
if (!id) {
|
|
75
|
+
throw new exceptions.ImplementationException();
|
|
76
|
+
}
|
|
77
|
+
await db.commandBus.execute(new SaveSchemaCommand.SaveSchemaCommand({
|
|
78
|
+
schema,
|
|
79
|
+
meta: {
|
|
80
|
+
id,
|
|
81
|
+
updatedAt: /* @__PURE__ */ new Date(),
|
|
82
|
+
version: sorted[sorted.length - 1].version,
|
|
83
|
+
checksum: schemaUtils.calculateSchemaChecksum(schema)
|
|
84
|
+
}
|
|
85
|
+
}));
|
|
67
86
|
}
|
|
68
87
|
async executeContentMigration({ query, stages, version, ...ctx }) {
|
|
69
88
|
const queryStages = query.stage ? stages.filter((it) => it.slug === query.stage) : stages;
|
|
@@ -98,7 +117,7 @@ class ProjectMigrator {
|
|
|
98
117
|
throw new AlreadyExecutedMigrationError(migration.version, `Migration is already executed`);
|
|
99
118
|
}
|
|
100
119
|
}
|
|
101
|
-
if (migration.version < version && !ignoreOrder) {
|
|
120
|
+
if (version && migration.version < version && !ignoreOrder) {
|
|
102
121
|
throw new MustFollowLatestMigrationError(migration.version, `Must follow latest executed migration ${version}`);
|
|
103
122
|
}
|
|
104
123
|
if (migration.type === "schema") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectMigrator.cjs","sources":["../../../../../../packages/engine-system-api/src/model/migrations/ProjectMigrator.ts"],"sourcesContent":["import { calculateMigrationChecksum, Migration, MigrationDescriber, MigrationVersionHelper } from '@contember/schema-migrations'\nimport { Client, DatabaseMetadata, QueryError, wrapIdentifier } from '@contember/database'\nimport { Schema } from '@contember/schema'\nimport { SaveMigrationCommand } from '../commands'\nimport { Stage } from '../dtos'\nimport { DatabaseContext } from '../database'\nimport { ExecutedMigrationsResolver } from './ExecutedMigrationsResolver'\nimport { MigrateErrorCode } from '../../schema'\nimport { SchemaVersionBuilder } from './SchemaVersionBuilder'\nimport { SchemaValidator, SchemaValidatorSkippedErrors } from '@contember/schema-utils'\nimport { logger } from '@contember/logger'\nimport { MigrationsDatabaseMetadataResolverStoreFactory, SchemaDatabaseMetadataResolverStore } from '../metadata'\nimport { ContentMigrationQuery, MigrationInput } from './MigrationInput'\nimport { ContentQueryExecutor } from '../dependencies'\n\nexport class ProjectMigrator {\n\tconstructor(\n\t\tprivate readonly migrationDescriber: MigrationDescriber,\n\t\tprivate readonly schemaVersionBuilder: SchemaVersionBuilder,\n\t\tprivate readonly executedMigrationsResolver: ExecutedMigrationsResolver,\n\t\tprivate readonly migrationsDatabaseMetadataResolverStoreFactory: MigrationsDatabaseMetadataResolverStoreFactory,\n\t\tprivate readonly contentQueryExecutor: ContentQueryExecutor,\n\t) {}\n\n\tpublic async migrate({ db, project, identity, options: { ignoreOrder = false, skipExecuted = false }, migrationsToExecute, stages }: {\n\t\tdb: DatabaseContext\n\t\tproject: { slug: string; systemSchema: string }\n\t\tidentity: { id: string }\n\t\tstages: Stage[]\n\t\tmigrationsToExecute: readonly MigrationInput[]\n\t\toptions: {\n\t\t\tignoreOrder?: boolean\n\t\t\tskipExecuted?: boolean\n\t\t}\n\t}) {\n\t\tif (migrationsToExecute.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tlet { version, notNormalized, id, ...schema } = await this.schemaVersionBuilder.buildSchema(db)\n\t\tconst validated = await this.validateMigrations(db, schema, version, migrationsToExecute, { ignoreOrder, skipExecuted })\n\n\t\tconst sorted = [...validated].sort((a, b) => a.version.localeCompare(b.version))\n\n\t\tconst metadataStore = this.migrationsDatabaseMetadataResolverStoreFactory.create(db)\n\n\t\tfor (const migration of sorted) {\n\n\t\t\tif (migration.type === 'schema') {\n\t\t\t\tconst formatVersion = migration.formatVersion\n\n\t\t\t\tfor (const modification of migration.modifications) {\n\t\t\t\t\t[schema] = await this.applyModification(\n\t\t\t\t\t\tdb.client,\n\t\t\t\t\t\tstages,\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\tmodification,\n\t\t\t\t\t\tformatVersion,\n\t\t\t\t\t\tmigration.version,\n\t\t\t\t\t\tdb.client.schema,\n\t\t\t\t\t\tmetadataStore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else if (migration.type === 'content') {\n\t\t\t\tconst schemaWithId = {\n\t\t\t\t\t...schema,\n\t\t\t\t\tid,\n\t\t\t\t}\n\t\t\t\tfor (const query of migration.queries) {\n\t\t\t\t\tawait this.executeContentMigration({\n\t\t\t\t\t\tversion: migration.version,\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\tdb,\n\t\t\t\t\t\tschema: schemaWithId,\n\t\t\t\t\t\tstages,\n\t\t\t\t\t\tdatabaseMetadata: await metadataStore.getMetadata(db.client.schema),\n\t\t\t\t\t\tidentity,\n\t\t\t\t\t\tproject,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t// event log uses deferred constraint triggers, we need to fire them before ALTER\n\t\t\t\tawait db.client.query(`SET CONSTRAINTS ALL IMMEDIATE`)\n\t\t\t\tawait db.client.query(`SET CONSTRAINTS ALL DEFERRED`)\n\n\t\t\t}\n\t\t\tid = await db.commandBus.execute(new SaveMigrationCommand(migration))\n\t\t}\n\t}\n\n\tprivate async executeContentMigration({ query, stages, version, ...ctx }: {\n\t\tversion: string\n\t\tdb: DatabaseContext\n\t\tquery: ContentMigrationQuery\n\t\tstages: Stage[]\n\t\tschema: Schema & { id: number }\n\t\tproject: { slug: string; systemSchema: string }\n\t\tidentity: { id: string }\n\t\tdatabaseMetadata: DatabaseMetadata\n\t}) {\n\t\tconst queryStages = query.stage ? stages.filter(it => it.slug === query.stage) : stages\n\t\tfor (const stage of queryStages) {\n\t\t\tconst response = await this.contentQueryExecutor.execute({\n\t\t\t\tstage,\n\t\t\t\t...ctx,\n\t\t\t}, query)\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new FailedContentMigrationError(version, response.errors.join(', '))\n\t\t\t}\n\t\t\tif (query.checkMutationResult !== false) {\n\t\t\t\tfor (const [key, value] of Object.entries(response.result.data ?? {})) {\n\t\t\t\t\tif (typeof value === 'object' && value !== null && 'ok' in value && !value.ok) {\n\t\t\t\t\t\tconst errorDetails = 'errorMessage' in value ? value.errorMessage : 'No details available. Please fetch errorMessage field.'\n\t\t\t\t\t\tthrow new NotSuccessfulContentMigrationError(version, `Mutation ${key} failed: ${errorDetails}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async validateMigrations(\n\t\tdb: DatabaseContext,\n\t\tschema: Schema,\n\t\tversion: string,\n\t\tmigrationsToExecute: readonly MigrationInput[],\n\t\t{ ignoreOrder, skipExecuted }: {\n\t\t\tignoreOrder: boolean\n\t\t\tskipExecuted: boolean\n\t\t},\n\t): Promise<readonly MigrationInput[]> {\n\t\tconst executedMigrations = await this.executedMigrationsResolver.getMigrations(db)\n\t\tconst toExecute: MigrationInput[] = []\n\t\tlet skippedErrors: SchemaValidatorSkippedErrors[] = []\n\t\tfor (const migration of migrationsToExecute) {\n\t\t\tconst executedMigration = executedMigrations.find(it => it.version === migration.version)\n\t\t\tif (executedMigration) {\n\t\t\t\tif (skipExecuted && (migration.type !== 'schema' || executedMigration.checksum === calculateMigrationChecksum(migration))) {\n\t\t\t\t\tcontinue\n\t\t\t\t} else {\n\t\t\t\t\tthrow new AlreadyExecutedMigrationError(migration.version, `Migration is already executed`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (migration.version < version && !ignoreOrder) {\n\t\t\t\tthrow new MustFollowLatestMigrationError(migration.version, `Must follow latest executed migration ${version}`)\n\t\t\t}\n\t\t\tif (migration.type === 'schema') {\n\t\t\t\tconst described = this.migrationDescriber.describeModifications(schema, migration)\n\t\t\t\tif (described.length === 0) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst latestModification = described[described.length - 1]\n\t\t\t\tschema = latestModification.schema\n\t\t\t\tskippedErrors = [\n\t\t\t\t\t...skippedErrors.filter(it => it.skipUntil && MigrationVersionHelper.extractVersion(it.skipUntil) >= migration.version),\n\t\t\t\t\t...migration.skippedErrors ?? [],\n\t\t\t\t]\n\t\t\t\tconst errors = SchemaValidator.validate(schema, skippedErrors)\n\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\tthrow new InvalidSchemaError(\n\t\t\t\t\t\tmigration.version,\n\t\t\t\t\t\t'Migration generates invalid schema: \\n' +\n\t\t\t\t\t\terrors.map(it => `${it.path.join('.')}: [${it.code}] ${it.message}`).join('\\n'),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttoExecute.push(migration)\n\t\t}\n\t\t// intentionally not using skippedErrors here\n\t\tconst errors = SchemaValidator.validate(schema)\n\t\tif (errors.length > 0) {\n\t\t\tthrow new InvalidSchemaError(\n\t\t\t\ttoExecute[toExecute.length - 1].version,\n\t\t\t\t'Migration generates invalid schema: \\n' +\n\t\t\t\terrors.map(it => it.path.join('.') + ': ' + it.message).join('\\n'),\n\t\t\t)\n\t\t}\n\t\treturn toExecute\n\t}\n\n\tprivate async applyModification(\n\t\tdb: Client,\n\t\tstages: Stage[],\n\t\tschema: Schema,\n\t\tmodification: Migration.Modification,\n\t\tformatVersion: number,\n\t\tmigrationVersion: string,\n\t\tsystemSchema: string,\n\t\tmetadataStore: SchemaDatabaseMetadataResolverStore,\n\t): Promise<[Schema]> {\n\t\tconst {\n\t\t\tgetSql,\n\t\t\tschema: newSchema,\n\t\t} = this.migrationDescriber.describeModification(schema, modification, { formatVersion })\n\t\tfor (const stage of stages) {\n\t\t\tconst databaseMetadata = await metadataStore.getMetadata(stage.schema)\n\t\t\tconst sql = getSql({\n\t\t\t\tsystemSchema,\n\t\t\t\tdatabaseMetadata,\n\t\t\t\tinvalidateDatabaseMetadata: () => metadataStore.invalidate(stage.schema),\n\t\t\t})\n\t\t\tawait this.executeOnStage(db, stage, sql, migrationVersion)\n\t\t}\n\t\treturn [newSchema]\n\t}\n\n\tprivate async executeOnStage(db: Client, stage: Stage, sql: string, migrationVersion: string) {\n\t\tawait db.query('SET search_path TO ' + wrapIdentifier(stage.schema))\n\t\ttry {\n\t\t\tawait db.query(sql)\n\t\t} catch (e) {\n\t\t\tif (e instanceof QueryError) {\n\t\t\t\tlogger.error(e, { message: 'Migration failed' })\n\t\t\t\tthrow new MigrationFailedError(migrationVersion, e.message)\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\t}\n}\n\nexport abstract class MigrationError extends Error {\n\tpublic abstract code: MigrateErrorCode\n\n\tconstructor(public readonly version: string, public readonly migrationError: string) {\n\t\tsuper(`${version}: ${migrationError}`)\n\t}\n}\n\nexport class MustFollowLatestMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.MustFollowLatest\n}\n\nexport class AlreadyExecutedMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.AlreadyExecuted\n}\n\nexport class MigrationFailedError extends MigrationError {\n\tcode = MigrateErrorCode.MigrationFailed\n}\n\nexport class InvalidSchemaError extends MigrationError {\n\tcode = MigrateErrorCode.InvalidSchema\n}\n\nexport class FailedContentMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.ContentMigrationFailed\n}\n\nexport class NotSuccessfulContentMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.ContentMigrationNotSuccessful\n}\n"],"names":["SaveMigrationCommand","calculateMigrationChecksum","MigrationVersionHelper","errors","SchemaValidator","wrapIdentifier","QueryError","logger","MigrateErrorCode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProjectMigrator.cjs","sources":["../../../../../../packages/engine-system-api/src/model/migrations/ProjectMigrator.ts"],"sourcesContent":["import { calculateMigrationChecksum, Migration, MigrationDescriber, MigrationVersionHelper } from '@contember/schema-migrations'\nimport { Client, DatabaseMetadata, QueryError, wrapIdentifier } from '@contember/database'\nimport { Schema } from '@contember/schema'\nimport { SaveMigrationCommand } from '../commands'\nimport { Stage } from '../dtos'\nimport { DatabaseContext } from '../database'\nimport { ExecutedMigrationsResolver } from './ExecutedMigrationsResolver'\nimport { MigrateErrorCode } from '../../schema'\nimport { calculateSchemaChecksum, SchemaValidator, SchemaValidatorSkippedErrors } from '@contember/schema-utils'\nimport { logger } from '@contember/logger'\nimport { MigrationsDatabaseMetadataResolverStoreFactory, SchemaDatabaseMetadataResolverStore } from '../metadata'\nimport { ContentMigrationQuery, MigrationInput } from './MigrationInput'\nimport { ContentQueryExecutor } from '../dependencies'\nimport { SchemaProvider } from './SchemaProvider'\nimport { SaveSchemaCommand } from '../commands/schema/SaveSchemaCommand'\nimport { ImplementationException } from '../../utils'\n\nexport class ProjectMigrator {\n\tconstructor(\n\t\tprivate readonly migrationDescriber: MigrationDescriber,\n\t\tprivate readonly schemaProvider: SchemaProvider,\n\t\tprivate readonly executedMigrationsResolver: ExecutedMigrationsResolver,\n\t\tprivate readonly migrationsDatabaseMetadataResolverStoreFactory: MigrationsDatabaseMetadataResolverStoreFactory,\n\t\tprivate readonly contentQueryExecutor: ContentQueryExecutor,\n\t) {}\n\n\tpublic async migrate({ db, project, identity, options: { ignoreOrder = false, skipExecuted = false }, migrationsToExecute, stages }: {\n\t\tdb: DatabaseContext\n\t\tproject: { slug: string; systemSchema: string }\n\t\tidentity: { id: string }\n\t\tstages: Stage[]\n\t\tmigrationsToExecute: readonly MigrationInput[]\n\t\toptions: {\n\t\t\tignoreOrder?: boolean\n\t\t\tskipExecuted?: boolean\n\t\t}\n\t}) {\n\t\tif (migrationsToExecute.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tconst schemaWithMeta = await this.schemaProvider.fetch({ db })\n\t\tlet schema = schemaWithMeta.schema\n\t\tlet id = schemaWithMeta.meta.id\n\n\t\tconst validated = await this.validateMigrations(db, schema, schemaWithMeta.meta.version ?? null, migrationsToExecute, { ignoreOrder, skipExecuted })\n\t\tif (validated.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst sorted = [...validated].sort((a, b) => a.version.localeCompare(b.version))\n\n\t\tconst metadataStore = this.migrationsDatabaseMetadataResolverStoreFactory.create(db)\n\n\t\tfor (const migration of sorted) {\n\n\t\t\tif (migration.type === 'schema') {\n\t\t\t\tconst formatVersion = migration.formatVersion\n\n\t\t\t\tfor (const modification of migration.modifications) {\n\t\t\t\t\t[schema] = await this.applyModification(\n\t\t\t\t\t\tdb.client,\n\t\t\t\t\t\tstages,\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\tmodification,\n\t\t\t\t\t\tformatVersion,\n\t\t\t\t\t\tmigration.version,\n\t\t\t\t\t\tdb.client.schema,\n\t\t\t\t\t\tmetadataStore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else if (migration.type === 'content') {\n\t\t\t\tif (!id) {\n\t\t\t\t\tthrow new FailedContentMigrationError(migration.version, `Cannot execute content migration without schema`)\n\t\t\t\t}\n\t\t\t\tfor (const query of migration.queries) {\n\t\t\t\t\tawait this.executeContentMigration({\n\t\t\t\t\t\tversion: migration.version,\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\tdb,\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\tschemaMeta: { id },\n\t\t\t\t\t\tstages,\n\t\t\t\t\t\tdatabaseMetadata: await metadataStore.getMetadata(db.client.schema),\n\t\t\t\t\t\tidentity,\n\t\t\t\t\t\tproject,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t// event log uses deferred constraint triggers, we need to fire them before ALTER\n\t\t\t\tawait db.client.query(`SET CONSTRAINTS ALL IMMEDIATE`)\n\t\t\t\tawait db.client.query(`SET CONSTRAINTS ALL DEFERRED`)\n\n\t\t\t}\n\t\t\tid = await db.commandBus.execute(new SaveMigrationCommand(migration))\n\t\t}\n\t\tif (!id) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tawait db.commandBus.execute(new SaveSchemaCommand({\n\t\t\tschema,\n\t\t\tmeta: {\n\t\t\t\tid,\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tversion: sorted[sorted.length - 1].version,\n\t\t\t\tchecksum: calculateSchemaChecksum(schema),\n\t\t\t},\n\t\t}))\n\t}\n\n\tprivate async executeContentMigration({ query, stages, version, ...ctx }: {\n\t\tversion: string\n\t\tdb: DatabaseContext\n\t\tquery: ContentMigrationQuery\n\t\tstages: Stage[]\n\t\tschema: Schema\n\t\tschemaMeta: { id: number }\n\t\tproject: { slug: string; systemSchema: string }\n\t\tidentity: { id: string }\n\t\tdatabaseMetadata: DatabaseMetadata\n\t}) {\n\t\tconst queryStages = query.stage ? stages.filter(it => it.slug === query.stage) : stages\n\t\tfor (const stage of queryStages) {\n\t\t\tconst response = await this.contentQueryExecutor.execute({\n\t\t\t\tstage,\n\t\t\t\t...ctx,\n\t\t\t}, query)\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new FailedContentMigrationError(version, response.errors.join(', '))\n\t\t\t}\n\t\t\tif (query.checkMutationResult !== false) {\n\t\t\t\tfor (const [key, value] of Object.entries(response.result.data ?? {})) {\n\t\t\t\t\tif (typeof value === 'object' && value !== null && 'ok' in value && !value.ok) {\n\t\t\t\t\t\tconst errorDetails = 'errorMessage' in value ? value.errorMessage : 'No details available. Please fetch errorMessage field.'\n\t\t\t\t\t\tthrow new NotSuccessfulContentMigrationError(version, `Mutation ${key} failed: ${errorDetails}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async validateMigrations(\n\t\tdb: DatabaseContext,\n\t\tschema: Schema,\n\t\tversion: string | null,\n\t\tmigrationsToExecute: readonly MigrationInput[],\n\t\t{ ignoreOrder, skipExecuted }: {\n\t\t\tignoreOrder: boolean\n\t\t\tskipExecuted: boolean\n\t\t},\n\t): Promise<readonly MigrationInput[]> {\n\t\tconst executedMigrations = await this.executedMigrationsResolver.getMigrations(db)\n\t\tconst toExecute: MigrationInput[] = []\n\t\tlet skippedErrors: SchemaValidatorSkippedErrors[] = []\n\t\tfor (const migration of migrationsToExecute) {\n\t\t\tconst executedMigration = executedMigrations.find(it => it.version === migration.version)\n\t\t\tif (executedMigration) {\n\t\t\t\tif (skipExecuted && (migration.type !== 'schema' || executedMigration.checksum === calculateMigrationChecksum(migration))) {\n\t\t\t\t\tcontinue\n\t\t\t\t} else {\n\t\t\t\t\tthrow new AlreadyExecutedMigrationError(migration.version, `Migration is already executed`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (version && migration.version < version && !ignoreOrder) {\n\t\t\t\tthrow new MustFollowLatestMigrationError(migration.version, `Must follow latest executed migration ${version}`)\n\t\t\t}\n\t\t\tif (migration.type === 'schema') {\n\t\t\t\tconst described = this.migrationDescriber.describeModifications(schema, migration)\n\t\t\t\tif (described.length === 0) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst latestModification = described[described.length - 1]\n\t\t\t\tschema = latestModification.schema\n\t\t\t\tskippedErrors = [\n\t\t\t\t\t...skippedErrors.filter(it => it.skipUntil && MigrationVersionHelper.extractVersion(it.skipUntil) >= migration.version),\n\t\t\t\t\t...migration.skippedErrors ?? [],\n\t\t\t\t]\n\t\t\t\tconst errors = SchemaValidator.validate(schema, skippedErrors)\n\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\tthrow new InvalidSchemaError(\n\t\t\t\t\t\tmigration.version,\n\t\t\t\t\t\t'Migration generates invalid schema: \\n' +\n\t\t\t\t\t\terrors.map(it => `${it.path.join('.')}: [${it.code}] ${it.message}`).join('\\n'),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttoExecute.push(migration)\n\t\t}\n\t\t// intentionally not using skippedErrors here\n\t\tconst errors = SchemaValidator.validate(schema)\n\t\tif (errors.length > 0) {\n\t\t\tthrow new InvalidSchemaError(\n\t\t\t\ttoExecute[toExecute.length - 1].version,\n\t\t\t\t'Migration generates invalid schema: \\n' +\n\t\t\t\terrors.map(it => it.path.join('.') + ': ' + it.message).join('\\n'),\n\t\t\t)\n\t\t}\n\t\treturn toExecute\n\t}\n\n\tprivate async applyModification(\n\t\tdb: Client,\n\t\tstages: Stage[],\n\t\tschema: Schema,\n\t\tmodification: Migration.Modification,\n\t\tformatVersion: number,\n\t\tmigrationVersion: string,\n\t\tsystemSchema: string,\n\t\tmetadataStore: SchemaDatabaseMetadataResolverStore,\n\t): Promise<[Schema]> {\n\t\tconst {\n\t\t\tgetSql,\n\t\t\tschema: newSchema,\n\t\t} = this.migrationDescriber.describeModification(schema, modification, { formatVersion })\n\t\tfor (const stage of stages) {\n\t\t\tconst databaseMetadata = await metadataStore.getMetadata(stage.schema)\n\t\t\tconst sql = getSql({\n\t\t\t\tsystemSchema,\n\t\t\t\tdatabaseMetadata,\n\t\t\t\tinvalidateDatabaseMetadata: () => metadataStore.invalidate(stage.schema),\n\t\t\t})\n\t\t\tawait this.executeOnStage(db, stage, sql, migrationVersion)\n\t\t}\n\t\treturn [newSchema]\n\t}\n\n\tprivate async executeOnStage(db: Client, stage: Stage, sql: string, migrationVersion: string) {\n\t\tawait db.query('SET search_path TO ' + wrapIdentifier(stage.schema))\n\t\ttry {\n\t\t\tawait db.query(sql)\n\t\t} catch (e) {\n\t\t\tif (e instanceof QueryError) {\n\t\t\t\tlogger.error(e, { message: 'Migration failed' })\n\t\t\t\tthrow new MigrationFailedError(migrationVersion, e.message)\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\t}\n}\n\nexport abstract class MigrationError extends Error {\n\tpublic abstract code: MigrateErrorCode\n\n\tconstructor(public readonly version: string, public readonly migrationError: string) {\n\t\tsuper(`${version}: ${migrationError}`)\n\t}\n}\n\nexport class MustFollowLatestMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.MustFollowLatest\n}\n\nexport class AlreadyExecutedMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.AlreadyExecuted\n}\n\nexport class MigrationFailedError extends MigrationError {\n\tcode = MigrateErrorCode.MigrationFailed\n}\n\nexport class InvalidSchemaError extends MigrationError {\n\tcode = MigrateErrorCode.InvalidSchema\n}\n\nexport class FailedContentMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.ContentMigrationFailed\n}\n\nexport class NotSuccessfulContentMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.ContentMigrationNotSuccessful\n}\n"],"names":["SaveMigrationCommand","ImplementationException","SaveSchemaCommand","calculateSchemaChecksum","calculateMigrationChecksum","MigrationVersionHelper","errors","SchemaValidator","wrapIdentifier","QueryError","logger","MigrateErrorCode"],"mappings":"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"}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import { calculateMigrationChecksum, MigrationVersionHelper } from "@contember/schema-migrations";
|
|
2
2
|
import { wrapIdentifier, QueryError } from "@contember/database";
|
|
3
3
|
import { SaveMigrationCommand } from "../commands/migrations/SaveMigrationCommand.js";
|
|
4
|
-
import { SchemaValidator } from "@contember/schema-utils";
|
|
4
|
+
import { calculateSchemaChecksum, SchemaValidator } from "@contember/schema-utils";
|
|
5
5
|
import { MigrateErrorCode } from "../../schema/types.js";
|
|
6
6
|
import "../../schema/dev.graphql.js";
|
|
7
7
|
import "../../schema/system.graphql.js";
|
|
8
8
|
import { logger } from "@contember/logger";
|
|
9
|
+
import { SaveSchemaCommand } from "../commands/schema/SaveSchemaCommand.js";
|
|
10
|
+
import { ImplementationException } from "../../utils/exceptions.js";
|
|
9
11
|
var __defProp = Object.defineProperty;
|
|
10
12
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
13
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
|
|
12
14
|
class ProjectMigrator {
|
|
13
|
-
constructor(migrationDescriber,
|
|
15
|
+
constructor(migrationDescriber, schemaProvider, executedMigrationsResolver, migrationsDatabaseMetadataResolverStoreFactory, contentQueryExecutor) {
|
|
14
16
|
this.migrationDescriber = migrationDescriber;
|
|
15
|
-
this.
|
|
17
|
+
this.schemaProvider = schemaProvider;
|
|
16
18
|
this.executedMigrationsResolver = executedMigrationsResolver;
|
|
17
19
|
this.migrationsDatabaseMetadataResolverStoreFactory = migrationsDatabaseMetadataResolverStoreFactory;
|
|
18
20
|
this.contentQueryExecutor = contentQueryExecutor;
|
|
@@ -21,8 +23,13 @@ class ProjectMigrator {
|
|
|
21
23
|
if (migrationsToExecute.length === 0) {
|
|
22
24
|
return;
|
|
23
25
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
const schemaWithMeta = await this.schemaProvider.fetch({ db });
|
|
27
|
+
let schema = schemaWithMeta.schema;
|
|
28
|
+
let id = schemaWithMeta.meta.id;
|
|
29
|
+
const validated = await this.validateMigrations(db, schema, schemaWithMeta.meta.version ?? null, migrationsToExecute, { ignoreOrder, skipExecuted });
|
|
30
|
+
if (validated.length === 0) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
26
33
|
const sorted = [...validated].sort((a, b) => a.version.localeCompare(b.version));
|
|
27
34
|
const metadataStore = this.migrationsDatabaseMetadataResolverStoreFactory.create(db);
|
|
28
35
|
for (const migration of sorted) {
|
|
@@ -41,16 +48,16 @@ class ProjectMigrator {
|
|
|
41
48
|
);
|
|
42
49
|
}
|
|
43
50
|
} else if (migration.type === "content") {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
};
|
|
51
|
+
if (!id) {
|
|
52
|
+
throw new FailedContentMigrationError(migration.version, `Cannot execute content migration without schema`);
|
|
53
|
+
}
|
|
48
54
|
for (const query of migration.queries) {
|
|
49
55
|
await this.executeContentMigration({
|
|
50
56
|
version: migration.version,
|
|
51
57
|
query,
|
|
52
58
|
db,
|
|
53
|
-
schema
|
|
59
|
+
schema,
|
|
60
|
+
schemaMeta: { id },
|
|
54
61
|
stages,
|
|
55
62
|
databaseMetadata: await metadataStore.getMetadata(db.client.schema),
|
|
56
63
|
identity,
|
|
@@ -62,6 +69,18 @@ class ProjectMigrator {
|
|
|
62
69
|
}
|
|
63
70
|
id = await db.commandBus.execute(new SaveMigrationCommand(migration));
|
|
64
71
|
}
|
|
72
|
+
if (!id) {
|
|
73
|
+
throw new ImplementationException();
|
|
74
|
+
}
|
|
75
|
+
await db.commandBus.execute(new SaveSchemaCommand({
|
|
76
|
+
schema,
|
|
77
|
+
meta: {
|
|
78
|
+
id,
|
|
79
|
+
updatedAt: /* @__PURE__ */ new Date(),
|
|
80
|
+
version: sorted[sorted.length - 1].version,
|
|
81
|
+
checksum: calculateSchemaChecksum(schema)
|
|
82
|
+
}
|
|
83
|
+
}));
|
|
65
84
|
}
|
|
66
85
|
async executeContentMigration({ query, stages, version, ...ctx }) {
|
|
67
86
|
const queryStages = query.stage ? stages.filter((it) => it.slug === query.stage) : stages;
|
|
@@ -96,7 +115,7 @@ class ProjectMigrator {
|
|
|
96
115
|
throw new AlreadyExecutedMigrationError(migration.version, `Migration is already executed`);
|
|
97
116
|
}
|
|
98
117
|
}
|
|
99
|
-
if (migration.version < version && !ignoreOrder) {
|
|
118
|
+
if (version && migration.version < version && !ignoreOrder) {
|
|
100
119
|
throw new MustFollowLatestMigrationError(migration.version, `Must follow latest executed migration ${version}`);
|
|
101
120
|
}
|
|
102
121
|
if (migration.type === "schema") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectMigrator.js","sources":["../../../../../../packages/engine-system-api/src/model/migrations/ProjectMigrator.ts"],"sourcesContent":["import { calculateMigrationChecksum, Migration, MigrationDescriber, MigrationVersionHelper } from '@contember/schema-migrations'\nimport { Client, DatabaseMetadata, QueryError, wrapIdentifier } from '@contember/database'\nimport { Schema } from '@contember/schema'\nimport { SaveMigrationCommand } from '../commands'\nimport { Stage } from '../dtos'\nimport { DatabaseContext } from '../database'\nimport { ExecutedMigrationsResolver } from './ExecutedMigrationsResolver'\nimport { MigrateErrorCode } from '../../schema'\nimport { SchemaVersionBuilder } from './SchemaVersionBuilder'\nimport { SchemaValidator, SchemaValidatorSkippedErrors } from '@contember/schema-utils'\nimport { logger } from '@contember/logger'\nimport { MigrationsDatabaseMetadataResolverStoreFactory, SchemaDatabaseMetadataResolverStore } from '../metadata'\nimport { ContentMigrationQuery, MigrationInput } from './MigrationInput'\nimport { ContentQueryExecutor } from '../dependencies'\n\nexport class ProjectMigrator {\n\tconstructor(\n\t\tprivate readonly migrationDescriber: MigrationDescriber,\n\t\tprivate readonly schemaVersionBuilder: SchemaVersionBuilder,\n\t\tprivate readonly executedMigrationsResolver: ExecutedMigrationsResolver,\n\t\tprivate readonly migrationsDatabaseMetadataResolverStoreFactory: MigrationsDatabaseMetadataResolverStoreFactory,\n\t\tprivate readonly contentQueryExecutor: ContentQueryExecutor,\n\t) {}\n\n\tpublic async migrate({ db, project, identity, options: { ignoreOrder = false, skipExecuted = false }, migrationsToExecute, stages }: {\n\t\tdb: DatabaseContext\n\t\tproject: { slug: string; systemSchema: string }\n\t\tidentity: { id: string }\n\t\tstages: Stage[]\n\t\tmigrationsToExecute: readonly MigrationInput[]\n\t\toptions: {\n\t\t\tignoreOrder?: boolean\n\t\t\tskipExecuted?: boolean\n\t\t}\n\t}) {\n\t\tif (migrationsToExecute.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tlet { version, notNormalized, id, ...schema } = await this.schemaVersionBuilder.buildSchema(db)\n\t\tconst validated = await this.validateMigrations(db, schema, version, migrationsToExecute, { ignoreOrder, skipExecuted })\n\n\t\tconst sorted = [...validated].sort((a, b) => a.version.localeCompare(b.version))\n\n\t\tconst metadataStore = this.migrationsDatabaseMetadataResolverStoreFactory.create(db)\n\n\t\tfor (const migration of sorted) {\n\n\t\t\tif (migration.type === 'schema') {\n\t\t\t\tconst formatVersion = migration.formatVersion\n\n\t\t\t\tfor (const modification of migration.modifications) {\n\t\t\t\t\t[schema] = await this.applyModification(\n\t\t\t\t\t\tdb.client,\n\t\t\t\t\t\tstages,\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\tmodification,\n\t\t\t\t\t\tformatVersion,\n\t\t\t\t\t\tmigration.version,\n\t\t\t\t\t\tdb.client.schema,\n\t\t\t\t\t\tmetadataStore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else if (migration.type === 'content') {\n\t\t\t\tconst schemaWithId = {\n\t\t\t\t\t...schema,\n\t\t\t\t\tid,\n\t\t\t\t}\n\t\t\t\tfor (const query of migration.queries) {\n\t\t\t\t\tawait this.executeContentMigration({\n\t\t\t\t\t\tversion: migration.version,\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\tdb,\n\t\t\t\t\t\tschema: schemaWithId,\n\t\t\t\t\t\tstages,\n\t\t\t\t\t\tdatabaseMetadata: await metadataStore.getMetadata(db.client.schema),\n\t\t\t\t\t\tidentity,\n\t\t\t\t\t\tproject,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t// event log uses deferred constraint triggers, we need to fire them before ALTER\n\t\t\t\tawait db.client.query(`SET CONSTRAINTS ALL IMMEDIATE`)\n\t\t\t\tawait db.client.query(`SET CONSTRAINTS ALL DEFERRED`)\n\n\t\t\t}\n\t\t\tid = await db.commandBus.execute(new SaveMigrationCommand(migration))\n\t\t}\n\t}\n\n\tprivate async executeContentMigration({ query, stages, version, ...ctx }: {\n\t\tversion: string\n\t\tdb: DatabaseContext\n\t\tquery: ContentMigrationQuery\n\t\tstages: Stage[]\n\t\tschema: Schema & { id: number }\n\t\tproject: { slug: string; systemSchema: string }\n\t\tidentity: { id: string }\n\t\tdatabaseMetadata: DatabaseMetadata\n\t}) {\n\t\tconst queryStages = query.stage ? stages.filter(it => it.slug === query.stage) : stages\n\t\tfor (const stage of queryStages) {\n\t\t\tconst response = await this.contentQueryExecutor.execute({\n\t\t\t\tstage,\n\t\t\t\t...ctx,\n\t\t\t}, query)\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new FailedContentMigrationError(version, response.errors.join(', '))\n\t\t\t}\n\t\t\tif (query.checkMutationResult !== false) {\n\t\t\t\tfor (const [key, value] of Object.entries(response.result.data ?? {})) {\n\t\t\t\t\tif (typeof value === 'object' && value !== null && 'ok' in value && !value.ok) {\n\t\t\t\t\t\tconst errorDetails = 'errorMessage' in value ? value.errorMessage : 'No details available. Please fetch errorMessage field.'\n\t\t\t\t\t\tthrow new NotSuccessfulContentMigrationError(version, `Mutation ${key} failed: ${errorDetails}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async validateMigrations(\n\t\tdb: DatabaseContext,\n\t\tschema: Schema,\n\t\tversion: string,\n\t\tmigrationsToExecute: readonly MigrationInput[],\n\t\t{ ignoreOrder, skipExecuted }: {\n\t\t\tignoreOrder: boolean\n\t\t\tskipExecuted: boolean\n\t\t},\n\t): Promise<readonly MigrationInput[]> {\n\t\tconst executedMigrations = await this.executedMigrationsResolver.getMigrations(db)\n\t\tconst toExecute: MigrationInput[] = []\n\t\tlet skippedErrors: SchemaValidatorSkippedErrors[] = []\n\t\tfor (const migration of migrationsToExecute) {\n\t\t\tconst executedMigration = executedMigrations.find(it => it.version === migration.version)\n\t\t\tif (executedMigration) {\n\t\t\t\tif (skipExecuted && (migration.type !== 'schema' || executedMigration.checksum === calculateMigrationChecksum(migration))) {\n\t\t\t\t\tcontinue\n\t\t\t\t} else {\n\t\t\t\t\tthrow new AlreadyExecutedMigrationError(migration.version, `Migration is already executed`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (migration.version < version && !ignoreOrder) {\n\t\t\t\tthrow new MustFollowLatestMigrationError(migration.version, `Must follow latest executed migration ${version}`)\n\t\t\t}\n\t\t\tif (migration.type === 'schema') {\n\t\t\t\tconst described = this.migrationDescriber.describeModifications(schema, migration)\n\t\t\t\tif (described.length === 0) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst latestModification = described[described.length - 1]\n\t\t\t\tschema = latestModification.schema\n\t\t\t\tskippedErrors = [\n\t\t\t\t\t...skippedErrors.filter(it => it.skipUntil && MigrationVersionHelper.extractVersion(it.skipUntil) >= migration.version),\n\t\t\t\t\t...migration.skippedErrors ?? [],\n\t\t\t\t]\n\t\t\t\tconst errors = SchemaValidator.validate(schema, skippedErrors)\n\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\tthrow new InvalidSchemaError(\n\t\t\t\t\t\tmigration.version,\n\t\t\t\t\t\t'Migration generates invalid schema: \\n' +\n\t\t\t\t\t\terrors.map(it => `${it.path.join('.')}: [${it.code}] ${it.message}`).join('\\n'),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttoExecute.push(migration)\n\t\t}\n\t\t// intentionally not using skippedErrors here\n\t\tconst errors = SchemaValidator.validate(schema)\n\t\tif (errors.length > 0) {\n\t\t\tthrow new InvalidSchemaError(\n\t\t\t\ttoExecute[toExecute.length - 1].version,\n\t\t\t\t'Migration generates invalid schema: \\n' +\n\t\t\t\terrors.map(it => it.path.join('.') + ': ' + it.message).join('\\n'),\n\t\t\t)\n\t\t}\n\t\treturn toExecute\n\t}\n\n\tprivate async applyModification(\n\t\tdb: Client,\n\t\tstages: Stage[],\n\t\tschema: Schema,\n\t\tmodification: Migration.Modification,\n\t\tformatVersion: number,\n\t\tmigrationVersion: string,\n\t\tsystemSchema: string,\n\t\tmetadataStore: SchemaDatabaseMetadataResolverStore,\n\t): Promise<[Schema]> {\n\t\tconst {\n\t\t\tgetSql,\n\t\t\tschema: newSchema,\n\t\t} = this.migrationDescriber.describeModification(schema, modification, { formatVersion })\n\t\tfor (const stage of stages) {\n\t\t\tconst databaseMetadata = await metadataStore.getMetadata(stage.schema)\n\t\t\tconst sql = getSql({\n\t\t\t\tsystemSchema,\n\t\t\t\tdatabaseMetadata,\n\t\t\t\tinvalidateDatabaseMetadata: () => metadataStore.invalidate(stage.schema),\n\t\t\t})\n\t\t\tawait this.executeOnStage(db, stage, sql, migrationVersion)\n\t\t}\n\t\treturn [newSchema]\n\t}\n\n\tprivate async executeOnStage(db: Client, stage: Stage, sql: string, migrationVersion: string) {\n\t\tawait db.query('SET search_path TO ' + wrapIdentifier(stage.schema))\n\t\ttry {\n\t\t\tawait db.query(sql)\n\t\t} catch (e) {\n\t\t\tif (e instanceof QueryError) {\n\t\t\t\tlogger.error(e, { message: 'Migration failed' })\n\t\t\t\tthrow new MigrationFailedError(migrationVersion, e.message)\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\t}\n}\n\nexport abstract class MigrationError extends Error {\n\tpublic abstract code: MigrateErrorCode\n\n\tconstructor(public readonly version: string, public readonly migrationError: string) {\n\t\tsuper(`${version}: ${migrationError}`)\n\t}\n}\n\nexport class MustFollowLatestMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.MustFollowLatest\n}\n\nexport class AlreadyExecutedMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.AlreadyExecuted\n}\n\nexport class MigrationFailedError extends MigrationError {\n\tcode = MigrateErrorCode.MigrationFailed\n}\n\nexport class InvalidSchemaError extends MigrationError {\n\tcode = MigrateErrorCode.InvalidSchema\n}\n\nexport class FailedContentMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.ContentMigrationFailed\n}\n\nexport class NotSuccessfulContentMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.ContentMigrationNotSuccessful\n}\n"],"names":["errors"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProjectMigrator.js","sources":["../../../../../../packages/engine-system-api/src/model/migrations/ProjectMigrator.ts"],"sourcesContent":["import { calculateMigrationChecksum, Migration, MigrationDescriber, MigrationVersionHelper } from '@contember/schema-migrations'\nimport { Client, DatabaseMetadata, QueryError, wrapIdentifier } from '@contember/database'\nimport { Schema } from '@contember/schema'\nimport { SaveMigrationCommand } from '../commands'\nimport { Stage } from '../dtos'\nimport { DatabaseContext } from '../database'\nimport { ExecutedMigrationsResolver } from './ExecutedMigrationsResolver'\nimport { MigrateErrorCode } from '../../schema'\nimport { calculateSchemaChecksum, SchemaValidator, SchemaValidatorSkippedErrors } from '@contember/schema-utils'\nimport { logger } from '@contember/logger'\nimport { MigrationsDatabaseMetadataResolverStoreFactory, SchemaDatabaseMetadataResolverStore } from '../metadata'\nimport { ContentMigrationQuery, MigrationInput } from './MigrationInput'\nimport { ContentQueryExecutor } from '../dependencies'\nimport { SchemaProvider } from './SchemaProvider'\nimport { SaveSchemaCommand } from '../commands/schema/SaveSchemaCommand'\nimport { ImplementationException } from '../../utils'\n\nexport class ProjectMigrator {\n\tconstructor(\n\t\tprivate readonly migrationDescriber: MigrationDescriber,\n\t\tprivate readonly schemaProvider: SchemaProvider,\n\t\tprivate readonly executedMigrationsResolver: ExecutedMigrationsResolver,\n\t\tprivate readonly migrationsDatabaseMetadataResolverStoreFactory: MigrationsDatabaseMetadataResolverStoreFactory,\n\t\tprivate readonly contentQueryExecutor: ContentQueryExecutor,\n\t) {}\n\n\tpublic async migrate({ db, project, identity, options: { ignoreOrder = false, skipExecuted = false }, migrationsToExecute, stages }: {\n\t\tdb: DatabaseContext\n\t\tproject: { slug: string; systemSchema: string }\n\t\tidentity: { id: string }\n\t\tstages: Stage[]\n\t\tmigrationsToExecute: readonly MigrationInput[]\n\t\toptions: {\n\t\t\tignoreOrder?: boolean\n\t\t\tskipExecuted?: boolean\n\t\t}\n\t}) {\n\t\tif (migrationsToExecute.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tconst schemaWithMeta = await this.schemaProvider.fetch({ db })\n\t\tlet schema = schemaWithMeta.schema\n\t\tlet id = schemaWithMeta.meta.id\n\n\t\tconst validated = await this.validateMigrations(db, schema, schemaWithMeta.meta.version ?? null, migrationsToExecute, { ignoreOrder, skipExecuted })\n\t\tif (validated.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst sorted = [...validated].sort((a, b) => a.version.localeCompare(b.version))\n\n\t\tconst metadataStore = this.migrationsDatabaseMetadataResolverStoreFactory.create(db)\n\n\t\tfor (const migration of sorted) {\n\n\t\t\tif (migration.type === 'schema') {\n\t\t\t\tconst formatVersion = migration.formatVersion\n\n\t\t\t\tfor (const modification of migration.modifications) {\n\t\t\t\t\t[schema] = await this.applyModification(\n\t\t\t\t\t\tdb.client,\n\t\t\t\t\t\tstages,\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\tmodification,\n\t\t\t\t\t\tformatVersion,\n\t\t\t\t\t\tmigration.version,\n\t\t\t\t\t\tdb.client.schema,\n\t\t\t\t\t\tmetadataStore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else if (migration.type === 'content') {\n\t\t\t\tif (!id) {\n\t\t\t\t\tthrow new FailedContentMigrationError(migration.version, `Cannot execute content migration without schema`)\n\t\t\t\t}\n\t\t\t\tfor (const query of migration.queries) {\n\t\t\t\t\tawait this.executeContentMigration({\n\t\t\t\t\t\tversion: migration.version,\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\tdb,\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\tschemaMeta: { id },\n\t\t\t\t\t\tstages,\n\t\t\t\t\t\tdatabaseMetadata: await metadataStore.getMetadata(db.client.schema),\n\t\t\t\t\t\tidentity,\n\t\t\t\t\t\tproject,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t// event log uses deferred constraint triggers, we need to fire them before ALTER\n\t\t\t\tawait db.client.query(`SET CONSTRAINTS ALL IMMEDIATE`)\n\t\t\t\tawait db.client.query(`SET CONSTRAINTS ALL DEFERRED`)\n\n\t\t\t}\n\t\t\tid = await db.commandBus.execute(new SaveMigrationCommand(migration))\n\t\t}\n\t\tif (!id) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tawait db.commandBus.execute(new SaveSchemaCommand({\n\t\t\tschema,\n\t\t\tmeta: {\n\t\t\t\tid,\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\tversion: sorted[sorted.length - 1].version,\n\t\t\t\tchecksum: calculateSchemaChecksum(schema),\n\t\t\t},\n\t\t}))\n\t}\n\n\tprivate async executeContentMigration({ query, stages, version, ...ctx }: {\n\t\tversion: string\n\t\tdb: DatabaseContext\n\t\tquery: ContentMigrationQuery\n\t\tstages: Stage[]\n\t\tschema: Schema\n\t\tschemaMeta: { id: number }\n\t\tproject: { slug: string; systemSchema: string }\n\t\tidentity: { id: string }\n\t\tdatabaseMetadata: DatabaseMetadata\n\t}) {\n\t\tconst queryStages = query.stage ? stages.filter(it => it.slug === query.stage) : stages\n\t\tfor (const stage of queryStages) {\n\t\t\tconst response = await this.contentQueryExecutor.execute({\n\t\t\t\tstage,\n\t\t\t\t...ctx,\n\t\t\t}, query)\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new FailedContentMigrationError(version, response.errors.join(', '))\n\t\t\t}\n\t\t\tif (query.checkMutationResult !== false) {\n\t\t\t\tfor (const [key, value] of Object.entries(response.result.data ?? {})) {\n\t\t\t\t\tif (typeof value === 'object' && value !== null && 'ok' in value && !value.ok) {\n\t\t\t\t\t\tconst errorDetails = 'errorMessage' in value ? value.errorMessage : 'No details available. Please fetch errorMessage field.'\n\t\t\t\t\t\tthrow new NotSuccessfulContentMigrationError(version, `Mutation ${key} failed: ${errorDetails}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async validateMigrations(\n\t\tdb: DatabaseContext,\n\t\tschema: Schema,\n\t\tversion: string | null,\n\t\tmigrationsToExecute: readonly MigrationInput[],\n\t\t{ ignoreOrder, skipExecuted }: {\n\t\t\tignoreOrder: boolean\n\t\t\tskipExecuted: boolean\n\t\t},\n\t): Promise<readonly MigrationInput[]> {\n\t\tconst executedMigrations = await this.executedMigrationsResolver.getMigrations(db)\n\t\tconst toExecute: MigrationInput[] = []\n\t\tlet skippedErrors: SchemaValidatorSkippedErrors[] = []\n\t\tfor (const migration of migrationsToExecute) {\n\t\t\tconst executedMigration = executedMigrations.find(it => it.version === migration.version)\n\t\t\tif (executedMigration) {\n\t\t\t\tif (skipExecuted && (migration.type !== 'schema' || executedMigration.checksum === calculateMigrationChecksum(migration))) {\n\t\t\t\t\tcontinue\n\t\t\t\t} else {\n\t\t\t\t\tthrow new AlreadyExecutedMigrationError(migration.version, `Migration is already executed`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (version && migration.version < version && !ignoreOrder) {\n\t\t\t\tthrow new MustFollowLatestMigrationError(migration.version, `Must follow latest executed migration ${version}`)\n\t\t\t}\n\t\t\tif (migration.type === 'schema') {\n\t\t\t\tconst described = this.migrationDescriber.describeModifications(schema, migration)\n\t\t\t\tif (described.length === 0) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst latestModification = described[described.length - 1]\n\t\t\t\tschema = latestModification.schema\n\t\t\t\tskippedErrors = [\n\t\t\t\t\t...skippedErrors.filter(it => it.skipUntil && MigrationVersionHelper.extractVersion(it.skipUntil) >= migration.version),\n\t\t\t\t\t...migration.skippedErrors ?? [],\n\t\t\t\t]\n\t\t\t\tconst errors = SchemaValidator.validate(schema, skippedErrors)\n\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\tthrow new InvalidSchemaError(\n\t\t\t\t\t\tmigration.version,\n\t\t\t\t\t\t'Migration generates invalid schema: \\n' +\n\t\t\t\t\t\terrors.map(it => `${it.path.join('.')}: [${it.code}] ${it.message}`).join('\\n'),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttoExecute.push(migration)\n\t\t}\n\t\t// intentionally not using skippedErrors here\n\t\tconst errors = SchemaValidator.validate(schema)\n\t\tif (errors.length > 0) {\n\t\t\tthrow new InvalidSchemaError(\n\t\t\t\ttoExecute[toExecute.length - 1].version,\n\t\t\t\t'Migration generates invalid schema: \\n' +\n\t\t\t\terrors.map(it => it.path.join('.') + ': ' + it.message).join('\\n'),\n\t\t\t)\n\t\t}\n\t\treturn toExecute\n\t}\n\n\tprivate async applyModification(\n\t\tdb: Client,\n\t\tstages: Stage[],\n\t\tschema: Schema,\n\t\tmodification: Migration.Modification,\n\t\tformatVersion: number,\n\t\tmigrationVersion: string,\n\t\tsystemSchema: string,\n\t\tmetadataStore: SchemaDatabaseMetadataResolverStore,\n\t): Promise<[Schema]> {\n\t\tconst {\n\t\t\tgetSql,\n\t\t\tschema: newSchema,\n\t\t} = this.migrationDescriber.describeModification(schema, modification, { formatVersion })\n\t\tfor (const stage of stages) {\n\t\t\tconst databaseMetadata = await metadataStore.getMetadata(stage.schema)\n\t\t\tconst sql = getSql({\n\t\t\t\tsystemSchema,\n\t\t\t\tdatabaseMetadata,\n\t\t\t\tinvalidateDatabaseMetadata: () => metadataStore.invalidate(stage.schema),\n\t\t\t})\n\t\t\tawait this.executeOnStage(db, stage, sql, migrationVersion)\n\t\t}\n\t\treturn [newSchema]\n\t}\n\n\tprivate async executeOnStage(db: Client, stage: Stage, sql: string, migrationVersion: string) {\n\t\tawait db.query('SET search_path TO ' + wrapIdentifier(stage.schema))\n\t\ttry {\n\t\t\tawait db.query(sql)\n\t\t} catch (e) {\n\t\t\tif (e instanceof QueryError) {\n\t\t\t\tlogger.error(e, { message: 'Migration failed' })\n\t\t\t\tthrow new MigrationFailedError(migrationVersion, e.message)\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\t}\n}\n\nexport abstract class MigrationError extends Error {\n\tpublic abstract code: MigrateErrorCode\n\n\tconstructor(public readonly version: string, public readonly migrationError: string) {\n\t\tsuper(`${version}: ${migrationError}`)\n\t}\n}\n\nexport class MustFollowLatestMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.MustFollowLatest\n}\n\nexport class AlreadyExecutedMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.AlreadyExecuted\n}\n\nexport class MigrationFailedError extends MigrationError {\n\tcode = MigrateErrorCode.MigrationFailed\n}\n\nexport class InvalidSchemaError extends MigrationError {\n\tcode = MigrateErrorCode.InvalidSchema\n}\n\nexport class FailedContentMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.ContentMigrationFailed\n}\n\nexport class NotSuccessfulContentMigrationError extends MigrationError {\n\tcode = MigrateErrorCode.ContentMigrationNotSuccessful\n}\n"],"names":["errors"],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("@contember/database");
|
|
4
|
+
require("@contember/schema-migrations");
|
|
5
|
+
require("../../schema/dev.graphql.cjs");
|
|
6
|
+
require("../../schema/system.graphql.cjs");
|
|
7
|
+
const SchemaQuery = require("../queries/schema/SchemaQuery.cjs");
|
|
8
|
+
const schemaUtils = require("@contember/schema-utils");
|
|
9
|
+
const emptyVersionedSchema = {
|
|
10
|
+
schema: schemaUtils.emptySchema,
|
|
11
|
+
meta: {}
|
|
12
|
+
};
|
|
13
|
+
class SchemaProvider {
|
|
14
|
+
constructor(executedMigrationsResolver, schemaMigrator) {
|
|
15
|
+
this.executedMigrationsResolver = executedMigrationsResolver;
|
|
16
|
+
this.schemaMigrator = schemaMigrator;
|
|
17
|
+
}
|
|
18
|
+
async buildSchemaFromMigrations(db) {
|
|
19
|
+
const newMigrations = await this.executedMigrationsResolver.getMigrations(db);
|
|
20
|
+
const partialResult = newMigrations.reduce(
|
|
21
|
+
(schema, migration) => {
|
|
22
|
+
if (migration.type !== "schema") {
|
|
23
|
+
return schema;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
schema: this.schemaMigrator.applyModifications(schema.schema, migration.modifications, migration.formatVersion),
|
|
27
|
+
meta: {
|
|
28
|
+
version: migration.version,
|
|
29
|
+
id: migration.id,
|
|
30
|
+
updatedAt: migration.executedAt,
|
|
31
|
+
checksum: ""
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
emptyVersionedSchema
|
|
36
|
+
);
|
|
37
|
+
if (!partialResult.meta.version) {
|
|
38
|
+
return emptyVersionedSchema;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
schema: partialResult.schema,
|
|
42
|
+
meta: {
|
|
43
|
+
...partialResult.meta,
|
|
44
|
+
checksum: schemaUtils.calculateSchemaChecksum(partialResult.schema)
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async fetch({ db, currentSchema }) {
|
|
49
|
+
const newSchema = await db.queryHandler.fetch(new SchemaQuery.SchemaQuery(currentSchema?.meta.checksum));
|
|
50
|
+
if (!newSchema) {
|
|
51
|
+
return currentSchema ?? emptyVersionedSchema;
|
|
52
|
+
}
|
|
53
|
+
return newSchema;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.SchemaProvider = SchemaProvider;
|
|
57
|
+
exports.emptyVersionedSchema = emptyVersionedSchema;
|
|
58
|
+
//# sourceMappingURL=SchemaProvider.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaProvider.cjs","sources":["../../../../../../packages/engine-system-api/src/model/migrations/SchemaProvider.ts"],"sourcesContent":["import { SchemaQuery } from '../queries'\nimport { DatabaseContext } from '../database'\nimport { calculateSchemaChecksum, emptySchema, normalizeSchema } from '@contember/schema-utils'\nimport { ExecutedMigrationsResolver } from './ExecutedMigrationsResolver'\nimport { SchemaMigrator } from '@contember/schema-migrations'\nimport { Schema } from '@contember/schema'\n\nexport type SchemaMeta = {\n\tchecksum: string\n\tversion: string\n\tupdatedAt: Date\n\tid: number\n}\n\nexport const emptyVersionedSchema: SchemaWithMeta = {\n\tschema: emptySchema,\n\tmeta: {},\n}\n\nexport type SchemaWithMeta = {\n\tschema: Schema\n\tmeta: SchemaMeta | { [K in keyof SchemaMeta]?: undefined }\n}\n\nexport class SchemaProvider {\n\tconstructor(\n\t\tprivate readonly executedMigrationsResolver: ExecutedMigrationsResolver,\n\t\tprivate readonly schemaMigrator: SchemaMigrator,\n\t) {\n\t}\n\n\tasync buildSchemaFromMigrations(db: DatabaseContext): Promise<SchemaWithMeta> {\n\t\tconst newMigrations = (await this.executedMigrationsResolver.getMigrations(db))\n\n\t\tconst partialResult = newMigrations.reduce<SchemaWithMeta>(\n\t\t\t(schema, migration) => {\n\t\t\t\tif (migration.type !== 'schema') {\n\t\t\t\t\treturn schema\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tschema: this.schemaMigrator.applyModifications(schema.schema, migration.modifications, migration.formatVersion),\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tversion: migration.version,\n\t\t\t\t\t\tid: migration.id,\n\t\t\t\t\t\tupdatedAt: migration.executedAt,\n\t\t\t\t\t\tchecksum: '',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t},\n\t\t\temptyVersionedSchema,\n\t\t)\n\n\t\tif (!partialResult.meta.version) {\n\t\t\treturn emptyVersionedSchema\n\t\t}\n\n\t\treturn {\n\t\t\tschema: partialResult.schema,\n\t\t\tmeta: {\n\t\t\t\t...partialResult.meta,\n\t\t\t\tchecksum: calculateSchemaChecksum(partialResult.schema),\n\t\t\t},\n\t\t}\n\t}\n\n\tpublic async fetch({ db, currentSchema }: {\n\t\tdb: DatabaseContext\n\t\tcurrentSchema?: SchemaWithMeta | null\n\t}): Promise<SchemaWithMeta> {\n\t\tconst newSchema = await db.queryHandler.fetch(new SchemaQuery(currentSchema?.meta.checksum))\n\t\tif (!newSchema) {\n\t\t\treturn currentSchema ?? emptyVersionedSchema\n\t\t}\n\n\t\treturn newSchema\n\t}\n}\n"],"names":["emptySchema","calculateSchemaChecksum","SchemaQuery"],"mappings":";;;;;;;;AAcO,MAAM,uBAAuC;AAAA,EACnD,QAAQA,YAAA;AAAA,EACR,MAAM,CAAC;AACR;AAOO,MAAM,eAAe;AAAA,EAC3B,YACkB,4BACA,gBAChB;AAFgB,SAAA,6BAAA;AACA,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEA,MAAM,0BAA0B,IAA8C;AAC7E,UAAM,gBAAiB,MAAM,KAAK,2BAA2B,cAAc,EAAE;AAE7E,UAAM,gBAAgB,cAAc;AAAA,MACnC,CAAC,QAAQ,cAAc;AAClB,YAAA,UAAU,SAAS,UAAU;AACzB,iBAAA;AAAA,QACR;AACO,eAAA;AAAA,UACN,QAAQ,KAAK,eAAe,mBAAmB,OAAO,QAAQ,UAAU,eAAe,UAAU,aAAa;AAAA,UAC9G,MAAM;AAAA,YACL,SAAS,UAAU;AAAA,YACnB,IAAI,UAAU;AAAA,YACd,WAAW,UAAU;AAAA,YACrB,UAAU;AAAA,UACX;AAAA,QAAA;AAAA,MAEF;AAAA,MACA;AAAA,IAAA;AAGG,QAAA,CAAC,cAAc,KAAK,SAAS;AACzB,aAAA;AAAA,IACR;AAEO,WAAA;AAAA,MACN,QAAQ,cAAc;AAAA,MACtB,MAAM;AAAA,QACL,GAAG,cAAc;AAAA,QACjB,UAAUC,YAAAA,wBAAwB,cAAc,MAAM;AAAA,MACvD;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,MAAa,MAAM,EAAE,IAAI,iBAGG;AACrB,UAAA,YAAY,MAAM,GAAG,aAAa,MAAM,IAAIC,YAAY,YAAA,eAAe,KAAK,QAAQ,CAAC;AAC3F,QAAI,CAAC,WAAW;AACf,aAAO,iBAAiB;AAAA,IACzB;AAEO,WAAA;AAAA,EACR;AACD;;;"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import "@contember/database";
|
|
2
|
+
import "@contember/schema-migrations";
|
|
3
|
+
import "../../schema/dev.graphql.js";
|
|
4
|
+
import "../../schema/system.graphql.js";
|
|
5
|
+
import { SchemaQuery } from "../queries/schema/SchemaQuery.js";
|
|
6
|
+
import { calculateSchemaChecksum, emptySchema } from "@contember/schema-utils";
|
|
7
|
+
const emptyVersionedSchema = {
|
|
8
|
+
schema: emptySchema,
|
|
9
|
+
meta: {}
|
|
10
|
+
};
|
|
11
|
+
class SchemaProvider {
|
|
12
|
+
constructor(executedMigrationsResolver, schemaMigrator) {
|
|
13
|
+
this.executedMigrationsResolver = executedMigrationsResolver;
|
|
14
|
+
this.schemaMigrator = schemaMigrator;
|
|
15
|
+
}
|
|
16
|
+
async buildSchemaFromMigrations(db) {
|
|
17
|
+
const newMigrations = await this.executedMigrationsResolver.getMigrations(db);
|
|
18
|
+
const partialResult = newMigrations.reduce(
|
|
19
|
+
(schema, migration) => {
|
|
20
|
+
if (migration.type !== "schema") {
|
|
21
|
+
return schema;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
schema: this.schemaMigrator.applyModifications(schema.schema, migration.modifications, migration.formatVersion),
|
|
25
|
+
meta: {
|
|
26
|
+
version: migration.version,
|
|
27
|
+
id: migration.id,
|
|
28
|
+
updatedAt: migration.executedAt,
|
|
29
|
+
checksum: ""
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
emptyVersionedSchema
|
|
34
|
+
);
|
|
35
|
+
if (!partialResult.meta.version) {
|
|
36
|
+
return emptyVersionedSchema;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
schema: partialResult.schema,
|
|
40
|
+
meta: {
|
|
41
|
+
...partialResult.meta,
|
|
42
|
+
checksum: calculateSchemaChecksum(partialResult.schema)
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async fetch({ db, currentSchema }) {
|
|
47
|
+
const newSchema = await db.queryHandler.fetch(new SchemaQuery(currentSchema?.meta.checksum));
|
|
48
|
+
if (!newSchema) {
|
|
49
|
+
return currentSchema ?? emptyVersionedSchema;
|
|
50
|
+
}
|
|
51
|
+
return newSchema;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
SchemaProvider,
|
|
56
|
+
emptyVersionedSchema
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=SchemaProvider.js.map
|