From 2fb7390965c2a92010080bf76c26c348d564bba3 Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Thu, 17 Jul 2025 12:11:36 +0200 Subject: [PATCH] Workspace metadata migration v2 runner init file structure and services (#13242) # Introduction In this PR we initialize strictly typed services for both schema and metadata migration runner. Just scaffolding the file tree and services instances for incoming parallel development with @Weiko # Conclusion Nothing is immuable here ! ( and might change in the future ) main goal was to avoid upcoming conflicts and share same vision As always any suggestion are more than welcomed ! --- ...kspace-migration-builder-test-case.type.ts | 6 +- .../convert-action-type-to-camel-case.type.ts | 4 + .../workspace-migration-field-action-v2.ts | 3 + .../workspace-migration-index-action-v2.ts | 3 + .../workspace-migration-object-action-v2.ts | 3 + .../workspace-migration-builder-v2.module.ts | 2 +- .../types/runner-method-for-action-type.ts | 17 ++++ ...space-migration-action-runner-args.type.ts | 10 +++ .../workspace-migration-runner-args.type.ts | 8 ++ ...ce-metadata-field-action-runner.service.ts | 32 ++++++++ ...ce-metadata-index-action-runner.service.ts | 26 ++++++ ...space-metadata-migration-runner-service.ts | 81 +++++++++++++++++++ ...space-metadata-migration-runner.service.ts | 6 -- ...e-metadata-object-action-runner.service.ts | 32 ++++++++ .../workspace-migration-runner-v2.module.ts | 29 ++++++- .../workspace-migration-runner-v2.service.ts | 47 +++++++++++ ...pace-schema-field-action-runner.service.ts | 32 ++++++++ ...pace-schema-index-action-runner.service.ts | 26 ++++++ ...rkspace-schema-migration-runner.service.ts | 77 +++++++++++++++++- ...ace-schema-object-action-runner.service.ts | 32 ++++++++ .../workspace-migration-v2.module.ts | 2 +- 21 files changed, 461 insertions(+), 17 deletions(-) create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/convert-action-type-to-camel-case.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-runner-args.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-field-action-runner.service.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-index-action-runner.service.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner-service.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner.service.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-object-action-runner.service.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.service.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-field-action-runner.service.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-index-action-runner.service.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-object-action-runner.service.ts diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/types/workspace-migration-builder-test-case.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/types/workspace-migration-builder-test-case.type.ts index ef1e2ae03..36e9aa9d0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/types/workspace-migration-builder-test-case.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/__tests__/types/workspace-migration-builder-test-case.type.ts @@ -1,5 +1,6 @@ import { EachTestingContext } from 'twenty-shared/testing'; +import { ConvertActionTypeToCamelCase } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/convert-action-type-to-camel-case.type'; import { WorkspaceMigrationActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; import { WorkspaceMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.service'; @@ -7,11 +8,6 @@ type WorkspaceBuilderArgs = Parameters< typeof WorkspaceMigrationBuilderV2Service.prototype.build >[0]; -type ConvertActionTypeToCamelCase = - T extends `${infer Before}_${infer After}` - ? `${Before}${Capitalize}` - : T; - export type CamelCasedWorkspaceMigrationActionsType = ConvertActionTypeToCamelCase; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/convert-action-type-to-camel-case.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/convert-action-type-to-camel-case.type.ts new file mode 100644 index 000000000..7ad706bcd --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/convert-action-type-to-camel-case.type.ts @@ -0,0 +1,4 @@ +export type ConvertActionTypeToCamelCase = + T extends `${infer Before}_${infer After}` + ? `${Before}${Capitalize}` + : T; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2.ts index 136d72974..68c28e8e3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2.ts @@ -31,3 +31,6 @@ export type WorkspaceMigrationFieldActionV2 = | CreateFieldAction | UpdateFieldAction | DeleteFieldAction; + +export type WorkspaceMigrationFieldActionTypeV2 = + WorkspaceMigrationFieldActionV2['type']; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2.ts index d6992864e..46f89dff4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2.ts @@ -13,3 +13,6 @@ export type DeleteIndexAction = { export type WorkspaceMigrationIndexActionV2 = | CreateIndexAction | DeleteIndexAction; + +export type WorkspaceMigrationIndexActionTypeV2 = + WorkspaceMigrationIndexActionV2['type']; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2.ts index b3b29d23c..4f81a9c59 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2.ts @@ -29,3 +29,6 @@ export type WorkspaceMigrationObjectActionV2 = | CreateObjectAction | UpdateObjectAction | DeleteObjectAction; + +export type WorkspaceMigrationObjectActionTypeV2 = + WorkspaceMigrationObjectActionV2['type']; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts index 347a568dd..c98f4bf94 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts @@ -6,6 +6,6 @@ import { WorkspaceMigrationBuilderV2Service } from 'src/engine/workspace-manager @Module({ imports: [FeatureFlagModule], providers: [WorkspaceMigrationBuilderV2Service], - exports: [], + exports: [WorkspaceMigrationBuilderV2Service], }) export class WorkspaceMigrationBuilderV2Module {} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type.ts new file mode 100644 index 000000000..6c5477ab8 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type.ts @@ -0,0 +1,17 @@ +import { ConvertActionTypeToCamelCase } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/convert-action-type-to-camel-case.type'; +import { + WorkspaceMigrationActionTypeV2, + WorkspaceMigrationActionV2, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; + +export type RunnerMethodForActionType< + TAction extends WorkspaceMigrationActionTypeV2, + TRunner extends 'metadata' | 'schema', +> = { + [P in TAction as `run${Capitalize>}${Capitalize}Migration`]: ( + arg: WorkspaceMigrationActionRunnerArgs< + Extract + >, + ) => Promise; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type.ts new file mode 100644 index 000000000..9ac17a46a --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type.ts @@ -0,0 +1,10 @@ +import { QueryRunner } from 'typeorm'; + +import { WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; + +export type WorkspaceMigrationActionRunnerArgs< + T extends WorkspaceMigrationActionV2, +> = { + queryRunner: QueryRunner; + action: T; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-runner-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-runner-args.type.ts new file mode 100644 index 000000000..8b9ec58b1 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-runner-args.type.ts @@ -0,0 +1,8 @@ +import { QueryRunner } from 'typeorm'; + +import { WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2'; + +export type WorkspaceMigrationRunnerArgs = { + workspaceMigration: WorkspaceMigrationV2; + queryRunner: QueryRunner; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-field-action-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-field-action-runner.service.ts new file mode 100644 index 000000000..c38567b1d --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-field-action-runner.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@nestjs/common'; + +import { + CreateFieldAction, + DeleteFieldAction, + UpdateFieldAction, + WorkspaceMigrationFieldActionTypeV2, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2'; +import { RunnerMethodForActionType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; + +@Injectable() +export class WorkspaceMetadataFieldActionRunnerService + implements + RunnerMethodForActionType +{ + runDeleteFieldMetadataMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runCreateFieldMetadataMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runUpdateFieldMetadataMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-index-action-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-index-action-runner.service.ts new file mode 100644 index 000000000..42679dfcc --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-index-action-runner.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; + +import { + CreateIndexAction, + DeleteIndexAction, + WorkspaceMigrationIndexActionTypeV2, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2'; +import { RunnerMethodForActionType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; + +@Injectable() +export class WorkspaceMetadataIndexActionRunnerService + implements + RunnerMethodForActionType +{ + runDeleteIndexMetadataMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runCreateIndexMetadataMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner-service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner-service.ts new file mode 100644 index 000000000..4f8fab17a --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner-service.ts @@ -0,0 +1,81 @@ +import { Injectable } from '@nestjs/common'; + +import { assertUnreachable } from 'twenty-shared/utils'; + +import { WorkspaceMigrationRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-runner-args.type'; +import { WorkspaceMetadataFieldActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-field-action-runner.service'; +import { WorkspaceMetadataIndexActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-index-action-runner.service'; +import { WorkspaceMetadataObjectActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-object-action-runner.service'; + +@Injectable() +export class WorkspaceMetadataMigrationRunnerService { + constructor( + private readonly workspaceMetadataObjectMigrationRunnerService: WorkspaceMetadataObjectActionRunnerService, + private readonly workspaceMetadataIndexMigrationRunnerService: WorkspaceMetadataIndexActionRunnerService, + private readonly workspaceMetadataFieldMigrationRunnerService: WorkspaceMetadataFieldActionRunnerService, + ) {} + + runWorkspaceMetadataMigration = async ({ + workspaceMigration, + queryRunner, + }: WorkspaceMigrationRunnerArgs) => { + for (const action of workspaceMigration.actions) { + switch (action.type) { + case 'delete_object': { + await this.workspaceMetadataObjectMigrationRunnerService.runDeleteObjectMetadataMigration( + { action, queryRunner }, + ); + break; + } + case 'create_object': { + await this.workspaceMetadataObjectMigrationRunnerService.runCreateObjectMetadataMigration( + { action, queryRunner }, + ); + break; + } + case 'update_object': { + await this.workspaceMetadataObjectMigrationRunnerService.runUpdateObjectMetadataMigration( + { action, queryRunner }, + ); + break; + } + case 'create_field': { + await this.workspaceMetadataFieldMigrationRunnerService.runCreateFieldMetadataMigration( + { action, queryRunner }, + ); + break; + } + case 'update_field': { + await this.workspaceMetadataFieldMigrationRunnerService.runUpdateFieldMetadataMigration( + { action, queryRunner }, + ); + break; + } + case 'delete_field': { + await this.workspaceMetadataFieldMigrationRunnerService.runDeleteFieldMetadataMigration( + { action, queryRunner }, + ); + break; + } + case 'create_index': { + await this.workspaceMetadataIndexMigrationRunnerService.runCreateIndexMetadataMigration( + { action, queryRunner }, + ); + break; + } + case 'delete_index': { + await this.workspaceMetadataIndexMigrationRunnerService.runDeleteIndexMetadataMigration( + { action, queryRunner }, + ); + break; + } + default: { + assertUnreachable( + action, + 'Should never occur, encountered an unsupported workspace migration action type', + ); + } + } + } + }; +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner.service.ts deleted file mode 100644 index 415178a3c..000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner.service.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class WorkspaceMetadataMigrationRunnerService { - constructor() {} -} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-object-action-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-object-action-runner.service.ts new file mode 100644 index 000000000..e1ff88229 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-object-action-runner.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@nestjs/common'; + +import { + CreateObjectAction, + DeleteObjectAction, + UpdateObjectAction, + WorkspaceMigrationObjectActionTypeV2, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2'; +import { RunnerMethodForActionType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; + +@Injectable() +export class WorkspaceMetadataObjectActionRunnerService + implements + RunnerMethodForActionType +{ + runDeleteObjectMetadataMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runCreateObjectMetadataMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runUpdateObjectMetadataMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.module.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.module.ts index 8c392387b..681aafedc 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.module.ts @@ -1,15 +1,38 @@ import { Module } from '@nestjs/common'; +import { TypeORMModule } from 'src/database/typeorm/typeorm.module'; import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; -import { WorkspaceMetadataMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner.service'; +import { WorkspaceMetadataFieldActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-field-action-runner.service'; +import { WorkspaceMetadataIndexActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-index-action-runner.service'; +import { WorkspaceMetadataMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner-service'; +import { WorkspaceMetadataObjectActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-object-action-runner.service'; +import { WorkspaceMigrationRunnerV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.service'; +import { WorkspaceSchemaFieldActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-field-action-runner.service'; +import { WorkspaceSchemaIndexActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-index-action-runner.service'; import { WorkspaceSchemaMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-migration-runner.service'; +import { WorkspaceSchemaObjectActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-object-action-runner.service'; @Module({ - imports: [FeatureFlagModule], + imports: [FeatureFlagModule, TypeORMModule], providers: [ + WorkspaceMetadataObjectActionRunnerService, + WorkspaceMetadataIndexActionRunnerService, + WorkspaceMetadataFieldActionRunnerService, + WorkspaceSchemaObjectActionRunnerService, + WorkspaceSchemaIndexActionRunnerService, + WorkspaceSchemaFieldActionRunnerService, WorkspaceMetadataMigrationRunnerService, WorkspaceSchemaMigrationRunnerService, + WorkspaceMigrationRunnerV2Service, + ], + exports: [ + WorkspaceMigrationRunnerV2Service, + WorkspaceMetadataObjectActionRunnerService, + WorkspaceMetadataIndexActionRunnerService, + WorkspaceMetadataFieldActionRunnerService, + WorkspaceSchemaObjectActionRunnerService, + WorkspaceSchemaIndexActionRunnerService, + WorkspaceSchemaFieldActionRunnerService, ], - exports: [], }) export class WorkspaceMigrationRunnerV2Module {} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.service.ts new file mode 100644 index 000000000..ce89cfb66 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@nestjs/common'; +import { InjectDataSource } from '@nestjs/typeorm'; + +import { DataSource } from 'typeorm'; + +import { WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2'; +import { WorkspaceMetadataMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-metadata-migration-runner/workspace-metadata-migration-runner-service'; +import { WorkspaceSchemaMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-migration-runner.service'; + +@Injectable() +export class WorkspaceMigrationRunnerV2Service { + constructor( + private readonly workspaceMetadataMigrationRunner: WorkspaceMetadataMigrationRunnerService, + private readonly workspaceSchemaMigrationRunner: WorkspaceSchemaMigrationRunnerService, + @InjectDataSource('core') + private readonly coreDataSource: DataSource, + ) {} + + run = async (workspaceMigration: WorkspaceMigrationV2) => { + const queryRunner = this.coreDataSource.createQueryRunner(); + + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + await Promise.all([ + this.workspaceMetadataMigrationRunner.runWorkspaceMetadataMigration({ + queryRunner, + workspaceMigration, + }), + this.workspaceSchemaMigrationRunner.runWorkspaceSchemaMigration({ + queryRunner, + workspaceMigration, + }), + ]); + + await queryRunner.commitTransaction(); + } catch (error) { + if (queryRunner.isTransactionActive) { + await queryRunner.rollbackTransaction(); + } + + throw error; + } finally { + await queryRunner.release(); + } + }; +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-field-action-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-field-action-runner.service.ts new file mode 100644 index 000000000..510a89130 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-field-action-runner.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@nestjs/common'; + +import { + CreateFieldAction, + DeleteFieldAction, + UpdateFieldAction, + WorkspaceMigrationFieldActionTypeV2, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2'; +import { RunnerMethodForActionType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; + +@Injectable() +export class WorkspaceSchemaFieldActionRunnerService + implements + RunnerMethodForActionType +{ + runDeleteFieldSchemaMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runCreateFieldSchemaMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runUpdateFieldSchemaMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-index-action-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-index-action-runner.service.ts new file mode 100644 index 000000000..6d4d89a81 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-index-action-runner.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; + +import { + CreateIndexAction, + DeleteIndexAction, + WorkspaceMigrationIndexActionTypeV2, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2'; +import { RunnerMethodForActionType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; + +@Injectable() +export class WorkspaceSchemaIndexActionRunnerService + implements + RunnerMethodForActionType +{ + runDeleteIndexSchemaMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runCreateIndexSchemaMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-migration-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-migration-runner.service.ts index 25455968e..61901a006 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-migration-runner.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-migration-runner.service.ts @@ -1,6 +1,81 @@ import { Injectable } from '@nestjs/common'; +import { assertUnreachable } from 'twenty-shared/utils'; + +import { WorkspaceMigrationRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-runner-args.type'; +import { WorkspaceSchemaFieldActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-field-action-runner.service'; +import { WorkspaceSchemaIndexActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-index-action-runner.service'; +import { WorkspaceSchemaObjectActionRunnerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-object-action-runner.service'; + @Injectable() export class WorkspaceSchemaMigrationRunnerService { - constructor() {} + constructor( + private readonly workspaceSchemaObjectMigrationRunnerService: WorkspaceSchemaObjectActionRunnerService, + private readonly workspaceSchemaIndexMigrationRunnerService: WorkspaceSchemaIndexActionRunnerService, + private readonly workspaceSchemaFieldMigrationRunnerService: WorkspaceSchemaFieldActionRunnerService, + ) {} + + runWorkspaceSchemaMigration = async ({ + workspaceMigration, + queryRunner, + }: WorkspaceMigrationRunnerArgs) => { + for (const action of workspaceMigration.actions) { + switch (action.type) { + case 'delete_object': { + await this.workspaceSchemaObjectMigrationRunnerService.runDeleteObjectSchemaMigration( + { action, queryRunner }, + ); + break; + } + case 'create_object': { + await this.workspaceSchemaObjectMigrationRunnerService.runCreateObjectSchemaMigration( + { action, queryRunner }, + ); + break; + } + case 'update_object': { + await this.workspaceSchemaObjectMigrationRunnerService.runUpdateObjectSchemaMigration( + { action, queryRunner }, + ); + break; + } + case 'create_field': { + await this.workspaceSchemaFieldMigrationRunnerService.runCreateFieldSchemaMigration( + { action, queryRunner }, + ); + break; + } + case 'update_field': { + await this.workspaceSchemaFieldMigrationRunnerService.runUpdateFieldSchemaMigration( + { action, queryRunner }, + ); + break; + } + case 'delete_field': { + await this.workspaceSchemaFieldMigrationRunnerService.runDeleteFieldSchemaMigration( + { action, queryRunner }, + ); + break; + } + case 'create_index': { + await this.workspaceSchemaIndexMigrationRunnerService.runCreateIndexSchemaMigration( + { action, queryRunner }, + ); + break; + } + case 'delete_index': { + await this.workspaceSchemaIndexMigrationRunnerService.runDeleteIndexSchemaMigration( + { action, queryRunner }, + ); + break; + } + default: { + assertUnreachable( + action, + 'Should never occur, encountered an unsupported workspace migration action type', + ); + } + } + } + }; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-object-action-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-object-action-runner.service.ts new file mode 100644 index 000000000..7a6c8a280 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-schema-migration-runner/workspace-schema-object-action-runner.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@nestjs/common'; + +import { + CreateObjectAction, + DeleteObjectAction, + UpdateObjectAction, + WorkspaceMigrationObjectActionTypeV2, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2'; +import { RunnerMethodForActionType } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/runner-method-for-action-type'; +import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; + +@Injectable() +export class WorkspaceSchemaObjectActionRunnerService + implements + RunnerMethodForActionType +{ + runDeleteObjectSchemaMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runCreateObjectSchemaMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; + runUpdateObjectSchemaMigration = async ( + _action: WorkspaceMigrationActionRunnerArgs, + ) => { + return; + }; +} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module.ts index 06bb092ca..6f3b4770c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module.ts @@ -9,6 +9,6 @@ import { WorkspaceMigrationRunnerV2Module } from 'src/engine/workspace-manager/w WorkspaceMigrationRunnerV2Module, ], providers: [], - exports: [], + exports: [WorkspaceMigrationRunnerV2Module], }) export class WorkspaceMigrationV2Module {}