From bd9688421f2cfb9ebf2fd619b8d4d821687b55bf Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Mon, 2 Feb 2026 13:22:38 +0100 Subject: [PATCH] `ObjectMetadata` and `FieldMetadata` agnostic workspace migration runner (#17572) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Introduction Important note: This PR officially deprecates the `standardId`, about to drop col and entity property after this has been merged Important note2: Haven't updated the optimistic tool to also update the universal identifier aggregators only the ids one, they should not be consumed in the runner context -> need to improve typing or either the optimistic tooling In this PR we're introducing all the devxp allowing future metadata incremental universal migration -> this has an impact on all existing metadata actions handler ( explaining its size ) This PR also introduce workspace agnostic create update actions runner for both field and object metadata in order to battle test the described above devxp Noting that these two metadata are the most complex to handle Notes: - A workspace migration is now highly bind to a `applicationUniversalIdentifier`. Though we don't strictly validate application scope for the moment ## Next Migrate both object and field builder to universal comparison ## Universal Actions vs Flat Actions Architecture ### Concept The migration system uses a two-phase action model: 1. **Universal Actions** - Actions defined using `universalIdentifier` (stable, portable identifiers like `standardId` + `applicationId`) 2. **Flat Actions** - Actions defined using database `entityId` (UUIDs specific to a workspace) ### Why This Separation? - **Universal actions are portable**: They can be serialized, stored, and replayed across different workspaces - **Flat actions are executable**: They contain the actual database IDs needed to perform operations - **Decoupling**: The builder produces universal actions; the runner transpiles them to flat actions at execution time ### Transpiler Pattern Each action handler must implement `transpileUniversalActionToFlatAction()`: ```typescript @Injectable() export class CreateFieldActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'create', 'fieldMetadata', ) { override async transpileUniversalActionToFlatAction( context: WorkspaceMigrationActionRunnerArgs, ): Promise { // Resolve universal identifiers to database IDs const flatObjectMetadata = findFlatEntityByUniversalIdentifierOrThrow({ flatEntityMaps: allFlatEntityMaps.flatObjectMetadataMaps, universalIdentifier: action.objectMetadataUniversalIdentifier, }); return { type: action.type, metadataName: action.metadataName, objectMetadataId: flatObjectMetadata.id, // Resolved ID flatFieldMetadatas: /* ... transpiled entities ... */, }; } } ``` ### Action Handler Base Class `BaseWorkspaceMigrationRunnerActionHandlerService` provides: - **`transpileUniversalActionToFlatAction()`** - Abstract method each handler must implement - **`transpileUniversalDeleteActionToFlatDeleteAction()`** - Shared helper for delete actions ## FlatEntityMaps custom properties Introduced a `TWithCustomMapsProperties` generic parameter to control whether custom indexing structures are included: - **`false` (default)**: Returns `FlatEntityMaps>` - used in builder/runner contexts - **`true`**: Returns the full maps type with custom properties (e.g., `byUserWorkspaceIdAndFolderId`) - used in cache contexts ## Create Field Actions Refactor Refactored create-field actions to support relation field pairs bundling. **Problem:** Relation fields (e.g., `Attachment.targetTask` ↔ `Task.attachments`) couldn't resolve each other's IDs during transpilation because they were in separate actions with independent `fieldIdByUniversalIdentifier` maps. **Solution:** - Removed `objectMetadataUniversalIdentifier` from `UniversalCreateFieldAction` and `objectMetadataId` from `FlatCreateFieldAction` - each field now carries its own - Runner groups fields by object internally and processes each table separately - Split aggregator into two focused utilities: - `aggregateNonRelationFieldsIntoObjectActions` - merges non-relation fields into object actions - `aggregateRelationFieldPairs` - bundles relation pairs with shared `fieldIdByUniversalIdentifier` --- .cursor/rules/creating-syncable-entity.mdc | 4 +- ...ty-standard-workspace-migration.command.ts | 113 ---- .../commands/database-command.module.ts | 2 - .../1-15-backfill-updated-by-field.command.ts | 4 +- ...-backfill-standard-page-layouts.command.ts | 2 + .../1-16-identify-field-metadata.command.ts | 7 +- .../1-16-identify-object-metadata.command.ts | 7 +- ...16-update-task-on-delete-action.command.ts | 9 + .../resolvers/application.resolver.ts | 9 + .../services/application-sync.service.ts | 84 +-- .../ai/ai-agent/agent.service.ts | 20 + .../command-menu-item.service.ts | 16 + .../services/field-metadata.service.ts | 82 +-- ...is-field-metadata-settings-of-type.util.ts | 21 + ...y-or-all-flat-entity-maps-cache.service.ts | 3 +- ...ntity-by-metadata-engine-name.test-type.ts | 29 +- .../types/all-flat-entity-maps.type.ts | 20 +- .../all-flat-entity-types-by-metadata-name.ts | 540 ++++++++++++------ .../types/flat-entity-from.type.ts | 12 +- .../types/metadata-flat-entity-maps.type.ts | 10 +- ...etadata-workspace-migration-action.type.ts | 37 +- ...y-by-universal-identifier-or-throw.util.ts | 14 +- ...lat-entity-by-universal-identifier.util.ts | 11 +- ...e-and-related-flat-field-to-update.util.ts | 4 +- ...-to-flat-field-metadatas-to-create.util.ts | 2 + ...d-metadata-from-create-field-input.util.ts | 2 +- .../is-composite-flat-field-metadata.util.ts | 6 + .../utils/is-enum-flat-field-metadata.util.ts | 6 + ...ph-or-relation-flat-field-metadata.util.ts | 8 + .../utils/sanitize-raw-update-field-input.ts | 4 +- ...tion-menu-item-from-maps-and-index.util.ts | 22 - ...flat-navigation-menu-item-or-throw.util.ts | 4 +- ...at-navigation-menu-item-from-index.util.ts | 51 -- ...menu-item-in-maps-and-update-index.util.ts | 91 --- ...metadata-and-related-flat-entities.util.ts | 6 +- .../utils/sanitize-raw-update-object-input.ts | 6 +- .../entities/front-component.entity.ts | 5 +- .../front-component.service.ts | 16 + .../services/logic-function.service.ts | 50 +- ...ction-input-to-flat-logic-function.util.ts | 17 +- .../navigation-menu-item.service.ts | 16 + .../navigation-menu-item-deletion.service.ts | 9 + .../object-metadata.service.ts | 57 +- ...-field-metadatas-for-custom-object.util.ts | 16 +- .../services/page-layout-tab.service.ts | 16 + .../services/page-layout-widget.service.ts | 7 + .../page-layout-duplication.service.ts | 2 + .../services/page-layout-update.service.ts | 2 + .../services/page-layout.service.ts | 23 + .../services/role-target.service.ts | 11 + .../metadata-modules/role/role.resolver.ts | 2 +- .../metadata-modules/role/role.service.ts | 50 +- .../row-level-permission-predicate.service.ts | 7 + .../metadata-modules/skill/skill.service.ts | 30 + .../belongs-to-twenty-standard-app.util.ts | 10 + .../utils/is-standard-metadata.util.ts | 10 - .../services/view-field-v2.service.ts | 29 + .../services/view-filter-group.service.ts | 29 + .../services/view-filter.service.ts | 29 + .../view-group/services/view-group.service.ts | 29 + .../view/services/view.service.ts | 29 + .../webhook/webhook.service.ts | 16 + .../utils/compute-object-target-table.util.ts | 7 +- .../types/workspace-cache-key.type.ts | 5 +- .../dev-seeder-permissions.service.ts | 12 +- .../twenty-standard-application.service.ts | 4 + ...reate-standard-field-flat-metadata.util.ts | 6 +- ...ndard-relation-field-flat-metadata.util.ts | 2 +- .../workspace-manager.service.ts | 2 +- ...ce-migration-runner-exception-formatter.ts | 8 + ...ce-migration-build-orchestrator.service.ts | 2 + ...igration-validate-build-and-run-service.ts | 6 + ...e-orchestrator-actions-report-args.type.ts | 5 +- .../workspace-migration-orchestrator.type.ts | 7 +- .../contains-serialized-relation.type-test.ts | 146 ----- .../contains-serialized-relation.type.ts | 24 - .../types/universal-flat-entity-from.type.ts | 9 +- .../universal-flat-object-metadata.type.ts | 12 + ...pdated-matrix-dispatcher.util.spec.ts.snap | 2 + ...on-fields-into-object-actions.util.spec.ts | 278 +++++++++ ...ject-and-create-field-actions.util.spec.ts | 491 ---------------- ...h-vector-update-field-actions.util.spec.ts | 22 +- ...ggregate-relation-field-pairs.util.spec.ts | 282 +++++++++ ...elation-fields-into-object-actions.util.ts | 106 ++++ ...te-object-and-create-field-actions.util.ts | 189 ------ ...search-vector-update-field-actions.util.ts | 17 +- ...regate-orchestrator-actions-report.util.ts | 6 +- .../aggregate-relation-field-pairs.util.ts | 84 +++ ...-created-updated-matrix-dispatcher.util.ts | 3 + ...-workspace-migration-action-record.util.ts | 4 +- ...e-field-id-by-universal-identifier.util.ts | 15 + ...-migration-agent-action-builder.service.ts | 19 +- ...migration-agent-actions-builder.service.ts | 4 +- ...migration-command-menu-item-action.type.ts | 22 +- ...mmand-menu-item-actions-builder.service.ts | 4 +- .../types/workspace-migration-field-action.ts | 40 +- ...migration-field-actions-builder.service.ts | 19 +- ...e-migration-front-component-action.type.ts | 22 +- ...front-component-actions-builder.service.ts | 4 +- .../types/workspace-migration-index-action.ts | 16 +- ...ce-migration-logic-function-action.type.ts | 22 +- ...-logic-function-actions-builder.service.ts | 4 +- ...ration-navigation-menu-item-action.type.ts | 22 +- ...ation-menu-item-actions-builder.service.ts | 4 +- .../workspace-migration-object-action.ts | 37 +- ...igration-object-actions-builder.service.ts | 11 +- ...e-migration-page-layout-tab-action.type.ts | 22 +- ...page-layout-tab-actions-builder.service.ts | 4 +- ...igration-page-layout-widget-action.type.ts | 22 +- ...e-layout-widget-actions-builder.service.ts | 4 +- ...space-migration-page-layout-action.type.ts | 22 +- ...ion-page-layout-actions-builder.service.ts | 4 +- ...space-migration-role-target-action.type.ts | 22 +- ...ion-role-target-actions-builder.service.ts | 4 +- .../workspace-migration-role-action.type.ts | 19 +- ...-migration-role-actions-builder.service.ts | 4 +- ...-permission-predicate-group-action.type.ts | 22 +- ...predicate-group-actions-builder.service.ts | 4 +- ...-level-permission-predicate-action.type.ts | 22 +- ...ssion-predicate-actions-builder.service.ts | 4 +- .../workspace-migration-skill-action.type.ts | 19 +- ...migration-skill-actions-builder.service.ts | 4 +- ...kspace-migration-view-field-action.type.ts | 22 +- ...tion-view-field-actions-builder.service.ts | 4 +- ...migration-view-filter-group-action.type.ts | 22 +- ...ew-filter-group-actions-builder.service.ts | 4 +- ...space-migration-view-filter-action.type.ts | 22 +- ...ion-view-filter-actions-builder.service.ts | 4 +- ...kspace-migration-view-group-action.type.ts | 22 +- ...tion-view-group-actions-builder.service.ts | 4 +- .../workspace-migration-view-action.type.ts | 19 +- ...-migration-view-actions-builder.service.ts | 4 +- ...workspace-migration-webhook-action.type.ts | 19 +- ...gration-webhook-actions-builder.service.ts | 4 +- ...kspace-entity-migration-builder.service.ts | 1 + ...create-workspace-migration-action.type.ts} | 11 +- ...-delete-workspace-migration-action.type.ts | 10 + ...-update-workspace-migration-action.type.ts | 12 + ...-create-workspace-migration-action.type.ts | 16 + ...delete-workspace-migration-action.type.ts} | 4 +- ...update-workspace-migration-action.type.ts} | 6 +- ...flat-entity-update-validation-args.type.ts | 1 + .../flat-entity-validation-result.type.ts | 9 +- ...ful-flat-entity-validate-and-build.type.ts | 4 +- .../workspace-migration-action-common.ts | 17 +- .../types/workspace-migration.ts | 6 +- .../services/flat-agent-validator.service.ts | 24 +- .../flat-field-metadata-validator.service.ts | 4 +- ...-navigation-menu-item-validator.service.ts | 4 +- .../flat-object-metadata-validator.service.ts | 4 +- .../services/flat-skill-validator.service.ts | 26 +- .../create-agent-action-handler.service.ts | 21 +- .../delete-agent-action-handler.service.ts | 33 +- .../update-agent-action-handler.service.ts | 21 +- ...ommand-menu-item-action-handler.service.ts | 21 +- ...ommand-menu-item-action-handler.service.ts | 33 +- ...ommand-menu-item-action-handler.service.ts | 21 +- .../create-field-action-handler.service.ts | 257 ++++++--- .../delete-field-action-handler.service.ts | 56 +- .../update-field-action-handler.service.ts | 67 ++- ...etadata-id-in-create-field-context.util.ts | 27 + ...ld-metadata-to-flat-field-metadata.util.ts | 147 +++++ ...gs-to-flat-field-metadata-settings.util.ts | 68 +++ ...-front-component-action-handler.service.ts | 21 +- ...-front-component-action-handler.service.ts | 33 +- ...-front-component-action-handler.service.ts | 21 +- .../create-index-action-handler.service.ts | 25 +- .../delete-index-action-handler.service.ts | 46 +- .../update-index-action-handler.service.ts | 27 +- .../index/utils/index-action-handler.utils.ts | 11 +- ...e-logic-function-action-handler.service.ts | 24 +- ...e-logic-function-action-handler.service.ts | 33 +- ...e-logic-function-action-handler.service.ts | 23 +- ...gation-menu-item-action-handler.service.ts | 21 +- ...gation-menu-item-action-handler.service.ts | 33 +- ...gation-menu-item-action-handler.service.ts | 21 +- .../create-object-action-handler.service.ts | 112 +++- .../delete-object-action-handler.service.ts | 54 +- .../update-object-action-handler.service.ts | 61 +- ...t-metadata-to-flat-object-metadata.util.ts | 123 ++++ ...-page-layout-tab-action-handler.service.ts | 21 +- ...-page-layout-tab-action-handler.service.ts | 33 +- ...-page-layout-tab-action-handler.service.ts | 21 +- ...ge-layout-widget-action-handler.service.ts | 21 +- ...ge-layout-widget-action-handler.service.ts | 33 +- ...ge-layout-widget-action-handler.service.ts | 21 +- ...eate-page-layout-action-handler.service.ts | 21 +- ...lete-page-layout-action-handler.service.ts | 36 +- ...date-page-layout-action-handler.service.ts | 21 +- ...eate-role-target-action-handler.service.ts | 21 +- ...lete-role-target-action-handler.service.ts | 33 +- ...date-role-target-action-handler.service.ts | 24 +- .../create-role-action-handler.service.ts | 21 +- .../delete-role-action-handler.service.ts | 33 +- .../update-role-action-handler.service.ts | 23 +- ...-predicate-group-action-handler.service.ts | 21 +- ...-predicate-group-action-handler.service.ts | 35 +- ...-predicate-group-action-handler.service.ts | 24 +- ...ission-predicate-action-handler.service.ts | 21 +- ...ission-predicate-action-handler.service.ts | 34 +- ...ission-predicate-action-handler.service.ts | 24 +- .../create-skill-action-handler.service.ts | 21 +- .../delete-skill-action-handler.service.ts | 33 +- .../update-skill-action-handler.service.ts | 21 +- ...reate-view-field-action-handler.service.ts | 21 +- ...elete-view-field-action-handler.service.ts | 33 +- ...pdate-view-field-action-handler.service.ts | 24 +- ...iew-filter-group-action-handler.service.ts | 21 +- ...iew-filter-group-action-handler.service.ts | 33 +- ...iew-filter-group-action-handler.service.ts | 24 +- ...eate-view-filter-action-handler.service.ts | 21 +- ...lete-view-filter-action-handler.service.ts | 33 +- ...date-view-filter-action-handler.service.ts | 24 +- ...reate-view-group-action-handler.service.ts | 21 +- ...elete-view-group-action-handler.service.ts | 33 +- ...pdate-view-group-action-handler.service.ts | 24 +- .../create-view-action-handler.service.ts | 21 +- .../delete-view-action-handler.service.ts | 33 +- .../update-view-action-handler.service.ts | 23 +- .../create-webhook-action-handler.service.ts | 21 +- .../delete-webhook-action-handler.service.ts | 33 +- .../update-webhook-action-handler.service.ts | 21 +- .../workspace-migration-runner.exception.ts | 21 +- ...runner-action-handler-service.interface.ts | 112 +++- ...-runner-action-handler-registry.service.ts | 12 +- .../workspace-migration-runner.service.ts | 37 +- ...space-migration-action-runner-args.type.ts | 19 +- .../generate-column-definitions.util.spec.ts | 45 +- .../utils/generate-column-definitions.util.ts | 34 +- ...space-schema-context-for-migration.util.ts | 10 +- ...ate-action-on-all-flat-entity-maps.util.ts | 37 +- ...ete-action-on-all-flat-entity-maps.util.ts | 43 +- ...ate-action-on-all-flat-entity-maps.util.ts | 51 +- ...ected-account-delete-one.pre-query.hook.ts | 4 +- ...stall-application.integration-spec.ts.snap | 6 +- 235 files changed, 4536 insertions(+), 2739 deletions(-) delete mode 100644 packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/delete-flat-navigation-menu-item-from-maps-and-index.util.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/remove-flat-navigation-menu-item-from-index.util.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/replace-flat-navigation-menu-item-in-maps-and-update-index.util.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/utils/is-standard-metadata.util.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/contains-serialized-relation.type-test.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/contains-serialized-relation.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-non-relation-fields-into-object-actions.util.spec.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.spec.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-relation-field-pairs.util.spec.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-non-relation-fields-into-object-actions.util.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-relation-field-pairs.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/merge-field-id-by-universal-identifier.util.ts rename packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/{base-create-workspace-migration-action.type.ts => base-flat-create-workspace-migration-action.type.ts} (63%) create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type.ts rename packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/{base-delete-workspace-migration-action.type.ts => base-universal-delete-workspace-migration-action.type.ts} (79%) rename packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/{base-update-workspace-migration-action.type.ts => base-universal-update-workspace-migration-action.type.ts} (80%) create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/find-field-metadata-id-in-create-field-context.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-settings-to-flat-field-metadata-settings.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/utils/from-universal-flat-object-metadata-to-flat-object-metadata.util.ts diff --git a/.cursor/rules/creating-syncable-entity.mdc b/.cursor/rules/creating-syncable-entity.mdc index eb24e519b5..f56bf8d112 100644 --- a/.cursor/rules/creating-syncable-entity.mdc +++ b/.cursor/rules/creating-syncable-entity.mdc @@ -672,7 +672,7 @@ import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; import { MyEntityExceptionCode } from 'src/engine/metadata-modules/my-entity/my-entity.exception'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; @@ -740,7 +740,7 @@ export class FlatMyEntityValidatorService { } // Prevent deletion of standard entities unless it's a system build - if (!buildOptions.isSystemBuild && isStandardMetadata(existingEntity)) { + if (!buildOptions.isSystemBuild && belongsToTwentyStandardApp(existingEntity)) { validationResult.errors.push({ code: MyEntityExceptionCode.MY_ENTITY_IS_STANDARD, message: t`Cannot delete standard entity`, diff --git a/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts b/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts deleted file mode 100644 index 284341069c..0000000000 --- a/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Logger } from '@nestjs/common'; - -import { writeFileSync } from 'fs'; - -import { Command, CommandRunner } from 'nest-commander'; -import { WorkspaceMigrationV2ExceptionCode } from 'twenty-shared/metadata'; - -import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; -import { AdditionalCacheDataMaps } from 'src/engine/workspace-cache/types/workspace-cache-key.type'; -import { computeTwentyStandardApplicationAllFlatEntityMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant'; -import { WorkspaceMigrationV2Exception } from 'src/engine/workspace-manager/workspace-migration.exception'; -import { WorkspaceMigrationBuildOrchestratorService } from 'src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service'; - -@Command({ - name: 'workspace:compute-twenty-standard-migration', - description: 'Compute Twenty standard workspace migration.', -}) -export class ComputeTwentyStandardWorkspaceMigrationCommand extends CommandRunner { - private readonly logger = new Logger( - ComputeTwentyStandardWorkspaceMigrationCommand.name, - ); - - constructor( - private readonly workspaceMigrationBuildOrchestratorService: WorkspaceMigrationBuildOrchestratorService, - ) { - super(); - } - - async run(): Promise { - this.logger.log('Starting compute Twenty standard workspace migration...'); - - // TODO: Implement migration logic here - const workspaceId = '20202020-ef6f-4118-953c-2b027324b54a'; - const twentyStandardApplicationId = '20202020-5adb-4091-81b7-d5be86a8bdd2'; - const twentyStandardAllFlatEntityMaps = - computeTwentyStandardApplicationAllFlatEntityMaps({ - now: new Date().toISOString(), - workspaceId, - twentyStandardApplicationId, - }); - - writeFileSync( - `${Date.now()}-all-flat-entity-maps.json`, - JSON.stringify(twentyStandardAllFlatEntityMaps, null, 2), - ); - - const validateAndBuildResult = - await this.workspaceMigrationBuildOrchestratorService - .buildWorkspaceMigration({ - buildOptions: { - isSystemBuild: true, - }, - fromToAllFlatEntityMaps: { - flatObjectMetadataMaps: { - from: createEmptyFlatEntityMaps(), - to: twentyStandardAllFlatEntityMaps.flatObjectMetadataMaps, - }, - flatFieldMetadataMaps: { - from: createEmptyFlatEntityMaps(), - to: twentyStandardAllFlatEntityMaps.flatFieldMetadataMaps, - }, - flatIndexMaps: { - from: createEmptyFlatEntityMaps(), - to: twentyStandardAllFlatEntityMaps.flatIndexMaps, - }, - flatViewFieldMaps: { - from: createEmptyFlatEntityMaps(), - to: twentyStandardAllFlatEntityMaps.flatViewFieldMaps, - }, - flatViewFilterMaps: { - from: createEmptyFlatEntityMaps(), - to: twentyStandardAllFlatEntityMaps.flatViewFilterMaps, - }, - flatViewGroupMaps: { - from: createEmptyFlatEntityMaps(), - to: twentyStandardAllFlatEntityMaps.flatViewGroupMaps, - }, - flatViewMaps: { - from: createEmptyFlatEntityMaps(), - to: twentyStandardAllFlatEntityMaps.flatViewMaps, - }, - flatAgentMaps: { - from: createEmptyFlatEntityMaps(), - to: twentyStandardAllFlatEntityMaps.flatAgentMaps, - }, - flatRoleMaps: { - from: createEmptyFlatEntityMaps(), - to: twentyStandardAllFlatEntityMaps.flatRoleMaps, - }, - }, - additionalCacheDataMaps: { - featureFlagsMap: {} as AdditionalCacheDataMaps['featureFlagsMap'], - }, - workspaceId, - }) - .catch((error) => { - this.logger.error(error); - throw new WorkspaceMigrationV2Exception( - WorkspaceMigrationV2ExceptionCode.BUILDER_INTERNAL_SERVER_ERROR, - error.message, - ); - }); - - writeFileSync( - `${Date.now()}validate-and-build-result.json`, - JSON.stringify(validateAndBuildResult, null, 2), - ); - - this.logger.log( - 'Compute Twenty standard workspace migration completed successfully.', - ); - } -} diff --git a/packages/twenty-server/src/database/commands/database-command.module.ts b/packages/twenty-server/src/database/commands/database-command.module.ts index 919b8b0cb2..4a4a72866f 100644 --- a/packages/twenty-server/src/database/commands/database-command.module.ts +++ b/packages/twenty-server/src/database/commands/database-command.module.ts @@ -1,7 +1,6 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { ComputeTwentyStandardWorkspaceMigrationCommand } from 'src/database/commands/compute-twenty-standard-workspace-migration.command'; import { CronRegisterAllCommand } from 'src/database/commands/cron-register-all.command'; import { DataSeedWorkspaceCommand } from 'src/database/commands/data-seed-dev-workspace.command'; import { ListOrphanedWorkspaceEntitiesCommand } from 'src/database/commands/list-and-delete-orphaned-workspace-entities.command'; @@ -55,7 +54,6 @@ import { AutomatedTriggerModule } from 'src/modules/workflow/workflow-trigger/au PublicDomainModule, ], providers: [ - ComputeTwentyStandardWorkspaceMigrationCommand, DataSeedWorkspaceCommand, ConfirmationQuestion, CronRegisterAllCommand, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-15/1-15-backfill-updated-by-field.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-15/1-15-backfill-updated-by-field.command.ts index 09df6efca2..ffc74199ae 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-15/1-15-backfill-updated-by-field.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-15/1-15-backfill-updated-by-field.command.ts @@ -16,7 +16,7 @@ import { DataSourceService } from 'src/engine/metadata-modules/data-source/data- import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/services/field-metadata.service'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; import { @@ -100,7 +100,7 @@ export class BackfillUpdatedByFieldCommand extends ActiveOrSuspendedWorkspacesMi const createFieldInputs: CreateFieldInput[] = []; for (const flatObjectMetadata of objectMetadataList) { - const isStandardObject = isStandardMetadata(flatObjectMetadata); + const isStandardObject = belongsToTwentyStandardApp(flatObjectMetadata); const updatedByStandardId = !isStandardObject ? CUSTOM_OBJECT_STANDARD_FIELD_IDS.updatedBy : isDefined(flatObjectMetadata.standardId) diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-backfill-standard-page-layouts.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-backfill-standard-page-layouts.command.ts index 1216914418..62bf8c367d 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-backfill-standard-page-layouts.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-backfill-standard-page-layouts.command.ts @@ -161,6 +161,8 @@ export class BackfillStandardPageLayoutsCommand extends ActiveOrSuspendedWorkspa dependencyAllFlatEntityMaps: { flatObjectMetadataMaps, }, + applicationUniversalIdentifier: + twentyStandardFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-identify-field-metadata.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-identify-field-metadata.command.ts index 14b77dc1ed..3b87a6e909 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-identify-field-metadata.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-identify-field-metadata.command.ts @@ -16,7 +16,6 @@ import { DataSourceService } from 'src/engine/metadata-modules/data-source/data- import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; import { getMetadataRelatedMetadataNames } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-related-metadata-names.util'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; import { STANDARD_OBJECTS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-object.constant'; @@ -106,9 +105,11 @@ export class IdentifyFieldMetadataCommand extends WorkspacesMigrationCommandRunn const exceptions: FieldMetadataException[] = []; for (const fieldMetadataEntity of allFieldMetadataEntities) { - const isStandardMetadataResult = isStandardMetadata(fieldMetadataEntity); + const shouldBelongToTwentyStandardApp = + !fieldMetadataEntity.isCustom && + isDefined(fieldMetadataEntity.standardId); - if (!isStandardMetadataResult) { + if (!shouldBelongToTwentyStandardApp) { customFieldMetadataEntities.push({ fieldMetadataEntity, fromStandard: false, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-identify-object-metadata.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-identify-object-metadata.command.ts index 72d44bcba2..2f2502e29b 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-identify-object-metadata.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-identify-object-metadata.command.ts @@ -16,7 +16,6 @@ import { DataSourceService } from 'src/engine/metadata-modules/data-source/data- import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; import { getMetadataRelatedMetadataNames } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-related-metadata-names.util'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; import { STANDARD_OBJECTS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-object.constant'; @@ -101,9 +100,11 @@ export class IdentifyObjectMetadataCommand extends WorkspacesMigrationCommandRun const exceptions: ObjectMetadataException[] = []; for (const objectMetadataEntity of allObjectMetadataEntities) { - const isStandardMetadataResult = isStandardMetadata(objectMetadataEntity); + const shouldBelongToTwentyStandardApp = + !objectMetadataEntity.isCustom && + isDefined(objectMetadataEntity.standardId); - if (!isStandardMetadataResult) { + if (!shouldBelongToTwentyStandardApp) { customObjectMetadataEntities.push({ objectMetadataEntity, fromStandard: false, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-update-task-on-delete-action.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-update-task-on-delete-action.command.ts index ec18c511dd..f372ef515f 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-update-task-on-delete-action.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-16/1-16-update-task-on-delete-action.command.ts @@ -13,6 +13,7 @@ import { IsNull, Repository } from 'typeorm'; import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; +import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; @@ -36,6 +37,7 @@ export class UpdateTaskOnDeleteActionCommand extends ActiveOrSuspendedWorkspaces protected readonly dataSourceService: DataSourceService, private readonly workspaceCacheService: WorkspaceCacheService, private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService, + private readonly applicationService: ApplicationService, ) { super(workspaceRepository, globalWorkspaceOrmManager, dataSourceService); } @@ -177,6 +179,11 @@ export class UpdateTaskOnDeleteActionCommand extends ActiveOrSuspendedWorkspaces ); try { + const { twentyStandardFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { @@ -189,6 +196,8 @@ export class UpdateTaskOnDeleteActionCommand extends ActiveOrSuspendedWorkspaces }, workspaceId, isSystemBuild: true, + applicationUniversalIdentifier: + twentyStandardFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/core-modules/application/resolvers/application.resolver.ts b/packages/twenty-server/src/engine/core-modules/application/resolvers/application.resolver.ts index df1812892f..9409dba799 100644 --- a/packages/twenty-server/src/engine/core-modules/application/resolvers/application.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/application/resolvers/application.resolver.ts @@ -114,9 +114,18 @@ export class ApplicationResolver { ); } + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + await this.workspaceMigrationRunnerService.run({ actions, workspaceId, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }); return true; diff --git a/packages/twenty-server/src/engine/core-modules/application/services/application-sync.service.ts b/packages/twenty-server/src/engine/core-modules/application/services/application-sync.service.ts index f21dd130ac..d7d37b6c6f 100644 --- a/packages/twenty-server/src/engine/core-modules/application/services/application-sync.service.ts +++ b/packages/twenty-server/src/engine/core-modules/application/services/application-sync.service.ts @@ -21,6 +21,7 @@ import { } from 'src/engine/core-modules/application/application.exception'; import { ApplicationInput } from 'src/engine/core-modules/application/dtos/application.input'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; +import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { ApplicationVariableEntityService } from 'src/engine/core-modules/applicationVariable/application-variable.service'; import { LogicFunctionLayerService } from 'src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; @@ -74,23 +75,25 @@ export class ApplicationSyncService { yarnLock, }); + const ownerFlatApplication: FlatApplication = application; + await this.syncObjects({ objectsToSync: manifest.objects, workspaceId, - applicationId: application.id, + ownerFlatApplication, }); await this.syncObjectRelations({ objectsToSync: manifest.objects, workspaceId, - applicationId: application.id, + ownerFlatApplication, }); if (manifest.fields.length > 0) { await this.syncFieldsOrThrow({ fieldsToSync: manifest.fields, workspaceId, - applicationId: application.id, + ownerFlatApplication, }); } @@ -106,7 +109,7 @@ export class ApplicationSyncService { logicFunctionsToSync: manifest.logicFunctions, code: manifest.sources, workspaceId, - applicationId: application.id, + ownerFlatApplication, logicFunctionLayerId: application.logicFunctionLayerId, }); } @@ -114,7 +117,7 @@ export class ApplicationSyncService { await this.syncRoles({ manifest, workspaceId, - applicationId: application.id, + ownerFlatApplication, }); this.logger.log('✅ Application sync from manifest completed'); @@ -190,11 +193,11 @@ export class ApplicationSyncService { private async syncRoles({ manifest, workspaceId, - applicationId, + ownerFlatApplication, }: { manifest: Manifest; workspaceId: string; - applicationId: string; + ownerFlatApplication: FlatApplication; }) { let defaultRoleId: string | null = null; @@ -211,12 +214,13 @@ export class ApplicationSyncService { update: role, }, workspaceId, + ownerFlatApplication, }); } else { existingRole = await this.roleService.createRole({ input: role, workspaceId, - applicationId, + ownerFlatApplication, }); } @@ -235,7 +239,7 @@ export class ApplicationSyncService { } if (isDefined(defaultRoleId)) { - await this.applicationService.update(applicationId, { + await this.applicationService.update(ownerFlatApplication.id, { defaultRoleId: defaultRoleId, }); } @@ -348,11 +352,11 @@ export class ApplicationSyncService { objectId, fieldsToSync, workspaceId, - applicationId, + ownerFlatApplication, }: { objectId: string; workspaceId: string; - applicationId: string; + ownerFlatApplication: FlatApplication; fieldsToSync: ObjectFieldManifest[]; }) { const fieldsWithoutRelation = fieldsToSync.filter( @@ -414,10 +418,12 @@ export class ApplicationSyncService { isActive: false, }, workspaceId, + ownerFlatApplication, }); await this.fieldMetadataService.deleteOneField({ deleteOneFieldInput: { id: fieldToDelete.id }, workspaceId, + ownerFlatApplication, }); } @@ -448,6 +454,7 @@ export class ApplicationSyncService { await this.fieldMetadataService.updateOneField({ updateFieldInput, workspaceId, + ownerFlatApplication, }); } @@ -465,7 +472,7 @@ export class ApplicationSyncService { objectMetadataId: objectId, universalIdentifier: fieldToCreate.universalIdentifier, standardId: fieldToCreate.universalIdentifier, - applicationId, + applicationId: ownerFlatApplication.id, isCustom: true, workspaceId, }; @@ -473,7 +480,7 @@ export class ApplicationSyncService { await this.fieldMetadataService.createOneField({ createFieldInput, workspaceId, - applicationId, + ownerFlatApplication, }); } } @@ -482,13 +489,13 @@ export class ApplicationSyncService { objectId, fieldsToSync, workspaceId, - applicationId, + ownerFlatApplication, flatObjectMetadataMaps, }: { objectId: string; fieldsToSync: ObjectFieldManifest[]; workspaceId: string; - applicationId: string; + ownerFlatApplication: FlatApplication; flatObjectMetadataMaps: { idByUniversalIdentifier: Partial>; }; @@ -539,7 +546,7 @@ export class ApplicationSyncService { objectMetadataId: objectId, universalIdentifier: relation.universalIdentifier, standardId: relation.universalIdentifier, - applicationId, + applicationId: ownerFlatApplication.id, isCustom: true, workspaceId, relationCreationPayload: { @@ -553,7 +560,7 @@ export class ApplicationSyncService { await this.fieldMetadataService.createOneField({ createFieldInput, workspaceId, - applicationId, + ownerFlatApplication, }); } } @@ -561,11 +568,11 @@ export class ApplicationSyncService { private async syncObjects({ objectsToSync, workspaceId, - applicationId, + ownerFlatApplication, }: { objectsToSync: ObjectManifest[]; workspaceId: string; - applicationId: string; + ownerFlatApplication: FlatApplication; }) { const { flatObjectMetadataMaps: existingFlatObjectMetadataMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( @@ -578,7 +585,7 @@ export class ApplicationSyncService { const applicationObjects = Object.values( existingFlatObjectMetadataMaps.byId, ).filter( - (obj) => isDefined(obj) && obj.applicationId === applicationId, + (obj) => isDefined(obj) && obj.applicationId === ownerFlatApplication.id, // TODO handle when migrating to trinite usage // eslint-disable-next-line @typescript-eslint/no-explicit-any ) as any[]; @@ -615,6 +622,7 @@ export class ApplicationSyncService { deleteObjectInput: { id: objectToDelete.id }, workspaceId, isSystemBuild: true, + ownerFlatApplication, }); } @@ -645,13 +653,14 @@ export class ApplicationSyncService { await this.objectMetadataService.updateOneObject({ updateObjectInput, workspaceId, + ownerFlatApplication, }); await this.syncObjectFieldsWithoutRelations({ fieldsToSync: objectToSync.fields, objectId: objectToUpdate.id, workspaceId, - applicationId, + ownerFlatApplication, }); } @@ -671,12 +680,12 @@ export class ApplicationSyncService { standardId: objectToCreate.universalIdentifier, dataSourceId: dataSourceMetadata.id, universalIdentifier: objectToCreate.universalIdentifier, - applicationId, + applicationId: ownerFlatApplication.id, }; const createdObject = await this.objectMetadataService.createOneObject({ createObjectInput, - applicationId, + ownerFlatApplication, workspaceId, }); @@ -684,7 +693,7 @@ export class ApplicationSyncService { fieldsToSync: objectToCreate.fields, objectId: createdObject.id, workspaceId, - applicationId, + ownerFlatApplication, }); } } @@ -692,11 +701,11 @@ export class ApplicationSyncService { private async syncObjectRelations({ objectsToSync, workspaceId, - applicationId, + ownerFlatApplication, }: { objectsToSync: ObjectManifest[]; workspaceId: string; - applicationId: string; + ownerFlatApplication: FlatApplication; }) { const { flatObjectMetadataMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( @@ -723,7 +732,7 @@ export class ApplicationSyncService { objectId: sourceObjectId, fieldsToSync: objectToSync.fields, workspaceId, - applicationId, + ownerFlatApplication, flatObjectMetadataMaps, }); } @@ -732,11 +741,11 @@ export class ApplicationSyncService { private async syncFieldsOrThrow({ fieldsToSync, workspaceId, - applicationId, + ownerFlatApplication, }: { fieldsToSync: FieldManifest[]; workspaceId: string; - applicationId: string; + ownerFlatApplication: FlatApplication; }) { const { flatObjectMetadataMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( @@ -763,14 +772,14 @@ export class ApplicationSyncService { objectId: targetObjectId, fieldsToSync: [fieldToSync], workspaceId, - applicationId, + ownerFlatApplication, }); await this.syncObjectFieldsRelationOnly({ objectId: targetObjectId, fieldsToSync: [fieldToSync], workspaceId, - applicationId, + ownerFlatApplication, flatObjectMetadataMaps, }); } @@ -780,13 +789,13 @@ export class ApplicationSyncService { logicFunctionsToSync, code, workspaceId, - applicationId, + ownerFlatApplication, logicFunctionLayerId, }: { logicFunctionsToSync: LogicFunctionManifest[]; workspaceId: string; code: Sources; - applicationId: string; + ownerFlatApplication: FlatApplication; logicFunctionLayerId: string; }) { const { flatLogicFunctionMaps } = @@ -802,7 +811,7 @@ export class ApplicationSyncService { ).filter( (logicFunction) => isDefined(logicFunction) && - logicFunction.applicationId === applicationId, + logicFunction.applicationId === ownerFlatApplication.id, ) as FlatLogicFunction[]; const logicFunctionsToSyncUniversalIdentifiers = logicFunctionsToSync.map( @@ -841,8 +850,8 @@ export class ApplicationSyncService { await this.logicFunctionService.destroyOne({ id: logicFunctionToDelete.id, workspaceId, - applicationId, isSystemBuild: true, + ownerFlatApplication, }); } @@ -876,7 +885,7 @@ export class ApplicationSyncService { isTool: logicFunctionToSync.isTool, }, workspaceId, - applicationId, + ownerFlatApplication, }); // Trigger settings are now embedded in the logic function entity @@ -902,7 +911,7 @@ export class ApplicationSyncService { isTool: logicFunctionToCreate.isTool, }, workspaceId, - applicationId, + ownerFlatApplication, }); } } @@ -986,6 +995,7 @@ export class ApplicationSyncService { }, workspaceId, isSystemBuild: true, + applicationUniversalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/agent.service.ts b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/agent.service.ts index c9323fa3eb..9a39ec2342 100644 --- a/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/agent.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/ai/ai-agent/agent.service.ts @@ -142,6 +142,8 @@ export class AgentService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -175,6 +177,13 @@ export class AgentService { input: UpdateAgentInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatRoleTargetByAgentIdMaps, flatAgentMaps } = await this.workspaceCacheService.getOrRecompute(workspaceId, [ 'flatRoleTargetByAgentIdMaps', @@ -215,6 +224,8 @@ export class AgentService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -281,6 +292,13 @@ export class AgentService { return []; } + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatAgentMaps, flatRoleTargetByAgentIdMaps } = await this.workspaceCacheService.getOrRecompute(workspaceId, [ 'flatAgentMaps', @@ -321,6 +339,8 @@ export class AgentService { }, workspaceId, isSystemBuild, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/command-menu-item/command-menu-item.service.ts b/packages/twenty-server/src/engine/metadata-modules/command-menu-item/command-menu-item.service.ts index 728250df20..7e5fa5008a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/command-menu-item/command-menu-item.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/command-menu-item/command-menu-item.service.ts @@ -112,6 +112,8 @@ export class CommandMenuItemService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -142,6 +144,11 @@ export class CommandMenuItemService { input: UpdateCommandMenuItemInput, workspaceId: string, ): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatCommandMenuItemMaps: existingFlatCommandMenuItemMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -168,6 +175,8 @@ export class CommandMenuItemService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -195,6 +204,11 @@ export class CommandMenuItemService { } async delete(id: string, workspaceId: string): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatCommandMenuItemMaps: existingFlatCommandMenuItemMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -221,6 +235,8 @@ export class CommandMenuItemService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts index e7daa00cfc..d5aaa354b3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service.ts @@ -6,6 +6,7 @@ import { isDefined } from 'twenty-shared/utils'; import { type FindOneOptions, type Repository } from 'typeorm'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; +import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; import { type DeleteOneFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/delete-field.input'; import { type UpdateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/update-field.input'; @@ -43,20 +44,16 @@ export class FieldMetadataService extends TypeOrmQueryService; workspaceId: string; - /** - * @deprecated do not use call validateBuildAndRunWorkspaceMigration contextually - * when interacting with another application than workspace custom one - * */ - applicationId?: string; + ownerFlatApplication?: FlatApplication; }): Promise { const [createdFieldMetadata] = await this.createManyFields({ workspaceId, createFieldInputs: [createFieldInput], - applicationId, + ownerFlatApplication, }); if (!isDefined(createdFieldMetadata)) { @@ -73,11 +70,21 @@ export class FieldMetadataService extends TypeOrmQueryService { + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; + const { flatObjectMetadataMaps: existingFlatObjectMetadataMaps, flatIndexMaps: existingFlatIndexMaps, @@ -121,6 +128,8 @@ export class FieldMetadataService extends TypeOrmQueryService; workspaceId: string; isSystemBuild?: boolean; + ownerFlatApplication?: FlatApplication; }): Promise { + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; + const { flatObjectMetadataMaps: existingFlatObjectMetadataMaps, flatIndexMaps: existingFlatIndexMaps, @@ -166,13 +185,6 @@ export class FieldMetadataService extends TypeOrmQueryService[]; workspaceId: string; - /** - * @deprecated do not use call validateBuildAndRunWorkspaceMigration contextually - * when interacting with another application than workspace custom one - * */ - applicationId?: string; + ownerFlatApplication?: FlatApplication; isSystemBuild?: boolean; }): Promise { if (createFieldInputs.length === 0) { return []; } - const { workspaceCustomFlatApplication } = - await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( - { - workspaceId, - }, - ); + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; const { flatObjectMetadataMaps: existingFlatObjectMetadataMaps, flatFieldMetadataMaps: existingFlatFieldMetadataMaps, - flatApplicationMaps, } = await this.workspaceCacheService.getOrRecompute(workspaceId, [ 'flatObjectMetadataMaps', 'flatFieldMetadataMaps', - 'flatApplicationMaps', ]); - const ownerFlatApplication = isDefined(applicationId) - ? flatApplicationMaps.byId[applicationId] - : workspaceCustomFlatApplication; - - if (!isDefined(ownerFlatApplication)) { - throw new FieldMetadataException( - `Could not find related application ${applicationId}`, - FieldMetadataExceptionCode.APPLICATION_NOT_FOUND, - ); - } - const allTranspiledTranspilationInputs: Awaited< ReturnType >[] = []; @@ -343,7 +341,7 @@ export class FieldMetadataService extends TypeOrmQueryService( @@ -23,3 +25,22 @@ export const isFieldMetadataSettingsOfType = < return true; }; + +export const isUniversalFieldMetadataSettingsOftype = < + T extends keyof FieldMetadataSettingsMapping, +>( + settings: UniversalFlatFieldMetadata['universalSettings'], + fieldMetadataType: T, +): settings is UniversalFlatFieldMetadata['universalSettings'] => { + // Settings don't have a discriminator - the type is determined by fieldMetadataType + // For required settings types (RELATION, MORPH_RELATION, FILES), ensure settings is defined + if ( + fieldMetadataType === FieldMetadataType.RELATION || + fieldMetadataType === FieldMetadataType.MORPH_RELATION || + fieldMetadataType === FieldMetadataType.FILES + ) { + return isDefined(settings); + } + + return true; +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service.ts index f131480461..594da97878 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service.ts @@ -10,13 +10,14 @@ export class WorkspaceManyOrAllFlatEntityMapsCacheService { public async getOrRecomputeManyOrAllFlatEntityMaps< T extends (keyof AllFlatEntityMaps)[] = (keyof AllFlatEntityMaps)[], + TWithCustomMapsProperties extends boolean = true, >({ flatMapsKeys, workspaceId, }: { workspaceId: string; flatMapsKeys?: T; - }): Promise> { + }): Promise, T[number]>> { return await this.workspaceCacheService.getOrRecompute( workspaceId, flatMapsKeys ?? ALL_FLAT_ENTITY_MAPS_PROPERTIES, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/all-flat-entity-by-metadata-engine-name.test-type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/all-flat-entity-by-metadata-engine-name.test-type.ts index ba1939dafb..946d006a91 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/all-flat-entity-by-metadata-engine-name.test-type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/__tests__/all-flat-entity-by-metadata-engine-name.test-type.ts @@ -1,20 +1,25 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type Expect } from 'twenty-shared/testing'; +import { type Equal, type Expect } from 'twenty-shared/testing'; import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type'; import { type WorkspaceMigrationActionType } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; +import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; -import { type WorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; type ExpectedGenericFlatEntityInformation = { - actions: { - [P in WorkspaceMigrationActionType]: - | WorkspaceMigrationAction - | WorkspaceMigrationAction[]; + universalActions: { + [P in WorkspaceMigrationActionType]: unknown; + }; + flatActions: { + [P in WorkspaceMigrationActionType]: unknown; }; flatEntity: SyncableFlatEntity; universalFlatEntity: UniversalSyncableFlatEntity; + entity: unknown; }; type ExpectedGenericAllFlatEntityInformationByMetadataEngine = { @@ -38,4 +43,16 @@ type Assertions = [ ? true : false >, + Expect< + Equal< + BaseUniversalCreateWorkspaceMigrationAction<'objectMetadata'>['flatEntity'], + UniversalFlatObjectMetadata + > + >, + Expect< + Equal< + BaseFlatCreateWorkspaceMigrationAction<'view'>['flatEntity'], + FlatView + > + >, ]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type.ts index 1b431209e0..4f6776a37c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type.ts @@ -1,13 +1,13 @@ -import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; -import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; -import { type FlatNavigationMenuItemMaps } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item-maps.type'; +import { type AllMetadataName } from 'twenty-shared/metadata'; -export type AllFlatEntityMaps = { - [P in keyof AllFlatEntityTypesByMetadataName as MetadataToFlatEntityMapsKey

]: FlatEntityMaps< - MetadataFlatEntity

+import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; +import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; + +export type AllFlatEntityMaps< + TWithCustomMapsProperties extends boolean = false, +> = { + [P in AllMetadataName as MetadataToFlatEntityMapsKey

]: MetadataFlatEntityMaps< + P, + TWithCustomMapsProperties >; -} & { - flatNavigationMenuItemMaps: FlatNavigationMenuItemMaps; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts index d9cb9d0c7a..c446a9b23a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name.ts @@ -1,166 +1,216 @@ import { type AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity'; import { type CommandMenuItemEntity } from 'src/engine/metadata-modules/command-menu-item/entities/command-menu-item.entity'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { type FlatAgentMaps } from 'src/engine/metadata-modules/flat-agent/types/flat-agent-maps.type'; import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type'; +import { type FlatCommandMenuItemMaps } from 'src/engine/metadata-modules/flat-command-menu-item/types/flat-command-menu-item-maps.type'; import { type FlatCommandMenuItem } from 'src/engine/metadata-modules/flat-command-menu-item/types/flat-command-menu-item.type'; +import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type MetadataEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-entity.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type FlatFrontComponentMaps } from 'src/engine/metadata-modules/flat-front-component/types/flat-front-component-maps.type'; import { type FlatFrontComponent } from 'src/engine/metadata-modules/flat-front-component/types/flat-front-component.type'; import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; +import { type FlatNavigationMenuItemMaps } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item-maps.type'; import { type FlatNavigationMenuItem } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item.type'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type'; import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type'; +import { type FlatPageLayoutWidgetMaps } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type'; import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type'; +import { type FlatPageLayoutMaps } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout-maps.type'; import { type FlatPageLayout } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type'; +import { type FlatRoleTargetMaps } from 'src/engine/metadata-modules/flat-role-target/types/flat-role-target-maps.type'; import { type FlatRoleTarget } from 'src/engine/metadata-modules/flat-role-target/types/flat-role-target.type'; import { type FlatRole } from 'src/engine/metadata-modules/flat-role/types/flat-role.type'; +import { type FlatSkillMaps } from 'src/engine/metadata-modules/flat-skill/types/flat-skill-maps.type'; import { type FlatSkill } from 'src/engine/metadata-modules/flat-skill/types/flat-skill.type'; +import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type'; import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type'; +import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type'; import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type'; +import { type FlatViewFilterMaps } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter-maps.type'; import { type FlatViewFilter } from 'src/engine/metadata-modules/flat-view-filter/types/flat-view-filter.type'; +import { type FlatViewGroupMaps } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group-maps.type'; import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; +import { type FlatViewMaps } from 'src/engine/metadata-modules/flat-view/types/flat-view-maps.type'; import { type FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type'; +import { type FlatWebhookMaps } from 'src/engine/metadata-modules/flat-webhook/types/flat-webhook-maps.type'; import { type FlatWebhook } from 'src/engine/metadata-modules/flat-webhook/types/flat-webhook.type'; import { type FrontComponentEntity } from 'src/engine/metadata-modules/front-component/entities/front-component.entity'; import { type IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { type FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; import { type LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; +import { type FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; import { type NavigationMenuItemEntity } from 'src/engine/metadata-modules/navigation-menu-item/entities/navigation-menu-item.entity'; -import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { type PageLayoutEntity } from 'src/engine/metadata-modules/page-layout/entities/page-layout.entity'; import { type PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; import { type PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; -import { type RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; +import { type PageLayoutEntity } from 'src/engine/metadata-modules/page-layout/entities/page-layout.entity'; import { type RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; -import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type'; -import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type'; -import { type RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity'; +import { type RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; import { type RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity'; +import { type RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity'; +import { type FlatRowLevelPermissionPredicateGroupMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group-maps.type'; +import { type FlatRowLevelPermissionPredicateGroup } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group.type'; +import { type FlatRowLevelPermissionPredicateMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-maps.type'; +import { type FlatRowLevelPermissionPredicate } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate.type'; import { type SkillEntity } from 'src/engine/metadata-modules/skill/entities/skill.entity'; -import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; import { type ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { type ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; import { type ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; +import { type ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; import { type ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; +import { type ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; import { type WebhookEntity } from 'src/engine/metadata-modules/webhook/entities/webhook.entity'; import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; import { - type CreateAgentAction, - type DeleteAgentAction, - type UpdateAgentAction, + type FlatCreateAgentAction, + type FlatDeleteAgentAction, + type FlatUpdateAgentAction, + type UniversalDeleteAgentAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; import { - type CreateCommandMenuItemAction, - type DeleteCommandMenuItemAction, - type UpdateCommandMenuItemAction, + type FlatCreateCommandMenuItemAction, + type FlatDeleteCommandMenuItemAction, + type FlatUpdateCommandMenuItemAction, + type UniversalDeleteCommandMenuItemAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; import { - type CreateFieldAction, - type DeleteFieldAction, - type UpdateFieldAction, + type FlatCreateFieldAction, + type FlatDeleteFieldAction, + type FlatUpdateFieldAction, + type UniversalCreateFieldAction, + type UniversalDeleteFieldAction, + type UniversalUpdateFieldAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; import { - type CreateFrontComponentAction, - type DeleteFrontComponentAction, - type UpdateFrontComponentAction, + type FlatCreateFrontComponentAction, + type FlatDeleteFrontComponentAction, + type FlatUpdateFrontComponentAction, + type UniversalDeleteFrontComponentAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; import { - type CreateIndexAction, - type DeleteIndexAction, - type UpdateIndexAction, + type FlatCreateIndexAction, + type FlatDeleteIndexAction, + type FlatUpdateIndexAction, + type UniversalDeleteIndexAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; import { - type CreateNavigationMenuItemAction, - type DeleteNavigationMenuItemAction, - type UpdateNavigationMenuItemAction, -} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; -import { - type CreateObjectAction, - type DeleteObjectAction, - type UpdateObjectAction, -} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; -import { - type CreatePageLayoutTabAction, - type DeletePageLayoutTabAction, - type UpdatePageLayoutTabAction, -} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; -import { - type CreatePageLayoutWidgetAction, - type DeletePageLayoutWidgetAction, - type UpdatePageLayoutWidgetAction, -} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; -import { - type CreatePageLayoutAction, - type DeletePageLayoutAction, - type UpdatePageLayoutAction, -} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; -import { - type CreateRoleTargetAction, - type DeleteRoleTargetAction, - type UpdateRoleTargetAction, -} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; -import { - type CreateRoleAction, - type DeleteRoleAction, - type UpdateRoleAction, -} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; -import { - type CreateRowLevelPermissionPredicateGroupAction, - type DeleteRowLevelPermissionPredicateGroupAction, - type UpdateRowLevelPermissionPredicateGroupAction, -} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; -import { - type CreateRowLevelPermissionPredicateAction, - type DeleteRowLevelPermissionPredicateAction, - type UpdateRowLevelPermissionPredicateAction, -} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; -import { - type CreateLogicFunctionAction, - type DeleteLogicFunctionAction, - type UpdateLogicFunctionAction, + type FlatCreateLogicFunctionAction, + type FlatDeleteLogicFunctionAction, + type FlatUpdateLogicFunctionAction, + type UniversalDeleteLogicFunctionAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; import { - type CreateSkillAction, - type DeleteSkillAction, - type UpdateSkillAction, + type FlatCreateNavigationMenuItemAction, + type FlatDeleteNavigationMenuItemAction, + type FlatUpdateNavigationMenuItemAction, + type UniversalDeleteNavigationMenuItemAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; +import { + type FlatCreateObjectAction, + type FlatDeleteObjectAction, + type FlatUpdateObjectAction, + type UniversalCreateObjectAction, + type UniversalDeleteObjectAction, + type UniversalUpdateObjectAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; +import { + type FlatCreatePageLayoutTabAction, + type FlatDeletePageLayoutTabAction, + type FlatUpdatePageLayoutTabAction, + type UniversalDeletePageLayoutTabAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; +import { + type FlatCreatePageLayoutWidgetAction, + type FlatDeletePageLayoutWidgetAction, + type FlatUpdatePageLayoutWidgetAction, + type UniversalDeletePageLayoutWidgetAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; +import { + type FlatCreatePageLayoutAction, + type FlatDeletePageLayoutAction, + type FlatUpdatePageLayoutAction, + type UniversalDeletePageLayoutAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; +import { + type FlatCreateRoleTargetAction, + type FlatDeleteRoleTargetAction, + type FlatUpdateRoleTargetAction, + type UniversalDeleteRoleTargetAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; +import { + type FlatCreateRoleAction, + type FlatDeleteRoleAction, + type FlatUpdateRoleAction, + type UniversalDeleteRoleAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; +import { + type FlatCreateRowLevelPermissionPredicateGroupAction, + type FlatDeleteRowLevelPermissionPredicateGroupAction, + type FlatUpdateRowLevelPermissionPredicateGroupAction, + type UniversalDeleteRowLevelPermissionPredicateGroupAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; +import { + type FlatCreateRowLevelPermissionPredicateAction, + type FlatDeleteRowLevelPermissionPredicateAction, + type FlatUpdateRowLevelPermissionPredicateAction, + type UniversalDeleteRowLevelPermissionPredicateAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; +import { + type FlatCreateSkillAction, + type FlatDeleteSkillAction, + type FlatUpdateSkillAction, + type UniversalDeleteSkillAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; import { - type CreateViewFieldAction, - type DeleteViewFieldAction, - type UpdateViewFieldAction, + type FlatCreateViewFieldAction, + type FlatDeleteViewFieldAction, + type FlatUpdateViewFieldAction, + type UniversalDeleteViewFieldAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; import { - type CreateViewFilterGroupAction, - type DeleteViewFilterGroupAction, - type UpdateViewFilterGroupAction, + type FlatCreateViewFilterGroupAction, + type FlatDeleteViewFilterGroupAction, + type FlatUpdateViewFilterGroupAction, + type UniversalDeleteViewFilterGroupAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; import { - type CreateViewFilterAction, - type DeleteViewFilterAction, - type UpdateViewFilterAction, + type FlatCreateViewFilterAction, + type FlatDeleteViewFilterAction, + type FlatUpdateViewFilterAction, + type UniversalDeleteViewFilterAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; import { - type CreateViewGroupAction, - type DeleteViewGroupAction, - type UpdateViewGroupAction, + type FlatCreateViewGroupAction, + type FlatDeleteViewGroupAction, + type FlatUpdateViewGroupAction, + type UniversalDeleteViewGroupAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; import { - type CreateViewAction, - type DeleteViewAction, - type UpdateViewAction, + type FlatCreateViewAction, + type FlatDeleteViewAction, + type FlatUpdateViewAction, + type UniversalDeleteViewAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; import { - type CreateWebhookAction, - type DeleteWebhookAction, - type UpdateWebhookAction, + type FlatCreateWebhookAction, + type FlatDeleteWebhookAction, + type FlatUpdateWebhookAction, + type UniversalDeleteWebhookAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; export type AllFlatEntityTypesByMetadataName = { fieldMetadata: { - actions: { - create: CreateFieldAction; - update: UpdateFieldAction; - delete: DeleteFieldAction; + flatEntityMaps: FlatEntityMaps; + universalActions: { + create: UniversalCreateFieldAction; + update: UniversalUpdateFieldAction; + delete: UniversalDeleteFieldAction; + }; + flatActions: { + create: FlatCreateFieldAction; + update: FlatUpdateFieldAction; + delete: FlatDeleteFieldAction; }; flatEntity: FlatFieldMetadata; universalFlatEntity: UniversalFlatEntityFrom< @@ -170,180 +220,288 @@ export type AllFlatEntityTypesByMetadataName = { entity: MetadataEntity<'fieldMetadata'>; }; objectMetadata: { - actions: { - create: CreateObjectAction; - update: UpdateObjectAction; - delete: DeleteObjectAction; + flatEntityMaps: FlatEntityMaps; + universalActions: { + create: UniversalCreateObjectAction; + update: UniversalUpdateObjectAction; + delete: UniversalDeleteObjectAction; + }; + flatActions: { + create: FlatCreateObjectAction; + update: FlatUpdateObjectAction; + delete: FlatDeleteObjectAction; }; flatEntity: FlatObjectMetadata; - universalFlatEntity: UniversalFlatEntityFrom; + universalFlatEntity: UniversalFlatObjectMetadata; entity: MetadataEntity<'objectMetadata'>; }; view: { - actions: { - create: CreateViewAction; - update: UpdateViewAction; - delete: DeleteViewAction; + flatEntityMaps: FlatViewMaps; + universalActions: { + create: FlatCreateViewAction; + update: FlatUpdateViewAction; + delete: UniversalDeleteViewAction; + }; + flatActions: { + create: FlatCreateViewAction; + update: FlatUpdateViewAction; + delete: FlatDeleteViewAction; }; flatEntity: FlatView; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'view'>; }; viewField: { - actions: { - create: CreateViewFieldAction; - update: UpdateViewFieldAction; - delete: DeleteViewFieldAction; + flatEntityMaps: FlatViewFieldMaps; + universalActions: { + create: FlatCreateViewFieldAction; + update: FlatUpdateViewFieldAction; + delete: UniversalDeleteViewFieldAction; + }; + flatActions: { + create: FlatCreateViewFieldAction; + update: FlatUpdateViewFieldAction; + delete: FlatDeleteViewFieldAction; }; flatEntity: FlatViewField; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'viewField'>; }; viewGroup: { - actions: { - create: CreateViewGroupAction; - update: UpdateViewGroupAction; - delete: DeleteViewGroupAction; + flatEntityMaps: FlatViewGroupMaps; + universalActions: { + create: FlatCreateViewGroupAction; + update: FlatUpdateViewGroupAction; + delete: UniversalDeleteViewGroupAction; + }; + flatActions: { + create: FlatCreateViewGroupAction; + update: FlatUpdateViewGroupAction; + delete: FlatDeleteViewGroupAction; }; flatEntity: FlatViewGroup; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'viewGroup'>; }; rowLevelPermissionPredicate: { - actions: { - create: CreateRowLevelPermissionPredicateAction; - update: UpdateRowLevelPermissionPredicateAction; - delete: DeleteRowLevelPermissionPredicateAction; + flatEntityMaps: FlatRowLevelPermissionPredicateMaps; + universalActions: { + create: FlatCreateRowLevelPermissionPredicateAction; + update: FlatUpdateRowLevelPermissionPredicateAction; + delete: UniversalDeleteRowLevelPermissionPredicateAction; + }; + flatActions: { + create: FlatCreateRowLevelPermissionPredicateAction; + update: FlatUpdateRowLevelPermissionPredicateAction; + delete: FlatDeleteRowLevelPermissionPredicateAction; }; flatEntity: FlatRowLevelPermissionPredicate; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'rowLevelPermissionPredicate'>; }; rowLevelPermissionPredicateGroup: { - actions: { - create: CreateRowLevelPermissionPredicateGroupAction; - update: UpdateRowLevelPermissionPredicateGroupAction; - delete: DeleteRowLevelPermissionPredicateGroupAction; + flatEntityMaps: FlatRowLevelPermissionPredicateGroupMaps; + universalActions: { + create: FlatCreateRowLevelPermissionPredicateGroupAction; + update: FlatUpdateRowLevelPermissionPredicateGroupAction; + delete: UniversalDeleteRowLevelPermissionPredicateGroupAction; + }; + flatActions: { + create: FlatCreateRowLevelPermissionPredicateGroupAction; + update: FlatUpdateRowLevelPermissionPredicateGroupAction; + delete: FlatDeleteRowLevelPermissionPredicateGroupAction; }; flatEntity: FlatRowLevelPermissionPredicateGroup; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'rowLevelPermissionPredicateGroup'>; }; viewFilterGroup: { - actions: { - create: CreateViewFilterGroupAction; - update: UpdateViewFilterGroupAction; - delete: DeleteViewFilterGroupAction; + flatEntityMaps: FlatViewFilterGroupMaps; + universalActions: { + create: FlatCreateViewFilterGroupAction; + update: FlatUpdateViewFilterGroupAction; + delete: UniversalDeleteViewFilterGroupAction; + }; + flatActions: { + create: FlatCreateViewFilterGroupAction; + update: FlatUpdateViewFilterGroupAction; + delete: FlatDeleteViewFilterGroupAction; }; flatEntity: FlatViewFilterGroup; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'viewFilterGroup'>; }; index: { - actions: { - create: CreateIndexAction; - update: UpdateIndexAction; - delete: DeleteIndexAction; + flatEntityMaps: FlatEntityMaps; + universalActions: { + create: FlatCreateIndexAction; + update: FlatUpdateIndexAction; + delete: UniversalDeleteIndexAction; + }; + flatActions: { + create: FlatCreateIndexAction; + update: FlatUpdateIndexAction; + delete: FlatDeleteIndexAction; }; flatEntity: FlatIndexMetadata; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'index'>; }; logicFunction: { - actions: { - create: CreateLogicFunctionAction; - update: UpdateLogicFunctionAction; - delete: DeleteLogicFunctionAction; + flatEntityMaps: FlatEntityMaps; + universalActions: { + create: FlatCreateLogicFunctionAction; + update: FlatUpdateLogicFunctionAction; + delete: UniversalDeleteLogicFunctionAction; + }; + flatActions: { + create: FlatCreateLogicFunctionAction; + update: FlatUpdateLogicFunctionAction; + delete: FlatDeleteLogicFunctionAction; }; flatEntity: FlatLogicFunction; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'logicFunction'>; }; viewFilter: { - actions: { - create: CreateViewFilterAction; - update: UpdateViewFilterAction; - delete: DeleteViewFilterAction; + flatEntityMaps: FlatViewFilterMaps; + universalActions: { + create: FlatCreateViewFilterAction; + update: FlatUpdateViewFilterAction; + delete: UniversalDeleteViewFilterAction; + }; + flatActions: { + create: FlatCreateViewFilterAction; + update: FlatUpdateViewFilterAction; + delete: FlatDeleteViewFilterAction; }; flatEntity: FlatViewFilter; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'viewFilter'>; }; role: { - actions: { - create: CreateRoleAction; - update: UpdateRoleAction; - delete: DeleteRoleAction; + flatEntityMaps: FlatEntityMaps; + universalActions: { + create: FlatCreateRoleAction; + update: FlatUpdateRoleAction; + delete: UniversalDeleteRoleAction; + }; + flatActions: { + create: FlatCreateRoleAction; + update: FlatUpdateRoleAction; + delete: FlatDeleteRoleAction; }; flatEntity: FlatRole; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'role'>; }; roleTarget: { - actions: { - create: CreateRoleTargetAction; - update: UpdateRoleTargetAction; - delete: DeleteRoleTargetAction; + flatEntityMaps: FlatRoleTargetMaps; + universalActions: { + create: FlatCreateRoleTargetAction; + update: FlatUpdateRoleTargetAction; + delete: UniversalDeleteRoleTargetAction; + }; + flatActions: { + create: FlatCreateRoleTargetAction; + update: FlatUpdateRoleTargetAction; + delete: FlatDeleteRoleTargetAction; }; flatEntity: FlatRoleTarget; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'roleTarget'>; }; agent: { - actions: { - create: CreateAgentAction; - update: UpdateAgentAction; - delete: DeleteAgentAction; + flatEntityMaps: FlatAgentMaps; + universalActions: { + create: FlatCreateAgentAction; + update: FlatUpdateAgentAction; + delete: UniversalDeleteAgentAction; + }; + flatActions: { + create: FlatCreateAgentAction; + update: FlatUpdateAgentAction; + delete: FlatDeleteAgentAction; }; flatEntity: FlatAgent; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'agent'>; }; skill: { - actions: { - create: CreateSkillAction; - update: UpdateSkillAction; - delete: DeleteSkillAction; + flatEntityMaps: FlatSkillMaps; + universalActions: { + create: FlatCreateSkillAction; + update: FlatUpdateSkillAction; + delete: UniversalDeleteSkillAction; + }; + flatActions: { + create: FlatCreateSkillAction; + update: FlatUpdateSkillAction; + delete: FlatDeleteSkillAction; }; flatEntity: FlatSkill; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'skill'>; }; commandMenuItem: { - actions: { - create: CreateCommandMenuItemAction; - update: UpdateCommandMenuItemAction; - delete: DeleteCommandMenuItemAction; + flatEntityMaps: FlatCommandMenuItemMaps; + universalActions: { + create: FlatCreateCommandMenuItemAction; + update: FlatUpdateCommandMenuItemAction; + delete: UniversalDeleteCommandMenuItemAction; + }; + flatActions: { + create: FlatCreateCommandMenuItemAction; + update: FlatUpdateCommandMenuItemAction; + delete: FlatDeleteCommandMenuItemAction; }; flatEntity: FlatCommandMenuItem; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'commandMenuItem'>; }; navigationMenuItem: { - actions: { - create: CreateNavigationMenuItemAction; - update: UpdateNavigationMenuItemAction; - delete: DeleteNavigationMenuItemAction; + flatEntityMaps: FlatNavigationMenuItemMaps; + universalActions: { + create: FlatCreateNavigationMenuItemAction; + update: FlatUpdateNavigationMenuItemAction; + delete: UniversalDeleteNavigationMenuItemAction; + }; + flatActions: { + create: FlatCreateNavigationMenuItemAction; + update: FlatUpdateNavigationMenuItemAction; + delete: FlatDeleteNavigationMenuItemAction; }; flatEntity: FlatNavigationMenuItem; universalFlatEntity: UniversalFlatEntityFrom; entity: NavigationMenuItemEntity; }; pageLayout: { - actions: { - create: CreatePageLayoutAction; - update: UpdatePageLayoutAction; - delete: DeletePageLayoutAction; + flatEntityMaps: FlatPageLayoutMaps; + universalActions: { + create: FlatCreatePageLayoutAction; + update: FlatUpdatePageLayoutAction; + delete: UniversalDeletePageLayoutAction; + }; + flatActions: { + create: FlatCreatePageLayoutAction; + update: FlatUpdatePageLayoutAction; + delete: FlatDeletePageLayoutAction; }; flatEntity: FlatPageLayout; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'pageLayout'>; }; pageLayoutWidget: { - actions: { - create: CreatePageLayoutWidgetAction; - update: UpdatePageLayoutWidgetAction; - delete: DeletePageLayoutWidgetAction; + flatEntityMaps: FlatPageLayoutWidgetMaps; + universalActions: { + create: FlatCreatePageLayoutWidgetAction; + update: FlatUpdatePageLayoutWidgetAction; + delete: UniversalDeletePageLayoutWidgetAction; + }; + flatActions: { + create: FlatCreatePageLayoutWidgetAction; + update: FlatUpdatePageLayoutWidgetAction; + delete: FlatDeletePageLayoutWidgetAction; }; flatEntity: FlatPageLayoutWidget; universalFlatEntity: UniversalFlatEntityFrom< @@ -353,30 +511,48 @@ export type AllFlatEntityTypesByMetadataName = { entity: MetadataEntity<'pageLayoutWidget'>; }; pageLayoutTab: { - actions: { - create: CreatePageLayoutTabAction; - update: UpdatePageLayoutTabAction; - delete: DeletePageLayoutTabAction; + flatEntityMaps: FlatPageLayoutTabMaps; + universalActions: { + create: FlatCreatePageLayoutTabAction; + update: FlatUpdatePageLayoutTabAction; + delete: UniversalDeletePageLayoutTabAction; + }; + flatActions: { + create: FlatCreatePageLayoutTabAction; + update: FlatUpdatePageLayoutTabAction; + delete: FlatDeletePageLayoutTabAction; }; flatEntity: FlatPageLayoutTab; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'pageLayoutTab'>; }; frontComponent: { - actions: { - create: CreateFrontComponentAction; - update: UpdateFrontComponentAction; - delete: DeleteFrontComponentAction; + flatEntityMaps: FlatFrontComponentMaps; + universalActions: { + create: FlatCreateFrontComponentAction; + update: FlatUpdateFrontComponentAction; + delete: UniversalDeleteFrontComponentAction; + }; + flatActions: { + create: FlatCreateFrontComponentAction; + update: FlatUpdateFrontComponentAction; + delete: FlatDeleteFrontComponentAction; }; flatEntity: FlatFrontComponent; universalFlatEntity: UniversalFlatEntityFrom; entity: MetadataEntity<'frontComponent'>; }; webhook: { - actions: { - create: CreateWebhookAction; - update: UpdateWebhookAction; - delete: DeleteWebhookAction; + flatEntityMaps: FlatWebhookMaps; + universalActions: { + create: FlatCreateWebhookAction; + update: FlatUpdateWebhookAction; + delete: UniversalDeleteWebhookAction; + }; + flatActions: { + create: FlatCreateWebhookAction; + update: FlatUpdateWebhookAction; + delete: FlatDeleteWebhookAction; }; flatEntity: FlatWebhook; universalFlatEntity: UniversalFlatEntityFrom; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-from.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-from.type.ts index 0ed5719251..b75aac2dd2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-from.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/flat-entity-from.type.ts @@ -14,15 +14,17 @@ export type SyncableFlatEntity = Omit< id: string; }; +type AtomicFlatEntity = Omit< + TEntity, + | ExtractEntityRelatedEntityProperties + | keyof CastRecordTypeOrmDatePropertiesToString +>; + export type FlatEntityFrom< TEntity, // Required to be passed for narrowed type TMetadataName extends AllMetadataName | undefined = undefined, -> = Omit< - TEntity, - | ExtractEntityRelatedEntityProperties - | keyof CastRecordTypeOrmDatePropertiesToString -> & +> = AtomicFlatEntity & CastRecordTypeOrmDatePropertiesToString & AddSuffixToEntityOneToManyProperties & (TEntity extends SyncableEntity diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type.ts index 1fbe6861f8..d7c6116dc8 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type.ts @@ -1,8 +1,12 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; +import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; -export type MetadataFlatEntityMaps = FlatEntityMaps< - MetadataFlatEntity ->; +export type MetadataFlatEntityMaps< + T extends AllMetadataName, + TWithCustomMapsProperties extends boolean = false, +> = TWithCustomMapsProperties extends true + ? AllFlatEntityTypesByMetadataName[T]['flatEntityMaps'] + : FlatEntityMaps>; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type.ts index b0a71a9c95..5cf78482df 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type.ts @@ -1,28 +1,27 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; export type WorkspaceMigrationActionType = - | BaseCreateWorkspaceMigrationAction['type'] - | BaseUpdateWorkspaceMigrationAction['type'] - | BaseDeleteWorkspaceMigrationAction['type']; + keyof typeof WORKSPACE_MIGRATION_ACTION_TYPE; -export type MetadataWorkspaceMigrationActionsRecord = - { - [K in WorkspaceMigrationActionType]: MetadataWorkspaceMigrationAction< - T, - K - >[]; - }; +// Universal action types (use universal identifiers) +export type MetadataUniversalWorkspaceMigrationActionsRecord< + T extends AllMetadataName, +> = { + [K in WorkspaceMigrationActionType]: MetadataUniversalWorkspaceMigrationAction< + T, + K + >[]; +}; -export type MetadataWorkspaceMigrationAction< +export type MetadataUniversalWorkspaceMigrationAction< TMetadataName extends AllMetadataName, TActionType extends WorkspaceMigrationActionType, -> = AllFlatEntityTypesByMetadataName[TMetadataName]['actions'][TActionType] extends infer Action - ? Action extends Array - ? Action[number] - : Action - : never; +> = AllFlatEntityTypesByMetadataName[TMetadataName]['universalActions'][TActionType]; + +export type MetadataFlatWorkspaceMigrationAction< + TMetadataName extends AllMetadataName, + TActionType extends WorkspaceMigrationActionType, +> = AllFlatEntityTypesByMetadataName[TMetadataName]['flatActions'][TActionType]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util.ts index 62d5dde2cf..b4f1a057b0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util.ts @@ -8,19 +8,17 @@ import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util'; -export type FindFlatEntityByUniversalIdentifierOrThrowArgs< - T extends SyncableFlatEntity, -> = { - flatEntityMaps: FlatEntityMaps; - universalIdentifier: string; -}; - export const findFlatEntityByUniversalIdentifierOrThrow = < T extends SyncableFlatEntity, >({ flatEntityMaps, universalIdentifier, -}: FindFlatEntityByUniversalIdentifierOrThrowArgs): T => { +}: { + flatEntityMaps: FlatEntityMaps; + universalIdentifier: string; +}): T & { + id: string; +} => { const flatEntity = findFlatEntityByUniversalIdentifier({ flatEntityMaps, universalIdentifier, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts index 5e149d8ece..b152d9bfc5 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util.ts @@ -11,7 +11,7 @@ export const findFlatEntityByUniversalIdentifier = < }: { flatEntityMaps: FlatEntityMaps; universalIdentifier: string; -}): T | undefined => { +}): (T & { id: string }) | undefined => { const flatEntityId = flatEntityMaps.idByUniversalIdentifier[universalIdentifier]; @@ -19,5 +19,12 @@ export const findFlatEntityByUniversalIdentifier = < return; } - return flatEntityMaps.byId[flatEntityId]; + const result = flatEntityMaps.byId[flatEntityId]; + + return isDefined(result) + ? { + ...result, + id: flatEntityId, + } + : undefined; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-and-related-flat-field-to-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-and-related-flat-field-to-update.util.ts index b2e1a48429..e13ad55aa5 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-and-related-flat-field-to-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-to-update-and-related-flat-field-to-update.util.ts @@ -11,7 +11,7 @@ import { findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow } from 'src import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; import { sanitizeRawUpdateFieldInput } from 'src/engine/metadata-modules/flat-field-metadata/utils/sanitize-raw-update-field-input'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; type ComputeFlatFieldToUpdateAndRelatedFlatFieldToUpdateReturnType = { @@ -44,7 +44,7 @@ export const computeFlatFieldToUpdateAndRelatedFlatFieldToUpdate = ({ isSystemBuild, }); - const isStandardField = isStandardMetadata(fromFlatFieldMetadata); + const isStandardField = belongsToTwentyStandardApp(fromFlatFieldMetadata); const toFlatFieldMetadata = { ...mergeUpdateInExistingRecord({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts index 8b5511cd82..c544467a6a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadatas-to-create.util.ts @@ -122,6 +122,7 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({ settings: null, defaultValue: commonFlatFieldMetadata.defaultValue as string, // Could this be improved ? options: generateRatingOptions(), + universalSettings: null, } satisfies FlatFieldMetadata, ], indexMetadatas: [], @@ -150,6 +151,7 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({ options, defaultValue: commonFlatFieldMetadata.defaultValue as string, // Could this be improved ? settings: null, + universalSettings: null, } satisfies FlatFieldMetadata, ], indexMetadatas: [], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts index 52250eed65..cfcfa943d7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util.ts @@ -73,6 +73,6 @@ export const getDefaultFlatFieldMetadata = ({ kanbanAggregateOperationViewUniversalIdentifiers: [], calendarViewUniversalIdentifiers: [], mainGroupByFieldMetadataViewUniversalIdentifiers: [], - universalSettings: null, + universalSettings: settings ?? null, } as const satisfies FlatFieldMetadata; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util.ts index e2cfe0357b..5951a619eb 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util.ts @@ -4,8 +4,14 @@ import { } from 'src/engine/metadata-modules/field-metadata/types/composite-field-metadata-type.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; export const isCompositeFlatFieldMetadata = ( flatFieldMetadata: FlatFieldMetadata, ): flatFieldMetadata is FlatFieldMetadata => isFlatFieldMetadataOfTypes(flatFieldMetadata, COMPOSITE_FIELD_TYPES); + +export const isCompositeUniversalFlatFieldMetadata = ( + universalFlatFieldMetadata: UniversalFlatFieldMetadata, +): universalFlatFieldMetadata is UniversalFlatFieldMetadata => + isFlatFieldMetadataOfTypes(universalFlatFieldMetadata, COMPOSITE_FIELD_TYPES); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util.ts index 36e321d295..913bb5de85 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util.ts @@ -4,8 +4,14 @@ import { } from 'src/engine/metadata-modules/field-metadata/types/enum-field-metadata-type.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; export const isEnumFlatFieldMetadata = ( flatFieldMetadata: FlatFieldMetadata, ): flatFieldMetadata is FlatFieldMetadata => isFlatFieldMetadataOfTypes(flatFieldMetadata, ENUM_FIELD_TYPES); + +export const isEnumUniversalFlatFieldMetadata = ( + universalFlatFieldMetadata: UniversalFlatFieldMetadata, +): universalFlatFieldMetadata is UniversalFlatFieldMetadata => + isFlatFieldMetadataOfTypes(universalFlatFieldMetadata, ENUM_FIELD_TYPES); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util.ts index 34cbab308b..8475c8acb6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util.ts @@ -4,6 +4,7 @@ import { } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; export const isMorphOrRelationFlatFieldMetadata = ( flatFieldMetadata: FlatFieldMetadata, @@ -11,3 +12,10 @@ export const isMorphOrRelationFlatFieldMetadata = ( isFlatFieldMetadataOfTypes(flatFieldMetadata, [ ...MORPH_OR_RELATION_FIELD_TYPES, ]); + +export const isMorphOrRelationUniversalFlatFieldMetadata = ( + universalFlatFieldMetadata: UniversalFlatFieldMetadata, +): universalFlatFieldMetadata is UniversalFlatFieldMetadata => + isFlatFieldMetadataOfTypes(universalFlatFieldMetadata, [ + ...MORPH_OR_RELATION_FIELD_TYPES, + ]); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/sanitize-raw-update-field-input.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/sanitize-raw-update-field-input.ts index a2cdd5a2a0..bf1305cbd3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/sanitize-raw-update-field-input.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/sanitize-raw-update-field-input.ts @@ -13,7 +13,7 @@ import { import { FLAT_FIELD_METADATA_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-editable-properties.constant'; import { type FlatFieldMetadataEditableProperties } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-editable-properties.constant'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; type SanitizeRawUpdateFieldInputArgs = { rawUpdateFieldInput: UpdateFieldInput; @@ -25,7 +25,7 @@ export const sanitizeRawUpdateFieldInput = ({ rawUpdateFieldInput, isSystemBuild, }: SanitizeRawUpdateFieldInputArgs) => { - const isStandardField = isStandardMetadata(existingFlatFieldMetadata); + const isStandardField = belongsToTwentyStandardApp(existingFlatFieldMetadata); const updatedEditableFieldProperties = extractAndSanitizeObjectStringFields( rawUpdateFieldInput, [ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/delete-flat-navigation-menu-item-from-maps-and-index.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/delete-flat-navigation-menu-item-from-maps-and-index.util.ts deleted file mode 100644 index 54c6a104ce..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/delete-flat-navigation-menu-item-from-maps-and-index.util.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { type FlatNavigationMenuItemMaps } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item-maps.type'; -import { type FlatNavigationMenuItem } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item.type'; -import { removeFlatNavigationMenuItemFromIndex } from 'src/engine/metadata-modules/flat-navigation-menu-item/utils/remove-flat-navigation-menu-item-from-index.util'; -import { deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util'; - -export const deleteFlatNavigationMenuItemFromMapsAndIndex = ({ - flatNavigationMenuItem, - flatNavigationMenuItemMaps, -}: { - flatNavigationMenuItem: FlatNavigationMenuItem; - flatNavigationMenuItemMaps: FlatNavigationMenuItemMaps; -}): void => { - removeFlatNavigationMenuItemFromIndex({ - flatNavigationMenuItem, - flatNavigationMenuItemMaps, - }); - - deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow({ - entityToDeleteId: flatNavigationMenuItem.id, - flatEntityMapsToMutate: flatNavigationMenuItemMaps, - }); -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/from-delete-navigation-menu-item-input-to-flat-navigation-menu-item-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/from-delete-navigation-menu-item-input-to-flat-navigation-menu-item-or-throw.util.ts index 64a238c784..221d88b55e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/from-delete-navigation-menu-item-input-to-flat-navigation-menu-item-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/from-delete-navigation-menu-item-input-to-flat-navigation-menu-item-or-throw.util.ts @@ -1,7 +1,7 @@ import { isDefined } from 'twenty-shared/utils'; +import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatNavigationMenuItemMaps } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item-maps.type'; import { type FlatNavigationMenuItem } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item.type'; import { NavigationMenuItemException, @@ -13,7 +13,7 @@ export const fromDeleteNavigationMenuItemInputToFlatNavigationMenuItemOrThrow = flatNavigationMenuItemMaps, navigationMenuItemId, }: { - flatNavigationMenuItemMaps: FlatNavigationMenuItemMaps; + flatNavigationMenuItemMaps: MetadataFlatEntityMaps<'navigationMenuItem'>; navigationMenuItemId: string; }): FlatNavigationMenuItem => { const existingFlatNavigationMenuItem = findFlatEntityByIdInFlatEntityMaps({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/remove-flat-navigation-menu-item-from-index.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/remove-flat-navigation-menu-item-from-index.util.ts deleted file mode 100644 index 3f80ed0c7e..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/remove-flat-navigation-menu-item-from-index.util.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { type FlatNavigationMenuItemMaps } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item-maps.type'; -import { type FlatNavigationMenuItem } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item.type'; - -export const removeFlatNavigationMenuItemFromIndex = ({ - flatNavigationMenuItem, - flatNavigationMenuItemMaps, -}: { - flatNavigationMenuItem: FlatNavigationMenuItem; - flatNavigationMenuItemMaps: FlatNavigationMenuItemMaps; -}): void => { - const userWorkspaceIdKey = flatNavigationMenuItem.userWorkspaceId ?? 'null'; - const folderIdKey = flatNavigationMenuItem.folderId ?? 'null'; - - const itemsArray = - flatNavigationMenuItemMaps.byUserWorkspaceIdAndFolderId[ - userWorkspaceIdKey - ]?.[folderIdKey]; - - if (!itemsArray) { - return; - } - - const index = itemsArray.findIndex( - (item) => item.id === flatNavigationMenuItem.id, - ); - - if (index === -1) { - return; - } - - itemsArray.splice(index, 1); - - if (itemsArray.length > 0) { - return; - } - - const userWorkspaceMap = - flatNavigationMenuItemMaps.byUserWorkspaceIdAndFolderId[userWorkspaceIdKey]; - - if (!userWorkspaceMap) { - return; - } - - delete userWorkspaceMap[folderIdKey]; - - if (Object.keys(userWorkspaceMap).length === 0) { - delete flatNavigationMenuItemMaps.byUserWorkspaceIdAndFolderId[ - userWorkspaceIdKey - ]; - } -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/replace-flat-navigation-menu-item-in-maps-and-update-index.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/replace-flat-navigation-menu-item-in-maps-and-update-index.util.ts deleted file mode 100644 index 7b2b5a220e..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-navigation-menu-item/utils/replace-flat-navigation-menu-item-in-maps-and-update-index.util.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { isDefined } from 'twenty-shared/utils'; - -import { type FlatNavigationMenuItemMaps } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item-maps.type'; -import { type FlatNavigationMenuItem } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item.type'; -import { removeFlatNavigationMenuItemFromIndex } from 'src/engine/metadata-modules/flat-navigation-menu-item/utils/remove-flat-navigation-menu-item-from-index.util'; -import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util'; - -export const replaceFlatNavigationMenuItemInMapsAndUpdateIndex = ({ - fromFlatNavigationMenuItem, - toFlatNavigationMenuItem, - flatNavigationMenuItemMaps, -}: { - fromFlatNavigationMenuItem: FlatNavigationMenuItem; - toFlatNavigationMenuItem: FlatNavigationMenuItem; - flatNavigationMenuItemMaps: FlatNavigationMenuItemMaps; -}): void => { - const oldUserWorkspaceIdKey = - fromFlatNavigationMenuItem.userWorkspaceId ?? 'null'; - const oldFolderIdKey = fromFlatNavigationMenuItem.folderId ?? 'null'; - const newUserWorkspaceIdKey = - toFlatNavigationMenuItem.userWorkspaceId ?? 'null'; - const newFolderIdKey = toFlatNavigationMenuItem.folderId ?? 'null'; - - const groupChanged = - oldUserWorkspaceIdKey !== newUserWorkspaceIdKey || - oldFolderIdKey !== newFolderIdKey; - - if (groupChanged) { - removeFlatNavigationMenuItemFromIndex({ - flatNavigationMenuItem: fromFlatNavigationMenuItem, - flatNavigationMenuItemMaps, - }); - } - - replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({ - flatEntity: toFlatNavigationMenuItem, - flatEntityMapsToMutate: flatNavigationMenuItemMaps, - }); - - if (groupChanged) { - if ( - !flatNavigationMenuItemMaps.byUserWorkspaceIdAndFolderId[ - newUserWorkspaceIdKey - ] - ) { - flatNavigationMenuItemMaps.byUserWorkspaceIdAndFolderId[ - newUserWorkspaceIdKey - ] = {}; - } - - if ( - !flatNavigationMenuItemMaps.byUserWorkspaceIdAndFolderId[ - newUserWorkspaceIdKey - ][newFolderIdKey] - ) { - flatNavigationMenuItemMaps.byUserWorkspaceIdAndFolderId[ - newUserWorkspaceIdKey - ][newFolderIdKey] = []; - } - - flatNavigationMenuItemMaps.byUserWorkspaceIdAndFolderId[ - newUserWorkspaceIdKey - ][newFolderIdKey].push(toFlatNavigationMenuItem); - } else { - const itemsArray = - flatNavigationMenuItemMaps.byUserWorkspaceIdAndFolderId[ - newUserWorkspaceIdKey - ]?.[newFolderIdKey]; - - if (!itemsArray) { - return; - } - - const index = itemsArray.findIndex( - (item) => item.id === toFlatNavigationMenuItem.id, - ); - - if (index === -1) { - return; - } - - const updatedItem = - flatNavigationMenuItemMaps.byId[toFlatNavigationMenuItem.id]; - - if (!isDefined(updatedItem)) { - return; - } - - itemsArray[index] = updatedItem; - } -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts index cd0a7dcea3..c756f30ca6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/from-update-object-input-to-flat-object-metadata-and-related-flat-entities.util.ts @@ -17,7 +17,7 @@ import { ObjectMetadataException, ObjectMetadataExceptionCode, } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; type FromUpdateObjectInputToFlatObjectMetadataArgs = { @@ -60,7 +60,9 @@ export const fromUpdateObjectInputToFlatObjectMetadataAndRelatedFlatEntities = ); } - const isStandardObject = isStandardMetadata(existingFlatObjectMetadata); + const isStandardObject = belongsToTwentyStandardApp( + existingFlatObjectMetadata, + ); const { standardOverrides, updatedEditableObjectProperties } = sanitizeRawUpdateObjectInput({ existingFlatObjectMetadata, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/sanitize-raw-update-object-input.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/sanitize-raw-update-object-input.ts index 2166214451..b468c7ff5e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/sanitize-raw-update-object-input.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/sanitize-raw-update-object-input.ts @@ -12,7 +12,7 @@ import { ObjectMetadataExceptionCode, } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { type ObjectMetadataStandardOverridesProperties } from 'src/engine/metadata-modules/object-metadata/types/object-metadata-standard-overrides-properties.types'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; type SanitizeRawUpdateObjectInputArgs = { rawUpdateObjectInput: UpdateOneObjectInput; @@ -23,7 +23,9 @@ export const sanitizeRawUpdateObjectInput = ({ existingFlatObjectMetadata, rawUpdateObjectInput, }: SanitizeRawUpdateObjectInputArgs) => { - const isStandardObject = isStandardMetadata(existingFlatObjectMetadata); + const isStandardObject = belongsToTwentyStandardApp( + existingFlatObjectMetadata, + ); const updatedEditableObjectProperties = extractAndSanitizeObjectStringFields( rawUpdateObjectInput.update, [ diff --git a/packages/twenty-server/src/engine/metadata-modules/front-component/entities/front-component.entity.ts b/packages/twenty-server/src/engine/metadata-modules/front-component/entities/front-component.entity.ts index aa13fa7bc0..3ad44915b0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/front-component/entities/front-component.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/front-component/entities/front-component.entity.ts @@ -9,10 +9,7 @@ import { import { SyncableEntity } from 'src/engine/workspace-manager/types/syncable-entity.interface'; @Entity('frontComponent') -export class FrontComponentEntity - extends SyncableEntity - implements Required -{ +export class FrontComponentEntity extends SyncableEntity { @PrimaryGeneratedColumn('uuid') id: string; diff --git a/packages/twenty-server/src/engine/metadata-modules/front-component/front-component.service.ts b/packages/twenty-server/src/engine/metadata-modules/front-component/front-component.service.ts index d765c69408..d7b6f0991f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/front-component/front-component.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/front-component/front-component.service.ts @@ -95,6 +95,8 @@ export class FrontComponentService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -125,6 +127,11 @@ export class FrontComponentService { input: UpdateFrontComponentInput, workspaceId: string, ): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatFrontComponentMaps: existingFlatFrontComponentMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -151,6 +158,8 @@ export class FrontComponentService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -178,6 +187,11 @@ export class FrontComponentService { } async delete(id: string, workspaceId: string): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatFrontComponentMaps: existingFlatFrontComponentMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -204,6 +218,8 @@ export class FrontComponentService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function/services/logic-function.service.ts b/packages/twenty-server/src/engine/metadata-modules/logic-function/services/logic-function.service.ts index f807d434f5..2296343c38 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function/services/logic-function.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/logic-function/services/logic-function.service.ts @@ -4,6 +4,7 @@ import { FileFolder } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; +import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; import { getLogicFunctionBaseFolderPath } from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util'; import { LogicFunctionLayerService } from 'src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service'; @@ -37,14 +38,23 @@ export class LogicFunctionService { async createOne({ input, workspaceId, - applicationId, + ownerFlatApplication, }: { input: Omit & { logicFunctionLayerId?: string; }; + ownerFlatApplication?: FlatApplication; workspaceId: string; applicationId?: string; }) { + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; + let logicFunctionToCreateLayerId = input.logicFunctionLayerId; if (!isDefined(logicFunctionToCreateLayerId)) { @@ -56,13 +66,6 @@ export class LogicFunctionService { logicFunctionToCreateLayerId = commonLogicFunctionLayerId; } - const { workspaceCustomFlatApplication } = - await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( - { - workspaceId, - }, - ); - const flatLogicFunctionToCreate = fromCreateLogicFunctionInputToFlatLogicFunction({ createLogicFunctionInput: { @@ -70,8 +73,7 @@ export class LogicFunctionService { logicFunctionLayerId: logicFunctionToCreateLayerId, }, workspaceId, - workspaceCustomApplicationId: - applicationId ?? workspaceCustomFlatApplication.id, + ownerFlatApplication: resolvedOwnerFlatApplication, }); const validateAndBuildResult = @@ -86,6 +88,8 @@ export class LogicFunctionService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + resolvedOwnerFlatApplication.universalIdentifier, }, ); @@ -114,13 +118,21 @@ export class LogicFunctionService { id, update, workspaceId, - applicationId: _applicationId, + ownerFlatApplication, }: { id: string; update: UpdateLogicFunctionInput['update']; workspaceId: string; - applicationId?: string; + ownerFlatApplication?: FlatApplication; }) { + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; + const { flatLogicFunctionMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -147,6 +159,8 @@ export class LogicFunctionService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + resolvedOwnerFlatApplication.universalIdentifier, }, ); @@ -176,12 +190,22 @@ export class LogicFunctionService { workspaceId, applicationId: _applicationId, isSystemBuild = false, + ownerFlatApplication, }: { id: string; workspaceId: string; applicationId?: string; isSystemBuild?: boolean; + ownerFlatApplication?: FlatApplication; }): Promise { + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; + const { flatLogicFunctionMaps: existingFlatLogicFunctionMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -211,6 +235,8 @@ export class LogicFunctionService { }, workspaceId, isSystemBuild, + applicationUniversalIdentifier: + resolvedOwnerFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function/utils/from-create-logic-function-input-to-flat-logic-function.util.ts b/packages/twenty-server/src/engine/metadata-modules/logic-function/utils/from-create-logic-function-input-to-flat-logic-function.util.ts index 48332cae2f..6092c5c7fd 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function/utils/from-create-logic-function-input-to-flat-logic-function.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/logic-function/utils/from-create-logic-function-input-to-flat-logic-function.util.ts @@ -1,6 +1,7 @@ import { isDefined } from 'twenty-shared/utils'; import { v4 } from 'uuid'; +import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { DEFAULT_TOOL_INPUT_SCHEMA } from 'src/engine/metadata-modules/logic-function/constants/default-tool-input-schema.constant'; import { type CreateLogicFunctionInput } from 'src/engine/metadata-modules/logic-function/dtos/create-logic-function.input'; import { @@ -19,13 +20,13 @@ export type FromCreateLogicFunctionInputToFlatLogicFunctionArgs = { logicFunctionLayerId: string; }; workspaceId: string; - workspaceCustomApplicationId: string; + ownerFlatApplication: FlatApplication; }; export const fromCreateLogicFunctionInputToFlatLogicFunction = ({ createLogicFunctionInput: rawCreateLogicFunctionInput, workspaceId, - workspaceCustomApplicationId, + ownerFlatApplication, }: FromCreateLogicFunctionInputToFlatLogicFunctionArgs): FlatLogicFunction => { const id = v4(); const currentDate = new Date(); @@ -39,6 +40,9 @@ export const fromCreateLogicFunctionInputToFlatLogicFunction = ({ rawCreateLogicFunctionInput.builtHandlerPath ?? `${baseFolder}/${DEFAULT_BUILT_HANDLER_PATH}`; + const universalIdentifier = + rawCreateLogicFunctionInput.universalIdentifier ?? v4(); + return { id, cronTriggerSettings: null, @@ -50,12 +54,11 @@ export const fromCreateLogicFunctionInputToFlatLogicFunction = ({ handlerName: rawCreateLogicFunctionInput.handlerName ?? DEFAULT_HANDLER_NAME, builtHandlerPath, - universalIdentifier: - rawCreateLogicFunctionInput.universalIdentifier ?? v4(), + universalIdentifier, createdAt: currentDate.toISOString(), updatedAt: currentDate.toISOString(), deletedAt: null, - applicationId: workspaceCustomApplicationId, + applicationId: ownerFlatApplication.id, runtime: LogicFunctionRuntime.NODE22, timeoutSeconds: rawCreateLogicFunctionInput.timeoutSeconds ?? 300, logicFunctionLayerId: rawCreateLogicFunctionInput.logicFunctionLayerId, @@ -74,5 +77,9 @@ export const fromCreateLogicFunctionInputToFlatLogicFunction = ({ ? DEFAULT_TOOL_INPUT_SCHEMA : null, isTool: rawCreateLogicFunctionInput?.isTool ?? false, + __universal: { + applicationUniversalIdentifier: ownerFlatApplication.universalIdentifier, + universalIdentifier, + }, }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/navigation-menu-item/navigation-menu-item.service.ts b/packages/twenty-server/src/engine/metadata-modules/navigation-menu-item/navigation-menu-item.service.ts index 0718f90607..d694aea647 100644 --- a/packages/twenty-server/src/engine/metadata-modules/navigation-menu-item/navigation-menu-item.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/navigation-menu-item/navigation-menu-item.service.ts @@ -184,6 +184,8 @@ export class NavigationMenuItemService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -223,6 +225,11 @@ export class NavigationMenuItemService { authApiKeyId?: string; authApplicationId?: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatNavigationMenuItemMaps: existingFlatNavigationMenuItemMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -266,6 +273,8 @@ export class NavigationMenuItemService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -305,6 +314,11 @@ export class NavigationMenuItemService { authApiKeyId?: string; authApplicationId?: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatNavigationMenuItemMaps: existingFlatNavigationMenuItemMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -339,6 +353,8 @@ export class NavigationMenuItemService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/navigation-menu-item/services/navigation-menu-item-deletion.service.ts b/packages/twenty-server/src/engine/metadata-modules/navigation-menu-item/services/navigation-menu-item-deletion.service.ts index 032b15c27b..e3ce8bbbed 100644 --- a/packages/twenty-server/src/engine/metadata-modules/navigation-menu-item/services/navigation-menu-item-deletion.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/navigation-menu-item/services/navigation-menu-item-deletion.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { isDefined } from 'twenty-shared/utils'; +import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { fromDeleteNavigationMenuItemInputToFlatNavigationMenuItemOrThrow } from 'src/engine/metadata-modules/flat-navigation-menu-item/utils/from-delete-navigation-menu-item-input-to-flat-navigation-menu-item-or-throw.util'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; @@ -12,12 +13,18 @@ export class NavigationMenuItemDeletionService { constructor( private readonly workspaceManyOrAllFlatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService, private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService, + private readonly applicationService: ApplicationService, ) {} async deleteNavigationMenuItemsForDeletedRecords( deletedRecordIds: string[], workspaceId: string, ): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatNavigationMenuItemMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -62,6 +69,8 @@ export class NavigationMenuItemDeletionService { }, workspaceId, isSystemBuild: true, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts index 486622e98c..653669bfff 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts @@ -6,6 +6,7 @@ import { fromArrayToUniqueKeyRecord, isDefined } from 'twenty-shared/utils'; import { FindManyOptions, FindOneOptions, Repository } from 'typeorm'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; +import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; @@ -56,10 +57,20 @@ export class ObjectMetadataService extends TypeOrmQueryService { + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; + const { flatObjectMetadataMaps: existingFlatObjectMetadataMaps, flatIndexMaps: existingFlatIndexMaps, @@ -125,6 +136,8 @@ export class ObjectMetadataService extends TypeOrmQueryService { const deletedObjectMetadataDtos = await this.deleteManyObjectMetadatas({ deleteObjectInputs: [deleteObjectInput], workspaceId, isSystemBuild, + ownerFlatApplication, }); if (deletedObjectMetadataDtos.length !== 1) { @@ -193,15 +209,25 @@ export class ObjectMetadataService extends TypeOrmQueryService { if (deleteObjectInputs.length === 0) { return []; } + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; + const { flatObjectMetadataMaps, flatFieldMetadataMaps, flatIndexMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -296,6 +322,8 @@ export class ObjectMetadataService extends TypeOrmQueryService { const { workspaceCustomFlatApplication } = await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( @@ -328,27 +352,18 @@ export class ObjectMetadataService extends TypeOrmQueryService = { type: FieldMetadataType.TS_VECTOR, mainGroupByFieldMetadataViewIds: [], @@ -450,12 +457,7 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ standardOverrides: null, relationTargetFieldMetadataId: null, relationTargetObjectMetadataId: null, - settings: { - asExpression: getTsVectorColumnExpressionFromFields( - nameField ? [nameField] : [], - ), - generatedType: 'STORED', - }, + settings: searchVectorSettings, morphId: null, applicationId, applicationUniversalIdentifier, @@ -467,7 +469,7 @@ export const buildDefaultFlatFieldMetadatasForCustomObject = ({ kanbanAggregateOperationViewUniversalIdentifiers: [], calendarViewUniversalIdentifiers: [], mainGroupByFieldMetadataViewUniversalIdentifiers: [], - universalSettings: null, + universalSettings: searchVectorSettings, }; return { diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/services/page-layout-tab.service.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/services/page-layout-tab.service.ts index 6dbe149d6b..92077cf122 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/services/page-layout-tab.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-tab/services/page-layout-tab.service.ts @@ -155,6 +155,8 @@ export class PageLayoutTabService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -196,6 +198,11 @@ export class PageLayoutTabService { workspaceId: string; updateData: UpdatePageLayoutTabInput; }): Promise> { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatPageLayoutTabMaps: existingFlatPageLayoutTabMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -227,6 +234,8 @@ export class PageLayoutTabService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -266,6 +275,11 @@ export class PageLayoutTabService { id: string; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatPageLayoutTabMaps: existingFlatPageLayoutTabMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -292,6 +306,8 @@ export class PageLayoutTabService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts index c762ec5305..e4e031a310 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout-widget/services/page-layout-widget.service.ts @@ -66,6 +66,11 @@ export class PageLayoutWidgetService { operations: WidgetMigrationOperations; errorMessage: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { @@ -74,6 +79,8 @@ export class PageLayoutWidgetService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-duplication.service.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-duplication.service.ts index 9a77f540a6..11e6cc8efb 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-duplication.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-duplication.service.ts @@ -112,6 +112,8 @@ export class PageLayoutDuplicationService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-update.service.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-update.service.ts index 328db5c5a3..ee290db8c9 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-update.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout-update.service.ts @@ -137,6 +137,8 @@ export class PageLayoutUpdateService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout.service.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout.service.ts index 9307f68c5b..fb4eda8565 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout/services/page-layout.service.ts @@ -192,6 +192,8 @@ export class PageLayoutService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -227,6 +229,11 @@ export class PageLayoutService { workspaceId: string; updateData: UpdatePageLayoutInput; }): Promise> { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatPageLayoutMaps: existingFlatPageLayoutMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -258,6 +265,8 @@ export class PageLayoutService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -301,6 +310,11 @@ export class PageLayoutService { workspaceId: string; isLinkedDashboardAlreadyDestroyed?: boolean; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatPageLayoutMaps: existingFlatPageLayoutMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -327,6 +341,8 @@ export class PageLayoutService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -361,6 +377,11 @@ export class PageLayoutService { return true; } + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatPageLayoutMaps: existingFlatPageLayoutMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -388,6 +409,8 @@ export class PageLayoutService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/role-target/services/role-target.service.ts b/packages/twenty-server/src/engine/metadata-modules/role-target/services/role-target.service.ts index 1396906fdc..b747a52b46 100644 --- a/packages/twenty-server/src/engine/metadata-modules/role-target/services/role-target.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/role-target/services/role-target.service.ts @@ -102,6 +102,8 @@ export class RoleTargetService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -129,6 +131,13 @@ export class RoleTargetService { } async delete({ id, workspaceId }: DeleteRoleTargetInput): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatRoleTargetMaps: existingFlatRoleTargetMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -154,6 +163,8 @@ export class RoleTargetService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts index fc875c0dcc..5d25aafa90 100644 --- a/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts @@ -173,7 +173,7 @@ export class RoleResolver { return await this.roleService.createRole({ workspaceId, input: createRoleInput, - applicationId: workspaceCustomFlatApplication.id, + ownerFlatApplication: workspaceCustomFlatApplication, }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/role/role.service.ts b/packages/twenty-server/src/engine/metadata-modules/role/role.service.ts index 148bbe84e2..66a1296135 100644 --- a/packages/twenty-server/src/engine/metadata-modules/role/role.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/role/role.service.ts @@ -5,6 +5,8 @@ import { msg } from '@lingui/core/macro'; import { isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; +import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; +import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; @@ -37,6 +39,7 @@ export class RoleService { @InjectRepository(RoleEntity) private readonly roleRepository: Repository, private readonly userRoleService: UserRoleService, + private readonly applicationService: ApplicationService, ) {} public async getWorkspaceRoles(workspaceId: string): Promise { @@ -99,16 +102,16 @@ export class RoleService { public async createRole({ input, workspaceId, - applicationId, + ownerFlatApplication, }: { input: CreateRoleInput; workspaceId: string; - applicationId: string; + ownerFlatApplication: FlatApplication; }): Promise { const flatRoleToCreate = fromCreateRoleInputToFlatRoleToCreate({ createRoleInput: input, workspaceId, - applicationId, + applicationId: ownerFlatApplication.id, }); const validateAndBuildResult = @@ -123,6 +126,8 @@ export class RoleService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + ownerFlatApplication.universalIdentifier, }, ); @@ -152,10 +157,20 @@ export class RoleService { public async updateRole({ input, workspaceId, + ownerFlatApplication, }: { input: UpdateRoleInput; workspaceId: string; + ownerFlatApplication?: FlatApplication; }): Promise { + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; + const { flatRoleMaps: existingFlatRoleMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -181,6 +196,8 @@ export class RoleService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + resolvedOwnerFlatApplication.universalIdentifier, }, ); @@ -210,14 +227,17 @@ export class RoleService { public async deleteRole({ roleId, workspaceId, + ownerFlatApplication, }: { roleId: string; workspaceId: string; + ownerFlatApplication?: FlatApplication; }): Promise { const deletedRoles = await this.deleteManyRoles({ ids: [roleId], workspaceId, isSystemBuild: false, + ownerFlatApplication, }); const [deletedRole] = deletedRoles; @@ -229,15 +249,25 @@ export class RoleService { ids, workspaceId, isSystemBuild = false, + ownerFlatApplication, }: { ids: string[]; workspaceId: string; isSystemBuild?: boolean; + ownerFlatApplication?: FlatApplication; }): Promise { if (ids.length === 0) { return []; } + const resolvedOwnerFlatApplication = + ownerFlatApplication ?? + ( + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ) + ).workspaceCustomFlatApplication; + const { flatRoleMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -303,6 +333,8 @@ export class RoleService { }, workspaceId, isSystemBuild, + applicationUniversalIdentifier: + resolvedOwnerFlatApplication.universalIdentifier, }, ); @@ -318,9 +350,9 @@ export class RoleService { public async createMemberRole({ workspaceId, - applicationId, + ownerFlatApplication, }: { - applicationId: string; + ownerFlatApplication: FlatApplication; workspaceId: string; }): Promise { return this.createRole({ @@ -338,17 +370,17 @@ export class RoleService { canBeAssignedToAgents: false, canBeAssignedToApiKeys: false, }, - applicationId, + ownerFlatApplication, workspaceId, }); } public async createGuestRole({ workspaceId, - applicationId, + ownerFlatApplication, }: { workspaceId: string; - applicationId: string; + ownerFlatApplication: FlatApplication; }): Promise { return this.createRole({ input: { @@ -366,7 +398,7 @@ export class RoleService { canBeAssignedToApiKeys: false, }, workspaceId, - applicationId, + ownerFlatApplication, }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/row-level-permission-predicate/services/row-level-permission-predicate.service.ts b/packages/twenty-server/src/engine/metadata-modules/row-level-permission-predicate/services/row-level-permission-predicate.service.ts index 77df13c1d2..5da47d5044 100644 --- a/packages/twenty-server/src/engine/metadata-modules/row-level-permission-predicate/services/row-level-permission-predicate.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/row-level-permission-predicate/services/row-level-permission-predicate.service.ts @@ -459,6 +459,11 @@ export class RowLevelPermissionPredicateService { groupsToUpdate: FlatRowLevelPermissionPredicateGroup[]; groupsToDelete: FlatRowLevelPermissionPredicateGroup[]; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { @@ -479,6 +484,8 @@ export class RowLevelPermissionPredicateService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/skill/skill.service.ts b/packages/twenty-server/src/engine/metadata-modules/skill/skill.service.ts index 789cf2934e..28f4c1611e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/skill/skill.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/skill/skill.service.ts @@ -92,6 +92,8 @@ export class SkillService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -122,6 +124,11 @@ export class SkillService { input: UpdateSkillInput, workspaceId: string, ): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatSkillMaps: existingFlatSkillMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -147,6 +154,8 @@ export class SkillService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -174,6 +183,11 @@ export class SkillService { } async delete(id: string, workspaceId: string): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatSkillMaps: existingFlatSkillMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -199,6 +213,8 @@ export class SkillService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -251,6 +267,11 @@ export class SkillService { } async activate(id: string, workspaceId: string): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatSkillMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -282,6 +303,8 @@ export class SkillService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -309,6 +332,11 @@ export class SkillService { } async deactivate(id: string, workspaceId: string): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatSkillMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -340,6 +368,8 @@ export class SkillService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util.ts b/packages/twenty-server/src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util.ts new file mode 100644 index 0000000000..b9bf6409d1 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util.ts @@ -0,0 +1,10 @@ +import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications'; +import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +export const belongsToTwentyStandardApp = < + T extends UniversalSyncableFlatEntity, +>({ + applicationUniversalIdentifier, +}: T) => + applicationUniversalIdentifier === + TWENTY_STANDARD_APPLICATION.universalIdentifier; diff --git a/packages/twenty-server/src/engine/metadata-modules/utils/is-standard-metadata.util.ts b/packages/twenty-server/src/engine/metadata-modules/utils/is-standard-metadata.util.ts deleted file mode 100644 index 8d8fbf8f2d..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/utils/is-standard-metadata.util.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { isDefined } from 'twenty-shared/utils'; - -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; - -export const isStandardMetadata = ( - metadata: - | Pick - | Pick, -) => !metadata.isCustom && isDefined(metadata.standardId); diff --git a/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts index 54985c2219..317059c83d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-field/services/view-field-v2.service.ts @@ -97,6 +97,8 @@ export class ViewFieldV2Service { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -128,6 +130,13 @@ export class ViewFieldV2Service { workspaceId: string; updateViewFieldInput: UpdateViewFieldInput; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewFieldMaps: existingFlatViewFieldMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -154,6 +163,8 @@ export class ViewFieldV2Service { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -187,6 +198,13 @@ export class ViewFieldV2Service { deleteViewFieldInput: DeleteViewFieldInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewFieldMaps: existingFlatViewFieldMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -213,6 +231,8 @@ export class ViewFieldV2Service { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -246,6 +266,13 @@ export class ViewFieldV2Service { destroyViewFieldInput: DestroyViewFieldInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewFieldMaps: existingFlatViewFieldMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -272,6 +299,8 @@ export class ViewFieldV2Service { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter-group/services/view-filter-group.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter-group/services/view-filter-group.service.ts index 7e752c3f2f..b10f9115ff 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-filter-group/services/view-filter-group.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter-group/services/view-filter-group.service.ts @@ -64,6 +64,8 @@ export class ViewFilterGroupService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -101,6 +103,13 @@ export class ViewFilterGroupService { workspaceId: string; updateViewFilterGroupInput: UpdateViewFilterGroupInput; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewFilterGroupMaps: existingFlatViewFilterGroupMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -127,6 +136,8 @@ export class ViewFilterGroupService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -162,6 +173,13 @@ export class ViewFilterGroupService { deleteViewFilterGroupInput: DeleteViewFilterGroupInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewFilterGroupMaps: existingFlatViewFilterGroupMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -190,6 +208,8 @@ export class ViewFilterGroupService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -225,6 +245,13 @@ export class ViewFilterGroupService { destroyViewFilterGroupInput: DestroyViewFilterGroupInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewFilterGroupMaps: existingFlatViewFilterGroupMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -251,6 +278,8 @@ export class ViewFilterGroupService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts index a4c1461ffd..518d0ef3d7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter/services/view-filter.service.ts @@ -64,6 +64,8 @@ export class ViewFilterService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -97,6 +99,13 @@ export class ViewFilterService { workspaceId: string; updateViewFilterInput: UpdateViewFilterInput; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewFilterMaps: existingFlatViewFilterMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -123,6 +132,8 @@ export class ViewFilterService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -156,6 +167,13 @@ export class ViewFilterService { deleteViewFilterInput: DeleteViewFilterInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewFilterMaps: existingFlatViewFilterMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -184,6 +202,8 @@ export class ViewFilterService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -217,6 +237,13 @@ export class ViewFilterService { destroyViewFilterInput: DestroyViewFilterInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewFilterMaps: existingFlatViewFilterMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -243,6 +270,8 @@ export class ViewFilterService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts index 45ff0fce83..421a53e920 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts @@ -117,6 +117,8 @@ export class ViewGroupService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -148,6 +150,13 @@ export class ViewGroupService { workspaceId: string; updateViewGroupInput: UpdateViewGroupInput; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewGroupMaps: existingFlatViewGroupMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -174,6 +183,8 @@ export class ViewGroupService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -207,6 +218,13 @@ export class ViewGroupService { deleteViewGroupInput: DeleteViewGroupInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewGroupMaps: existingFlatViewGroupMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -235,6 +253,8 @@ export class ViewGroupService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -268,6 +288,13 @@ export class ViewGroupService { destroyViewGroupInput: DestroyViewGroupInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewGroupMaps: existingFlatViewGroupMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -294,6 +321,8 @@ export class ViewGroupService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts b/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts index 2164386f3d..86569f5dd1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view/services/view.service.ts @@ -87,6 +87,8 @@ export class ViewService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -122,6 +124,13 @@ export class ViewService { workspaceId: string; userWorkspaceId?: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewMaps: existingFlatViewMaps, flatFieldMetadataMaps: existingFlatFieldMetadataMaps, @@ -163,6 +172,8 @@ export class ViewService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -196,6 +207,13 @@ export class ViewService { deleteViewInput: DeleteViewInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewMaps: existingFlatViewMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -222,6 +240,8 @@ export class ViewService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -255,6 +275,13 @@ export class ViewService { destroyViewInput: DestroyViewInput; workspaceId: string; }): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { + workspaceId, + }, + ); + const { flatViewMaps: existingFlatViewMaps } = await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -280,6 +307,8 @@ export class ViewService { }, workspaceId, isSystemBuild: false, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/webhook/webhook.service.ts b/packages/twenty-server/src/engine/metadata-modules/webhook/webhook.service.ts index ef553f6eaa..475b31b51b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/webhook/webhook.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/webhook/webhook.service.ts @@ -125,6 +125,8 @@ export class WebhookService { }, }, workspaceId, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -155,6 +157,11 @@ export class WebhookService { input: UpdateWebhookInput, workspaceId: string, ): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const normalizedInput = { ...input, update: { @@ -190,6 +197,8 @@ export class WebhookService { }, }, workspaceId, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -217,6 +226,11 @@ export class WebhookService { } async delete(id: string, workspaceId: string): Promise { + const { workspaceCustomFlatApplication } = + await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( + { workspaceId }, + ); + const { flatWebhookMaps: existingFlatWebhookMaps } = await this.workspaceManyOrAllFlatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( { @@ -241,6 +255,8 @@ export class WebhookService { }, }, workspaceId, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/utils/compute-object-target-table.util.ts b/packages/twenty-server/src/engine/utils/compute-object-target-table.util.ts index ec3f3ffa46..03bb1c7f82 100644 --- a/packages/twenty-server/src/engine/utils/compute-object-target-table.util.ts +++ b/packages/twenty-server/src/engine/utils/compute-object-target-table.util.ts @@ -1,9 +1,12 @@ -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; import { computeTableName } from './compute-table-name.util'; export const computeObjectTargetTable = ( - objectMetadata: Pick, + objectMetadata: Pick< + UniversalFlatObjectMetadata, + 'nameSingular' | 'isCustom' + >, ) => { return computeTableName(objectMetadata.nameSingular, objectMetadata.isCustom); }; diff --git a/packages/twenty-server/src/engine/workspace-cache/types/workspace-cache-key.type.ts b/packages/twenty-server/src/engine/workspace-cache/types/workspace-cache-key.type.ts index 7b8639d729..d5bd781b84 100644 --- a/packages/twenty-server/src/engine/workspace-cache/types/workspace-cache-key.type.ts +++ b/packages/twenty-server/src/engine/workspace-cache/types/workspace-cache-key.type.ts @@ -7,10 +7,10 @@ import { type FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/ import { type FlatWorkspaceMemberMaps } from 'src/engine/core-modules/user/types/flat-workspace-member-maps.type'; import { type FlatRoleTargetByAgentIdMaps } from 'src/engine/metadata-modules/flat-agent/types/flat-role-target-by-agent-id-maps.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type LogicFunctionLayerCacheMaps } from 'src/engine/metadata-modules/logic-function-layer/types/logic-function-layer-cache-maps.type'; import { type UserWorkspaceRoleMap } from 'src/engine/metadata-modules/role-target/services/workspace-user-workspace-role-map-cache.service'; import { type FlatRowLevelPermissionPredicateGroupMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-group-maps.type'; import { type FlatRowLevelPermissionPredicateMaps } from 'src/engine/metadata-modules/row-level-permission-predicate/types/flat-row-level-permission-predicate-maps.type'; -import { type LogicFunctionLayerCacheMaps } from 'src/engine/metadata-modules/logic-function-layer/types/logic-function-layer-cache-maps.type'; export const WORKSPACE_CACHE_KEYS_V2 = { flatObjectMetadataMaps: 'flat-maps:object-metadata', @@ -64,7 +64,8 @@ export type AdditionalCacheDataMaps = { applicationVariableMaps: ApplicationVariableCacheMaps; }; -export type WorkspaceCacheDataMap = AllFlatEntityMaps & AdditionalCacheDataMaps; +export type WorkspaceCacheDataMap = AllFlatEntityMaps & + AdditionalCacheDataMaps; export type WorkspaceCacheKeyName = keyof WorkspaceCacheDataMap; diff --git a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/services/dev-seeder-permissions.service.ts b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/services/dev-seeder-permissions.service.ts index 9fab2822c4..0630800707 100644 --- a/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/services/dev-seeder-permissions.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/dev-seeder/core/services/dev-seeder-permissions.service.ts @@ -88,7 +88,7 @@ export class DevSeederPermissionsService { const guestRole = await this.roleService.createGuestRole({ workspaceId, - applicationId: twentyStandardFlatApplication.id, + ownerFlatApplication: twentyStandardFlatApplication, }); await this.userRoleService.assignRoleToManyUserWorkspace({ @@ -99,7 +99,7 @@ export class DevSeederPermissionsService { const limitedRole = await this.createLimitedRoleForSeedWorkspace({ workspaceId, - applicationId: twentyStandardFlatApplication.id, + ownerFlatApplication: twentyStandardFlatApplication, }); await this.userRoleService.assignRoleToManyUserWorkspace({ @@ -130,7 +130,7 @@ export class DevSeederPermissionsService { const memberRole = await this.roleService.createMemberRole({ workspaceId, - applicationId: twentyStandardFlatApplication.id, + ownerFlatApplication: twentyStandardFlatApplication, }); await this.coreDataSource @@ -150,14 +150,14 @@ export class DevSeederPermissionsService { } private async createLimitedRoleForSeedWorkspace({ - applicationId, + ownerFlatApplication, workspaceId, }: { workspaceId: string; - applicationId: string; + ownerFlatApplication: FlatApplication; }) { const customRole = await this.roleService.createRole({ - applicationId, + ownerFlatApplication, workspaceId, input: { label: 'Object-restricted', diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts index 0a6147e7db..6f5e47dc1b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service.ts @@ -123,6 +123,8 @@ export class TwentyStandardApplicationService { }, workspaceId, isSystemBuild: true, + applicationUniversalIdentifier: + workspaceCustomFlatApplication.universalIdentifier, }, ); @@ -194,6 +196,8 @@ export class TwentyStandardApplicationService { additionalCacheDataMaps: { featureFlagsMap, }, + applicationUniversalIdentifier: + twentyStandardFlatApplication.universalIdentifier, }, ); diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts index c2d3725b8f..46d06914d5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util.ts @@ -1,8 +1,8 @@ import { - type FieldMetadataDefaultValue, - type FieldMetadataSettings, type FieldMetadataComplexOption, type FieldMetadataDefaultOption, + type FieldMetadataDefaultValue, + type FieldMetadataSettings, type FieldMetadataType, } from 'twenty-shared/types'; import { v4 } from 'uuid'; @@ -110,6 +110,6 @@ export const createStandardFieldFlatMetadata = < kanbanAggregateOperationViewUniversalIdentifiers: [], calendarViewUniversalIdentifiers: [], mainGroupByFieldMetadataViewUniversalIdentifiers: [], - universalSettings: null, + universalSettings: settings ?? null, }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts index 0dafe4acd9..b8e387d1c1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util.ts @@ -133,6 +133,6 @@ export const createStandardRelationFieldFlatMetadata = < kanbanAggregateOperationViewUniversalIdentifiers: [], calendarViewUniversalIdentifiers: [], mainGroupByFieldMetadataViewUniversalIdentifiers: [], - universalSettings: null, + universalSettings: settings, }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts index b70cf766fa..7ded945526 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts @@ -121,7 +121,7 @@ export class WorkspaceManagerService { const memberRole = await this.roleService.createMemberRole({ workspaceId, - applicationId: workspaceCustomFlatApplication.id, + ownerFlatApplication: workspaceCustomFlatApplication, }); await this.workspaceRepository.update(workspaceId, { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-runner-exception-formatter.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-runner-exception-formatter.ts index 52915fa1b1..59e01d1deb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-runner-exception-formatter.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-runner-exception-formatter.ts @@ -23,6 +23,14 @@ export const workspaceMigrationRunnerExceptionFormatter = ( ...(isExecutionFailed && { action: error.action, errors: { + ...(error.errors?.actionTranspilation && { + actionTranspilation: { + message: error.errors.actionTranspilation.message, + code: + (error.errors.actionTranspilation as { code?: string })?.code ?? + 'INTERNAL_SERVER_ERROR', + }, + }), ...(error.errors?.metadata && { metadata: { message: error.errors.metadata.message, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts index 514cd83aba..058136ec6f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-build-orchestrator.service.ts @@ -124,6 +124,7 @@ export class WorkspaceMigrationBuildOrchestratorService { fromToAllFlatEntityMaps, dependencyAllFlatEntityMaps, additionalCacheDataMaps, + applicationUniversalIdentifier, }: WorkspaceMigrationOrchestratorBuildArgs): Promise< | WorkspaceMigrationOrchestratorFailedResult | WorkspaceMigrationOrchestratorSuccessfulResult @@ -985,6 +986,7 @@ export class WorkspaceMigrationBuildOrchestratorService { return { status: 'success', workspaceMigration: { + applicationUniversalIdentifier, actions: [ // Object and fields and indexes ...aggregatedOrchestratorActionsReport.index.delete, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service.ts index 886c0bc841..ce9f9c6784 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service.ts @@ -32,6 +32,7 @@ type ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs = { [P in AllMetadataName]?: FlatEntityToCreateDeleteUpdate

; }; isSystemBuild?: boolean; + applicationUniversalIdentifier: string; }; @Injectable() @@ -123,6 +124,7 @@ export class WorkspaceMigrationValidateBuildAndRunService { private async computeFromToAllFlatEntityMapsAndBuildOptions({ allFlatEntityOperationByMetadataName, workspaceId, + applicationUniversalIdentifier, }: ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs): Promise<{ fromToAllFlatEntityMaps: FromToAllFlatEntityMaps; inferDeletionFromMissingEntities: InferDeletionFromMissingEntities; @@ -136,6 +138,7 @@ export class WorkspaceMigrationValidateBuildAndRunService { } = await this.computeAllRelatedFlatEntityMaps({ allFlatEntityOperationByMetadataName, workspaceId, + applicationUniversalIdentifier, }); const fromToAllFlatEntityMaps: FromToAllFlatEntityMaps = {}; @@ -216,6 +219,7 @@ export class WorkspaceMigrationValidateBuildAndRunService { allFlatEntityOperationByMetadataName: allFlatEntities, workspaceId, isSystemBuild = false, + applicationUniversalIdentifier, }: ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs): Promise< WorkspaceMigrationOrchestratorFailedResult | undefined > { @@ -227,9 +231,11 @@ export class WorkspaceMigrationValidateBuildAndRunService { } = await this.computeFromToAllFlatEntityMapsAndBuildOptions({ allFlatEntityOperationByMetadataName: allFlatEntities, workspaceId, + applicationUniversalIdentifier, }); return await this.validateBuildAndRunWorkspaceMigrationFromTo({ + applicationUniversalIdentifier, buildOptions: { isSystemBuild, inferDeletionFromMissingEntities, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts index a93772d7b1..20163daef1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type.ts @@ -1,8 +1,7 @@ -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; export type AggregateOrchestratorActionsReportArgs = { orchestratorActionsReport: OrchestratorActionsReport; - flatFieldMetadataMaps?: FlatEntityMaps; + flatFieldMetadataMaps?: MetadataFlatEntityMaps<'fieldMetadata'>; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type.ts index 982e5fc4cf..aa53ae7161 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type.ts @@ -3,13 +3,13 @@ import { type FromTo } from 'twenty-shared/types'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { - type MetadataWorkspaceMigrationActionsRecord, + type MetadataUniversalWorkspaceMigrationActionsRecord, type WorkspaceMigrationActionType, } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; import { type WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-builder-additional-cache-data-maps.type'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; -import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; import { type WorkspaceMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration'; +import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-builder-options.type'; export type FromToAllFlatEntityMaps = { [P in keyof AllFlatEntityMaps]?: FromTo; @@ -21,6 +21,7 @@ export type WorkspaceMigrationOrchestratorBuildArgs = { fromToAllFlatEntityMaps: FromToAllFlatEntityMaps; dependencyAllFlatEntityMaps?: Partial; additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; + applicationUniversalIdentifier: string; }; export type OrchestratorFailureReport = { @@ -31,7 +32,7 @@ export type OrchestratorFailureReport = { }; export type OrchestratorActionsReport = { - [P in AllMetadataName]: MetadataWorkspaceMigrationActionsRecord

; + [P in AllMetadataName]: MetadataUniversalWorkspaceMigrationActionsRecord

; }; export type WorkspaceMigrationOrchestratorFailedResult = { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/contains-serialized-relation.type-test.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/contains-serialized-relation.type-test.ts deleted file mode 100644 index 2232377ecc..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/__tests__/contains-serialized-relation.type-test.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { type Equal, type Expect } from 'twenty-shared/testing'; -import { type SerializedRelation } from 'twenty-shared/types'; - -import { type ContainsSerializedRelation } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/contains-serialized-relation.type'; - -// eslint-disable-next-line @typescript-eslint/no-empty-object-type -type EmptyObject = {}; - -// ContainsSerializedRelation checks for SerializedRelation in object properties -// It recurses into nested objects and arrays, but stops at primitives - -// Direct property tests -// eslint-disable-next-line unused-imports/no-unused-vars -type DirectPropertyAssertions = [ - // Direct SerializedRelation property - Expect< - Equal, true> - >, - - // Nullable SerializedRelation property - Expect< - Equal< - ContainsSerializedRelation<{ targetId: SerializedRelation | null }>, - true - > - >, - - // Optional SerializedRelation property - Expect< - Equal, true> - >, - - // Array of SerializedRelation - Expect< - Equal, true> - >, - - // Plain properties only - no SerializedRelation - Expect< - Equal, false> - >, - - // Empty object - Expect, false>>, -]; - -// Nested object tests - should recurse -// eslint-disable-next-line unused-imports/no-unused-vars -type NestedObjectAssertions = [ - // Nested object with SerializedRelation - Expect< - Equal< - ContainsSerializedRelation<{ - nested: { targetId: SerializedRelation }; - }>, - true - > - >, - - // Deeply nested SerializedRelation - Expect< - Equal< - ContainsSerializedRelation<{ - level1: { level2: { level3: { id: SerializedRelation } } }; - }>, - true - > - >, - - // Nested object without SerializedRelation - Expect< - Equal< - ContainsSerializedRelation<{ - nested: { name: string; count: number }; - }>, - false - > - >, -]; - -// Nested array tests - should recurse -// eslint-disable-next-line unused-imports/no-unused-vars -type NestedArrayAssertions = [ - // Array of objects with SerializedRelation - Expect< - Equal< - ContainsSerializedRelation<{ - items: { targetId: SerializedRelation }[]; - }>, - true - > - >, - - // 2D array of SerializedRelation - Expect< - Equal, true> - >, - - // Array of plain objects - Expect< - Equal< - ContainsSerializedRelation<{ - items: { name: string }[]; - }>, - false - > - >, - - // 2D array of strings - Expect, false>>, -]; - -// Primitive types - should return false (not objects) -// eslint-disable-next-line unused-imports/no-unused-vars -type PrimitiveAssertions = [ - Expect, false>>, - Expect, false>>, - Expect, false>>, - Expect, false>>, - Expect, false>>, -]; - -// Real-world tests -// eslint-disable-next-line unused-imports/no-unused-vars -type RealWorldAssertions = [ - // Settings with SerializedRelation - Expect< - Equal< - ContainsSerializedRelation<{ - relationType?: string; - junctionTargetFieldId?: SerializedRelation; - }>, - true - > - >, - - // Workflow config with nested SerializedRelation in array - Expect< - Equal< - ContainsSerializedRelation<{ - steps: { assigneeId: SerializedRelation; action: string }[]; - }>, - true - > - >, -]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/contains-serialized-relation.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/contains-serialized-relation.type.ts deleted file mode 100644 index 5964365db8..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/contains-serialized-relation.type.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - type IsEmptyObject, - type IsNever, - type IsSerializedRelation, -} from 'twenty-shared/types'; - -type ContainsSerializedRelationInner = T extends unknown - ? IsNever extends true - ? false - : unknown extends T - ? false - : IsSerializedRelation extends true - ? true - : T extends readonly (infer U)[] - ? ContainsSerializedRelationInner - : T extends object - ? IsEmptyObject extends true - ? false - : ContainsSerializedRelationInner - : false - : never; - -export type ContainsSerializedRelation = - true extends ContainsSerializedRelationInner ? true : false; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type.ts index a34f7aab0b..ae7c348b77 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type.ts @@ -8,7 +8,6 @@ import { type FromMetadataEntityToMetadataName } from 'src/engine/metadata-modul import { type MetadataManyToOneJoinColumn } from 'src/engine/metadata-modules/flat-entity/types/metadata-many-to-one-join-column.type'; import { type SyncableEntity } from 'src/engine/workspace-manager/types/syncable-entity.interface'; import { type AllJsonbPropertiesWithSerializedPropertiesForMetadataName } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/constants/all-jsonb-properties-with-serialized-relation-by-metadata-name.constant'; -import { type ContainsSerializedRelation } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/contains-serialized-relation.type'; import { type FormatRecordSerializedRelationProperties } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/format-record-serialized-relation-properties.type'; export type UniversalSyncableFlatEntity = Omit< @@ -33,11 +32,9 @@ export type UniversalFlatEntityExtraProperties< } & { [P in AllJsonbPropertiesWithSerializedPropertiesForMetadataName & keyof TEntity & - string as `universal${Capitalize

}`]: true extends ContainsSerializedRelation< - NonNullable - > - ? FormatRecordSerializedRelationProperties - : null; + string as `universal${Capitalize

}`]: FormatRecordSerializedRelationProperties< + TEntity[P] + >; }; export type UniversalFlatEntityFrom< diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type.ts new file mode 100644 index 0000000000..a8fb084ea2 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type.ts @@ -0,0 +1,12 @@ +import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type'; + +export type UniversalFlatObjectMetadata = UniversalFlatEntityFrom< + Omit, + 'objectMetadata' +> & { + // NOTE: below fields are not reflected on the final UniversalFlatEntity either they should we should define a common source + // TODO remove once https://github.com/twentyhq/core-team-issues/issues/2172 has been resolved + labelIdentifierFieldMetadataUniversalIdentifier: string | null; + imageIdentifierFieldMetadataUniversalIdentifier: string | null; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/__snapshots__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/__snapshots__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap index ed2ae33435..1c06128c69 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/__snapshots__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/__snapshots__/flat-entity-deleted-created-updated-matrix-dispatcher.util.spec.ts.snap @@ -153,6 +153,7 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect an upd "updatedFlatEntityMaps": { "byId": { "field-id-1": { + "universalIdentifier": "universal-identifier-1", "updates": [ { "from": false, @@ -283,6 +284,7 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create "updatedFlatEntityMaps": { "byId": { "field-id-1": { + "universalIdentifier": "universal-identifier-1", "updates": [ { "from": true, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-non-relation-fields-into-object-actions.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-non-relation-fields-into-object-actions.util.spec.ts new file mode 100644 index 0000000000..a8af6529f3 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-non-relation-fields-into-object-actions.util.spec.ts @@ -0,0 +1,278 @@ +import { FieldMetadataType } from 'twenty-shared/types'; + +import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock'; +import { createEmptyOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/constant/empty-orchestrator-actions-report.constant'; +import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; +import { aggregateNonRelationFieldsIntoObjectActions } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-non-relation-fields-into-object-actions.util'; +import { type UniversalCreateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; +import { type UniversalCreateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; + +describe('aggregateNonRelationFieldsIntoObjectActions', () => { + it('should merge non-relation fields into matching create-object actions', () => { + const objectUniversalId = 'object-1'; + const fieldUniversalId = 'field-1'; + + const input: OrchestratorActionsReport = { + ...createEmptyOrchestratorActionsReport(), + objectMetadata: { + create: [ + { + type: 'create', + metadataName: 'objectMetadata', + flatEntity: getFlatObjectMetadataMock({ + universalIdentifier: objectUniversalId, + nameSingular: 'testObject', + namePlural: 'testObjects', + }), + universalFlatFieldMetadatas: [], + } satisfies UniversalCreateObjectAction, + ], + update: [], + delete: [], + }, + fieldMetadata: { + create: [ + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: fieldUniversalId, + objectMetadataId: 'object-metadata-id', + objectMetadataUniversalIdentifier: objectUniversalId, + type: FieldMetadataType.TEXT, + name: 'testField', + }), + ], + fieldIdByUniversalIdentifier: { + [fieldUniversalId]: 'generated-field-id', + }, + } satisfies UniversalCreateFieldAction, + ], + update: [], + delete: [], + }, + }; + + const result = aggregateNonRelationFieldsIntoObjectActions({ + orchestratorActionsReport: input, + }); + + // Field should be merged into object action + expect(result.objectMetadata.create).toMatchObject([ + { + universalFlatFieldMetadatas: [ + { universalIdentifier: fieldUniversalId }, + ], + fieldIdByUniversalIdentifier: { + [fieldUniversalId]: 'generated-field-id', + }, + }, + ]); + + // No remaining field actions + expect(result.fieldMetadata.create).toHaveLength(0); + }); + + it('should keep relation fields in separate create-field actions', () => { + const objectUniversalId = 'object-1'; + const relationFieldUniversalId = 'relation-field-1'; + const targetFieldUniversalId = 'target-field-1'; + + const input: OrchestratorActionsReport = { + ...createEmptyOrchestratorActionsReport(), + objectMetadata: { + create: [ + { + type: 'create', + metadataName: 'objectMetadata', + flatEntity: getFlatObjectMetadataMock({ + universalIdentifier: objectUniversalId, + nameSingular: 'testObject', + namePlural: 'testObjects', + }), + universalFlatFieldMetadatas: [], + } satisfies UniversalCreateObjectAction, + ], + update: [], + delete: [], + }, + fieldMetadata: { + create: [ + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: relationFieldUniversalId, + objectMetadataId: 'object-metadata-id', + objectMetadataUniversalIdentifier: objectUniversalId, + type: FieldMetadataType.RELATION, + name: 'relationField', + relationTargetFieldMetadataUniversalIdentifier: + targetFieldUniversalId, + relationTargetObjectMetadataUniversalIdentifier: 'other-object', + }), + ], + fieldIdByUniversalIdentifier: { + [relationFieldUniversalId]: 'generated-relation-field-id', + }, + } satisfies UniversalCreateFieldAction, + ], + update: [], + delete: [], + }, + }; + + const result = aggregateNonRelationFieldsIntoObjectActions({ + orchestratorActionsReport: input, + }); + + // Object action should have no fields merged + expect(result.objectMetadata.create).toMatchObject([ + { universalFlatFieldMetadatas: [] }, + ]); + + // Relation field should remain in field actions + expect(result.fieldMetadata.create).toMatchObject([ + { + universalFlatFieldMetadatas: [ + { universalIdentifier: relationFieldUniversalId }, + ], + }, + ]); + }); + + it('should keep fields for existing objects in separate create-field actions', () => { + const existingObjectUniversalId = 'existing-object'; + const fieldUniversalId = 'field-for-existing-object'; + + const input: OrchestratorActionsReport = { + ...createEmptyOrchestratorActionsReport(), + objectMetadata: { + create: [], // No objects being created + update: [], + delete: [], + }, + fieldMetadata: { + create: [ + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: fieldUniversalId, + objectMetadataId: 'existing-object-metadata-id', + objectMetadataUniversalIdentifier: existingObjectUniversalId, + type: FieldMetadataType.TEXT, + name: 'fieldForExistingObject', + }), + ], + fieldIdByUniversalIdentifier: { + [fieldUniversalId]: 'generated-field-id', + }, + } satisfies UniversalCreateFieldAction, + ], + update: [], + delete: [], + }, + }; + + const result = aggregateNonRelationFieldsIntoObjectActions({ + orchestratorActionsReport: input, + }); + + // No object actions + expect(result.objectMetadata.create).toHaveLength(0); + + // Field should remain in field actions (no matching object to merge into) + expect(result.fieldMetadata.create).toMatchObject([ + { + universalFlatFieldMetadatas: [ + { universalIdentifier: fieldUniversalId }, + ], + }, + ]); + }); + + it('should handle mixed relation and non-relation fields', () => { + const objectUniversalId = 'object-1'; + const textFieldUniversalId = 'text-field'; + const relationFieldUniversalId = 'relation-field'; + + const input: OrchestratorActionsReport = { + ...createEmptyOrchestratorActionsReport(), + objectMetadata: { + create: [ + { + type: 'create', + metadataName: 'objectMetadata', + flatEntity: getFlatObjectMetadataMock({ + universalIdentifier: objectUniversalId, + nameSingular: 'testObject', + namePlural: 'testObjects', + }), + universalFlatFieldMetadatas: [], + } satisfies UniversalCreateObjectAction, + ], + update: [], + delete: [], + }, + fieldMetadata: { + create: [ + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: textFieldUniversalId, + objectMetadataId: 'object-metadata-id', + objectMetadataUniversalIdentifier: objectUniversalId, + type: FieldMetadataType.TEXT, + name: 'textField', + }), + getFlatFieldMetadataMock({ + universalIdentifier: relationFieldUniversalId, + objectMetadataId: 'object-metadata-id', + objectMetadataUniversalIdentifier: objectUniversalId, + type: FieldMetadataType.RELATION, + name: 'relationField', + relationTargetFieldMetadataUniversalIdentifier: 'target-field', + relationTargetObjectMetadataUniversalIdentifier: 'other-object', + }), + ], + fieldIdByUniversalIdentifier: { + [textFieldUniversalId]: 'text-field-id', + [relationFieldUniversalId]: 'relation-field-id', + }, + } satisfies UniversalCreateFieldAction, + ], + update: [], + delete: [], + }, + }; + + const result = aggregateNonRelationFieldsIntoObjectActions({ + orchestratorActionsReport: input, + }); + + // Text field should be merged into object action + expect(result.objectMetadata.create).toMatchObject([ + { + universalFlatFieldMetadatas: [ + { universalIdentifier: textFieldUniversalId }, + ], + }, + ]); + + // Relation field should remain in field actions + expect(result.fieldMetadata.create).toMatchObject([ + { + universalFlatFieldMetadatas: [ + { universalIdentifier: relationFieldUniversalId }, + ], + }, + ]); + }); +}); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.spec.ts deleted file mode 100644 index e4bbc4b632..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.spec.ts +++ /dev/null @@ -1,491 +0,0 @@ -import { - eachTestingContextFilter, - type EachTestingContext, -} from 'twenty-shared/testing'; -import { FieldMetadataType } from 'twenty-shared/types'; - -import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; -import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock'; -import { createEmptyOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/constant/empty-orchestrator-actions-report.constant'; -import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; -import { aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util'; -import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; -import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; - -type CreateAggregationTestCase = EachTestingContext<{ - input: OrchestratorActionsReport; - expected: { - expectCreateFieldActionPerObjectMetadataId: Record; - expectCreateObjectActionPerObjectMetadataId: Record; - }; -}>; -describe('aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions', () => { - const testCases: CreateAggregationTestCase[] = [ - { - title: - 'should aggregate single object with multiple fields into one object action', - context: { - input: { - ...createEmptyOrchestratorActionsReport(), - objectMetadata: { - create: [ - { - type: 'create', - metadataName: 'objectMetadata', - flatEntity: getFlatObjectMetadataMock({ - universalIdentifier: 'object-1', - id: 'object-1', - nameSingular: 'user', - namePlural: 'users', - }), - flatFieldMetadatas: [], - } satisfies CreateObjectAction, - ], - update: [], - delete: [], - }, - fieldMetadata: { - create: [ - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-1', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-1', - name: 'firstName', - }), - getFlatFieldMetadataMock({ - universalIdentifier: 'field-2', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-2', - name: 'lastName', - }), - ], - } satisfies CreateFieldAction, - ], - update: [], - delete: [], - }, - } satisfies OrchestratorActionsReport, - expected: { - expectCreateFieldActionPerObjectMetadataId: {}, - expectCreateObjectActionPerObjectMetadataId: { - 'object-1': 1, - }, - }, - }, - }, - { - title: - 'should keep separate field actions when no matching object action exists', - context: { - input: { - ...createEmptyOrchestratorActionsReport(), - objectMetadata: { - create: [], - update: [], - delete: [], - }, - fieldMetadata: { - create: [ - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-1', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-1', - name: 'firstName', - }), - ], - } satisfies CreateFieldAction, - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-2', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-2', - name: 'secondName', - }), - ], - } satisfies CreateFieldAction, - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-3', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-3', - name: 'lastName', - }), - ], - } satisfies CreateFieldAction, - ], - update: [], - delete: [], - }, - } satisfies OrchestratorActionsReport, - expected: { - expectCreateFieldActionPerObjectMetadataId: { - 'object-1': 1, - }, - expectCreateObjectActionPerObjectMetadataId: {}, - }, - }, - }, - { - title: 'should handle multiple objects with their respective fields', - context: { - input: { - ...createEmptyOrchestratorActionsReport(), - objectMetadata: { - create: [ - { - type: 'create', - metadataName: 'objectMetadata', - flatEntity: getFlatObjectMetadataMock({ - universalIdentifier: 'object-1', - id: 'object-1', - nameSingular: 'user', - namePlural: 'users', - }), - flatFieldMetadatas: [], - } satisfies CreateObjectAction, - { - type: 'create', - metadataName: 'objectMetadata', - flatEntity: getFlatObjectMetadataMock({ - universalIdentifier: 'object-2', - id: 'object-2', - nameSingular: 'company', - namePlural: 'companies', - }), - flatFieldMetadatas: [], - } satisfies CreateObjectAction, - ], - update: [], - delete: [], - }, - fieldMetadata: { - create: [ - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-1', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-1', - name: 'firstName', - }), - ], - } satisfies CreateFieldAction, - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-2', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-2', - objectMetadataId: 'object-2', - type: FieldMetadataType.TEXT, - id: 'field-2', - name: 'name', - }), - getFlatFieldMetadataMock({ - universalIdentifier: 'field-3', - objectMetadataId: 'object-2', - type: FieldMetadataType.TEXT, - id: 'field-3', - name: 'industry', - }), - ], - } satisfies CreateFieldAction, - ], - update: [], - delete: [], - }, - } satisfies OrchestratorActionsReport, - expected: { - expectCreateFieldActionPerObjectMetadataId: {}, - expectCreateObjectActionPerObjectMetadataId: { - 'object-1': 1, - 'object-2': 1, - }, - }, - }, - }, - { - title: - 'should handle mixed scenario with some fields merged and some kept separate', - context: { - input: { - ...createEmptyOrchestratorActionsReport(), - objectMetadata: { - create: [ - { - type: 'create', - metadataName: 'objectMetadata', - flatEntity: getFlatObjectMetadataMock({ - universalIdentifier: 'object-1', - id: 'object-1', - nameSingular: 'user', - namePlural: 'users', - }), - flatFieldMetadatas: [], - } satisfies CreateObjectAction, - ], - update: [], - delete: [], - }, - fieldMetadata: { - create: [ - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-1', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-1', - name: 'firstName', - }), - ], - } satisfies CreateFieldAction, - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-2', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-2', - objectMetadataId: 'object-2', - type: FieldMetadataType.TEXT, - id: 'field-2', - name: 'orphanField', - }), - ], - } satisfies CreateFieldAction, - ], - update: [], - delete: [], - }, - } satisfies OrchestratorActionsReport, - expected: { - expectCreateFieldActionPerObjectMetadataId: { - 'object-2': 1, - }, - expectCreateObjectActionPerObjectMetadataId: { - 'object-1': 1, - }, - }, - }, - }, - { - title: - 'should aggregate multiple field actions for the same object when no create object action exists', - context: { - input: { - ...createEmptyOrchestratorActionsReport(), - objectMetadata: { - create: [], - update: [], - delete: [], - }, - fieldMetadata: { - create: [ - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-1', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-1', - name: 'firstName', - }), - ], - } satisfies CreateFieldAction, - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-2', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-2', - name: 'lastName', - }), - ], - } satisfies CreateFieldAction, - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-3', - objectMetadataId: 'object-1', - type: FieldMetadataType.TEXT, - id: 'field-3', - name: 'email', - }), - ], - } satisfies CreateFieldAction, - ], - update: [], - delete: [], - }, - } satisfies OrchestratorActionsReport, - expected: { - expectCreateFieldActionPerObjectMetadataId: { - 'object-1': 1, - }, - expectCreateObjectActionPerObjectMetadataId: {}, - }, - }, - }, - { - title: 'should handle empty actions report', - context: { - input: createEmptyOrchestratorActionsReport(), - expected: { - expectCreateFieldActionPerObjectMetadataId: {}, - expectCreateObjectActionPerObjectMetadataId: {}, - }, - }, - }, - { - title: - 'should not merge create_field actions containing relation fields into create_object', - context: { - input: { - ...createEmptyOrchestratorActionsReport(), - objectMetadata: { - create: [ - { - type: 'create', - metadataName: 'objectMetadata', - flatEntity: getFlatObjectMetadataMock({ - universalIdentifier: 'object-1', - id: 'object-1', - nameSingular: 'attachment', - namePlural: 'attachments', - }), - flatFieldMetadatas: [], - } satisfies CreateObjectAction, - ], - update: [], - delete: [], - }, - fieldMetadata: { - create: [ - { - type: 'create', - metadataName: 'fieldMetadata', - objectMetadataId: 'object-1', - flatFieldMetadatas: [ - getFlatFieldMetadataMock({ - universalIdentifier: 'field-1', - objectMetadataId: 'object-1', - type: FieldMetadataType.RELATION, - id: 'field-1', - name: 'author', - }), - ], - } satisfies CreateFieldAction, - ], - update: [], - delete: [], - }, - } satisfies OrchestratorActionsReport, - expected: { - expectCreateFieldActionPerObjectMetadataId: { - 'object-1': 1, - }, - expectCreateObjectActionPerObjectMetadataId: { - 'object-1': 1, - }, - }, - }, - }, - ]; - - test.each(eachTestingContextFilter(testCases))( - '$title', - ({ context: { input, expected } }) => { - const result = - aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions({ - orchestratorActionsReport: input, - }); - - const fieldActions = result.fieldMetadata.create as CreateFieldAction[]; - const fieldActionCounts = fieldActions.reduce( - (acc, action) => { - acc[action.objectMetadataId] = - (acc[action.objectMetadataId] || 0) + 1; - - return acc; - }, - {} as Record, - ); - - const objectActions = result.objectMetadata - .create as CreateObjectAction[]; - const objectActionCounts = objectActions.reduce( - (acc, action) => { - acc[action.flatEntity.id] = (acc[action.flatEntity.id] || 0) + 1; - - return acc; - }, - {} as Record, - ); - - Object.entries( - expected.expectCreateFieldActionPerObjectMetadataId, - ).forEach(([objectId, expectedCount]) => { - expect(fieldActionCounts[objectId]).toBe(expectedCount); - }); - - Object.entries( - expected.expectCreateObjectActionPerObjectMetadataId, - ).forEach(([objectId, expectedCount]) => { - expect(objectActionCounts[objectId]).toBe(expectedCount); - }); - - // Check total counts - const expectedTotalFieldActions = Object.values( - expected.expectCreateFieldActionPerObjectMetadataId, - ).reduce((sum, count) => sum + count, 0); - const expectedTotalObjectActions = Object.values( - expected.expectCreateObjectActionPerObjectMetadataId, - ).reduce((sum, count) => sum + count, 0); - - expect(fieldActions).toHaveLength(expectedTotalFieldActions); - expect(objectActions).toHaveLength(expectedTotalObjectActions); - }, - ); -}); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.spec.ts index f3dd7ab2ea..fa273db736 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.spec.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.spec.ts @@ -8,7 +8,7 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-m import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; import { createEmptyOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/constant/empty-orchestrator-actions-report.constant'; import { aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldActions } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util'; -import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; +import { type UniversalUpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; describe('aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldActions', () => { it('should move searchVector update actions to the end of the update list', () => { @@ -20,7 +20,7 @@ describe('aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldA { type: 'update', metadataName: 'fieldMetadata', - entityId: 'search-vector-field-1', + universalIdentifier: 'search-vector-field-1', updates: [ { property: 'label', @@ -28,11 +28,11 @@ describe('aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldA to: 'Updated Search Vector', }, ], - } satisfies UpdateFieldAction, + } satisfies UniversalUpdateFieldAction, { type: 'update', metadataName: 'fieldMetadata', - entityId: 'regular-field-1', + universalIdentifier: 'regular-field-1', updates: [ { property: 'label', @@ -40,11 +40,11 @@ describe('aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldA to: 'Updated First Name', }, ], - } satisfies UpdateFieldAction, + } satisfies UniversalUpdateFieldAction, { type: 'update', metadataName: 'fieldMetadata', - entityId: 'regular-field-2', + universalIdentifier: 'regular-field-2', updates: [ { property: 'label', @@ -52,7 +52,7 @@ describe('aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldA to: 'Updated Last Name', }, ], - } satisfies UpdateFieldAction, + } satisfies UniversalUpdateFieldAction, ], delete: [], }, @@ -98,11 +98,13 @@ describe('aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldA ); const updateFieldActions = result.fieldMetadata - .update as UpdateFieldAction[]; + .update as UniversalUpdateFieldAction[]; - const actualEntityIds = updateFieldActions.map((action) => action.entityId); + const actualUniversalIdentifiers = updateFieldActions.map( + (action) => action.universalIdentifier, + ); - expect(actualEntityIds).toEqual([ + expect(actualUniversalIdentifiers).toEqual([ 'regular-field-1', 'regular-field-2', 'search-vector-field-1', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-relation-field-pairs.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-relation-field-pairs.util.spec.ts new file mode 100644 index 0000000000..a7cd724585 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/__tests__/aggregate-relation-field-pairs.util.spec.ts @@ -0,0 +1,282 @@ +import { FieldMetadataType } from 'twenty-shared/types'; + +import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { createEmptyOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/constant/empty-orchestrator-actions-report.constant'; +import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; +import { aggregateRelationFieldPairs } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-relation-field-pairs.util'; +import { type UniversalCreateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; + +describe('aggregateRelationFieldPairs', () => { + it('should bundle relation field pairs into single action with merged fieldIdByUniversalIdentifier', () => { + const attachmentObjectId = 'attachment-object'; + const taskObjectId = 'task-object'; + const targetTaskFieldId = 'target-task-field'; + const attachmentsFieldId = 'attachments-field'; + + const input: OrchestratorActionsReport = { + ...createEmptyOrchestratorActionsReport(), + fieldMetadata: { + create: [ + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: targetTaskFieldId, + objectMetadataId: 'attachment-object-metadata-id', + objectMetadataUniversalIdentifier: attachmentObjectId, + type: FieldMetadataType.RELATION, + name: 'targetTask', + relationTargetFieldMetadataUniversalIdentifier: + attachmentsFieldId, + relationTargetObjectMetadataUniversalIdentifier: taskObjectId, + }), + ], + fieldIdByUniversalIdentifier: { + [targetTaskFieldId]: 'target-task-generated-id', + }, + } satisfies UniversalCreateFieldAction, + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: attachmentsFieldId, + objectMetadataId: 'task-object-metadata-id', + objectMetadataUniversalIdentifier: taskObjectId, + type: FieldMetadataType.RELATION, + name: 'attachments', + relationTargetFieldMetadataUniversalIdentifier: + targetTaskFieldId, + relationTargetObjectMetadataUniversalIdentifier: + attachmentObjectId, + }), + ], + fieldIdByUniversalIdentifier: { + [attachmentsFieldId]: 'attachments-generated-id', + }, + } satisfies UniversalCreateFieldAction, + ], + update: [], + delete: [], + }, + }; + + const result = aggregateRelationFieldPairs({ + orchestratorActionsReport: input, + }); + + // Should be bundled into a single action with both fields and merged ID map + expect(result.fieldMetadata.create).toMatchObject([ + { + universalFlatFieldMetadatas: [ + { universalIdentifier: targetTaskFieldId }, + { universalIdentifier: attachmentsFieldId }, + ], + fieldIdByUniversalIdentifier: { + [targetTaskFieldId]: 'target-task-generated-id', + [attachmentsFieldId]: 'attachments-generated-id', + }, + }, + ]); + }); + + it('should keep standalone fields (no relation target) as separate actions', () => { + const fieldUniversalId = 'standalone-field'; + const objectUniversalId = 'some-object'; + + const input: OrchestratorActionsReport = { + ...createEmptyOrchestratorActionsReport(), + fieldMetadata: { + create: [ + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: fieldUniversalId, + objectMetadataId: 'some-object-metadata-id', + objectMetadataUniversalIdentifier: objectUniversalId, + type: FieldMetadataType.TEXT, + name: 'standaloneField', + }), + ], + fieldIdByUniversalIdentifier: { + [fieldUniversalId]: 'standalone-field-id', + }, + } satisfies UniversalCreateFieldAction, + ], + update: [], + delete: [], + }, + }; + + const result = aggregateRelationFieldPairs({ + orchestratorActionsReport: input, + }); + + // Should remain as single action + expect(result.fieldMetadata.create).toMatchObject([ + { + universalFlatFieldMetadatas: [ + { universalIdentifier: fieldUniversalId }, + ], + }, + ]); + }); + + it('should handle relation field with target not being created (existing field)', () => { + const relationFieldId = 'new-relation-field'; + const existingTargetFieldId = 'existing-target-field'; + const objectUniversalId = 'some-object'; + + const input: OrchestratorActionsReport = { + ...createEmptyOrchestratorActionsReport(), + fieldMetadata: { + create: [ + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: relationFieldId, + objectMetadataId: 'some-object-metadata-id', + objectMetadataUniversalIdentifier: objectUniversalId, + type: FieldMetadataType.RELATION, + name: 'relationToExisting', + relationTargetFieldMetadataUniversalIdentifier: + existingTargetFieldId, + relationTargetObjectMetadataUniversalIdentifier: 'other-object', + }), + ], + fieldIdByUniversalIdentifier: { + [relationFieldId]: 'new-relation-field-id', + }, + } satisfies UniversalCreateFieldAction, + ], + update: [], + delete: [], + }, + }; + + const result = aggregateRelationFieldPairs({ + orchestratorActionsReport: input, + }); + + // Should remain as single action (target not being created) + expect(result.fieldMetadata.create).toMatchObject([ + { + universalFlatFieldMetadatas: [{ universalIdentifier: relationFieldId }], + }, + ]); + }); + + it('should handle multiple independent relation pairs', () => { + const pair1FieldA = 'pair1-field-a'; + const pair1FieldB = 'pair1-field-b'; + const pair2FieldA = 'pair2-field-a'; + const pair2FieldB = 'pair2-field-b'; + + const input: OrchestratorActionsReport = { + ...createEmptyOrchestratorActionsReport(), + fieldMetadata: { + create: [ + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: pair1FieldA, + objectMetadataId: 'object-1-metadata-id', + objectMetadataUniversalIdentifier: 'object-1', + type: FieldMetadataType.RELATION, + name: 'pair1FieldA', + relationTargetFieldMetadataUniversalIdentifier: pair1FieldB, + relationTargetObjectMetadataUniversalIdentifier: 'object-2', + }), + ], + fieldIdByUniversalIdentifier: { [pair1FieldA]: 'id-1a' }, + } satisfies UniversalCreateFieldAction, + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: pair1FieldB, + objectMetadataId: 'object-2-metadata-id', + objectMetadataUniversalIdentifier: 'object-2', + type: FieldMetadataType.RELATION, + name: 'pair1FieldB', + relationTargetFieldMetadataUniversalIdentifier: pair1FieldA, + relationTargetObjectMetadataUniversalIdentifier: 'object-1', + }), + ], + fieldIdByUniversalIdentifier: { [pair1FieldB]: 'id-1b' }, + } satisfies UniversalCreateFieldAction, + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: pair2FieldA, + objectMetadataId: 'object-3-metadata-id', + objectMetadataUniversalIdentifier: 'object-3', + type: FieldMetadataType.RELATION, + name: 'pair2FieldA', + relationTargetFieldMetadataUniversalIdentifier: pair2FieldB, + relationTargetObjectMetadataUniversalIdentifier: 'object-4', + }), + ], + fieldIdByUniversalIdentifier: { [pair2FieldA]: 'id-2a' }, + } satisfies UniversalCreateFieldAction, + { + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: [ + getFlatFieldMetadataMock({ + universalIdentifier: pair2FieldB, + objectMetadataId: 'object-4-metadata-id', + objectMetadataUniversalIdentifier: 'object-4', + type: FieldMetadataType.RELATION, + name: 'pair2FieldB', + relationTargetFieldMetadataUniversalIdentifier: pair2FieldA, + relationTargetObjectMetadataUniversalIdentifier: 'object-3', + }), + ], + fieldIdByUniversalIdentifier: { [pair2FieldB]: 'id-2b' }, + } satisfies UniversalCreateFieldAction, + ], + update: [], + delete: [], + }, + }; + + const result = aggregateRelationFieldPairs({ + orchestratorActionsReport: input, + }); + + // Should result in 2 bundled actions (one per pair), each with merged fieldIdByUniversalIdentifier + expect(result.fieldMetadata.create).toMatchObject([ + { + universalFlatFieldMetadatas: [ + { universalIdentifier: pair1FieldA }, + { universalIdentifier: pair1FieldB }, + ], + fieldIdByUniversalIdentifier: { + [pair1FieldA]: 'id-1a', + [pair1FieldB]: 'id-1b', + }, + }, + { + universalFlatFieldMetadatas: [ + { universalIdentifier: pair2FieldA }, + { universalIdentifier: pair2FieldB }, + ], + fieldIdByUniversalIdentifier: { + [pair2FieldA]: 'id-2a', + [pair2FieldB]: 'id-2b', + }, + }, + ]); + }); +}); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-non-relation-fields-into-object-actions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-non-relation-fields-into-object-actions.util.ts new file mode 100644 index 0000000000..1f28af8f42 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-non-relation-fields-into-object-actions.util.ts @@ -0,0 +1,106 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { isMorphOrRelationUniversalFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; +import { type AggregateOrchestratorActionsReportArgs } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type'; +import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { mergeFieldIdByUniversalIdentifier } from 'src/engine/workspace-manager/workspace-migration/utils/merge-field-id-by-universal-identifier.util'; +import { type UniversalCreateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; +import { type UniversalCreateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; + +export const aggregateNonRelationFieldsIntoObjectActions = ({ + orchestratorActionsReport, +}: AggregateOrchestratorActionsReportArgs): OrchestratorActionsReport => { + const createObjectActions = orchestratorActionsReport.objectMetadata.create; + const createFieldActions = orchestratorActionsReport.fieldMetadata.create; + + const createObjectActionByObjectUniversalIdentifier = new Map< + string, + UniversalCreateObjectAction + >(); + + for (const createObjectAction of createObjectActions) { + createObjectActionByObjectUniversalIdentifier.set( + createObjectAction.flatEntity.universalIdentifier, + createObjectAction, + ); + } + + const remainingCreateFieldActions: UniversalCreateFieldAction[] = []; + + for (const createFieldAction of createFieldActions) { + const nonRelationFields: UniversalFlatFieldMetadata[] = []; + const relationFields: UniversalFlatFieldMetadata[] = []; + + for (const field of createFieldAction.universalFlatFieldMetadatas) { + if (isMorphOrRelationUniversalFlatFieldMetadata(field)) { + relationFields.push(field); + } else { + nonRelationFields.push(field); + } + } + + const nonRelationFieldsByObjectUniversalIdentifier = new Map< + string, + UniversalFlatFieldMetadata[] + >(); + + for (const field of nonRelationFields) { + const objectUniversalId = field.objectMetadataUniversalIdentifier; + const existing = + nonRelationFieldsByObjectUniversalIdentifier.get(objectUniversalId); + + if (isDefined(existing)) { + existing.push(field); + } else { + nonRelationFieldsByObjectUniversalIdentifier.set(objectUniversalId, [ + field, + ]); + } + } + + const unmergedNonRelationFields: UniversalFlatFieldMetadata[] = []; + + for (const [ + objectUniversalId, + fields, + ] of nonRelationFieldsByObjectUniversalIdentifier) { + const matchingObjectAction = + createObjectActionByObjectUniversalIdentifier.get(objectUniversalId); + + if (isDefined(matchingObjectAction)) { + matchingObjectAction.universalFlatFieldMetadatas.push(...fields); + matchingObjectAction.fieldIdByUniversalIdentifier = + mergeFieldIdByUniversalIdentifier( + matchingObjectAction.fieldIdByUniversalIdentifier, + createFieldAction.fieldIdByUniversalIdentifier, + ); + } else { + unmergedNonRelationFields.push(...fields); + } + } + + const remainingFields = [...unmergedNonRelationFields, ...relationFields]; + + if (remainingFields.length > 0) { + remainingCreateFieldActions.push({ + ...createFieldAction, + universalFlatFieldMetadatas: remainingFields, + }); + } + } + + return { + ...orchestratorActionsReport, + objectMetadata: { + ...orchestratorActionsReport.objectMetadata, + create: Array.from( + createObjectActionByObjectUniversalIdentifier.values(), + ), + }, + fieldMetadata: { + ...orchestratorActionsReport.fieldMetadata, + create: remainingCreateFieldActions, + }, + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.ts deleted file mode 100644 index a863a0e21f..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { isDefined } from 'twenty-shared/utils'; - -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; -import { type AggregateOrchestratorActionsReportArgs } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type'; -import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; -import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; -import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; - -type AggregatedActions = { - createdFieldActionByObjectMetadataId: Record; - createdObjectActionByObjectMetadataId: Record; -}; - -export const aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions = - ({ - orchestratorActionsReport, - }: AggregateOrchestratorActionsReportArgs): OrchestratorActionsReport => { - const initialCreatedObjectActionByObjectMetadataId = ( - orchestratorActionsReport.objectMetadata.create as CreateObjectAction[] - ).reduce( - (acc, createObjectAction) => ({ - ...acc, - [createObjectAction.flatEntity.id]: createObjectAction, - }), - {} as Record, - ); - const initialAccumulator: AggregatedActions = { - createdFieldActionByObjectMetadataId: {}, - createdObjectActionByObjectMetadataId: - initialCreatedObjectActionByObjectMetadataId, - }; - - const { - createdFieldActionByObjectMetadataId, - createdObjectActionByObjectMetadataId, - } = ( - orchestratorActionsReport.fieldMetadata.create as CreateFieldAction[] - ).reduce( - ( - { - createdObjectActionByObjectMetadataId, - createdFieldActionByObjectMetadataId, - }, - createFieldAction, - ) => { - const existingCreateObjectAction = - createdObjectActionByObjectMetadataId[ - createFieldAction.objectMetadataId - ]; - - const existingCreateFieldAction = - createdFieldActionByObjectMetadataId[ - createFieldAction.objectMetadataId - ]; - - const initialAccumulator: { - morphOrRelationFlatFieldMetadatas: FlatFieldMetadata[]; - otherFlatFieldMetadatas: FlatFieldMetadata[]; - } = { - morphOrRelationFlatFieldMetadatas: [], - otherFlatFieldMetadatas: [], - }; - const { morphOrRelationFlatFieldMetadatas, otherFlatFieldMetadatas } = - createFieldAction.flatFieldMetadatas.reduce( - (acc, flatFieldMetadata) => { - if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) { - return { - ...acc, - morphOrRelationFlatFieldMetadatas: [ - ...acc.morphOrRelationFlatFieldMetadatas, - flatFieldMetadata, - ], - }; - } - - return { - ...acc, - otherFlatFieldMetadatas: [ - ...acc.otherFlatFieldMetadatas, - flatFieldMetadata, - ], - }; - }, - initialAccumulator, - ); - - if (isDefined(existingCreateObjectAction)) { - if (isDefined(existingCreateFieldAction)) { - return { - createdObjectActionByObjectMetadataId: { - ...createdObjectActionByObjectMetadataId, - [createFieldAction.objectMetadataId]: { - ...existingCreateObjectAction, - flatFieldMetadatas: [ - ...existingCreateObjectAction.flatFieldMetadatas, - ...otherFlatFieldMetadatas, - ], - }, - }, - createdFieldActionByObjectMetadataId: { - ...createdFieldActionByObjectMetadataId, - [createFieldAction.objectMetadataId]: { - ...existingCreateFieldAction, - flatFieldMetadatas: [ - ...existingCreateFieldAction.flatFieldMetadatas, - ...morphOrRelationFlatFieldMetadatas, - ], - }, - }, - }; - } - - if (morphOrRelationFlatFieldMetadatas.length > 0) { - return { - createdObjectActionByObjectMetadataId: { - ...createdObjectActionByObjectMetadataId, - [createFieldAction.objectMetadataId]: { - ...existingCreateObjectAction, - flatFieldMetadatas: [ - ...existingCreateObjectAction.flatFieldMetadatas, - ...otherFlatFieldMetadatas, - ], - }, - }, - createdFieldActionByObjectMetadataId: { - ...createdFieldActionByObjectMetadataId, - [createFieldAction.objectMetadataId]: { - ...createFieldAction, - flatFieldMetadatas: morphOrRelationFlatFieldMetadatas, - }, - }, - }; - } - - return { - createdObjectActionByObjectMetadataId: { - ...createdObjectActionByObjectMetadataId, - [createFieldAction.objectMetadataId]: { - ...existingCreateObjectAction, - flatFieldMetadatas: [ - ...existingCreateObjectAction.flatFieldMetadatas, - ...otherFlatFieldMetadatas, - ], - }, - }, - createdFieldActionByObjectMetadataId, - }; - } - - if (isDefined(existingCreateFieldAction)) { - return { - createdFieldActionByObjectMetadataId: { - ...createdFieldActionByObjectMetadataId, - [createFieldAction.objectMetadataId]: { - ...existingCreateFieldAction, - flatFieldMetadatas: [ - ...existingCreateFieldAction.flatFieldMetadatas, - ...createFieldAction.flatFieldMetadatas, - ], - }, - }, - createdObjectActionByObjectMetadataId, - }; - } - - return { - createdFieldActionByObjectMetadataId: { - ...createdFieldActionByObjectMetadataId, - [createFieldAction.objectMetadataId]: createFieldAction, - }, - createdObjectActionByObjectMetadataId, - }; - }, - initialAccumulator, - ); - - return { - ...orchestratorActionsReport, - fieldMetadata: { - ...orchestratorActionsReport.fieldMetadata, - create: Object.values(createdFieldActionByObjectMetadataId), - }, - objectMetadata: { - ...orchestratorActionsReport.objectMetadata, - create: Object.values(createdObjectActionByObjectMetadataId), - }, - }; - }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.ts index 883e3b2ef4..147e2d61c4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util.ts @@ -1,10 +1,10 @@ import { assertIsDefinedOrThrow } from 'twenty-shared/utils'; -import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; import { type AggregateOrchestratorActionsReportArgs } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type'; import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; -import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; +import { type UniversalUpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; export const aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldActions = ({ @@ -13,22 +13,21 @@ export const aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFie }: AggregateOrchestratorActionsReportArgs): OrchestratorActionsReport => { assertIsDefinedOrThrow(flatFieldMetadataMaps); - const updateFieldActions = orchestratorActionsReport.fieldMetadata - .update as UpdateFieldAction[]; + const updateFieldActions = orchestratorActionsReport.fieldMetadata.update; const { searchVectorUpdateFieldActions, otherUpdateFieldActions } = updateFieldActions.reduce<{ - searchVectorUpdateFieldActions: UpdateFieldAction[]; - otherUpdateFieldActions: UpdateFieldAction[]; + searchVectorUpdateFieldActions: UniversalUpdateFieldAction[]; + otherUpdateFieldActions: UniversalUpdateFieldAction[]; }>( (acc, updateFieldAction) => { - const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({ + const flatFieldMetadata = findFlatEntityByUniversalIdentifierOrThrow({ flatEntityMaps: flatFieldMetadataMaps, - flatEntityId: updateFieldAction.entityId, + universalIdentifier: updateFieldAction.universalIdentifier, }); const isSearchVectorUpdateFieldAction = - flatFieldMetadata?.name === SEARCH_VECTOR_FIELD.name; + flatFieldMetadata.name === SEARCH_VECTOR_FIELD.name; if (isSearchVectorUpdateFieldAction) { return { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util.ts index a04f77b4a0..ac09a621f1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util.ts @@ -1,13 +1,15 @@ import { type AggregateOrchestratorActionsReportArgs } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type'; -import { aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-create-object-and-create-field-actions.util'; +import { aggregateNonRelationFieldsIntoObjectActions } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-non-relation-fields-into-object-actions.util'; import { aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldActions } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report-deprioritize-search-vector-update-field-actions.util'; +import { aggregateRelationFieldPairs } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-relation-field-pairs.util'; export const aggregateOrchestratorActionsReport = ({ orchestratorActionsReport, flatFieldMetadataMaps, }: AggregateOrchestratorActionsReportArgs) => { const aggregatedOrchestratorActionsReport = [ - aggregateOrchestratorActionsReportCreateObjectAndCreateFieldActions, + aggregateNonRelationFieldsIntoObjectActions, + aggregateRelationFieldPairs, aggregateOrchestratorActionsReportDeprioritizeSearchVectorUpdateFieldActions, ].reduce( (currentOrchestratorActionsReport, aggregator) => diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-relation-field-pairs.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-relation-field-pairs.util.ts new file mode 100644 index 0000000000..1829bcbfc0 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/aggregate-relation-field-pairs.util.ts @@ -0,0 +1,84 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { type AggregateOrchestratorActionsReportArgs } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-aggregate-orchestrator-actions-report-args.type'; +import { type OrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { mergeFieldIdByUniversalIdentifier } from 'src/engine/workspace-manager/workspace-migration/utils/merge-field-id-by-universal-identifier.util'; +import { type UniversalCreateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; + +type FieldWithActionContext = { + field: UniversalFlatFieldMetadata; + fieldIdByUniversalIdentifier: Record | undefined; +}; + +export const aggregateRelationFieldPairs = ({ + orchestratorActionsReport, +}: AggregateOrchestratorActionsReportArgs): OrchestratorActionsReport => { + const createFieldActions = orchestratorActionsReport.fieldMetadata.create; + + const fieldByUniversalIdentifier = new Map(); + + for (const action of createFieldActions) { + for (const field of action.universalFlatFieldMetadatas) { + fieldByUniversalIdentifier.set(field.universalIdentifier, { + field, + fieldIdByUniversalIdentifier: action.fieldIdByUniversalIdentifier, + }); + } + } + + const processedFieldUniversalIdentifiers = new Set(); + const aggregatedCreateFieldActions: UniversalCreateFieldAction[] = []; + + for (const [ + universalIdentifier, + fieldContext, + ] of fieldByUniversalIdentifier) { + if (processedFieldUniversalIdentifiers.has(universalIdentifier)) { + continue; + } + + const { field, fieldIdByUniversalIdentifier } = fieldContext; + + processedFieldUniversalIdentifiers.add(universalIdentifier); + + const fieldsToBundle: UniversalFlatFieldMetadata[] = [field]; + let mergedFieldIdMap = fieldIdByUniversalIdentifier; + + const targetUniversalIdentifier = + field.relationTargetFieldMetadataUniversalIdentifier; + + if (isDefined(targetUniversalIdentifier)) { + const targetFieldContext = fieldByUniversalIdentifier.get( + targetUniversalIdentifier, + ); + + if ( + isDefined(targetFieldContext) && + !processedFieldUniversalIdentifiers.has(targetUniversalIdentifier) + ) { + fieldsToBundle.push(targetFieldContext.field); + processedFieldUniversalIdentifiers.add(targetUniversalIdentifier); + mergedFieldIdMap = mergeFieldIdByUniversalIdentifier( + mergedFieldIdMap, + targetFieldContext.fieldIdByUniversalIdentifier, + ); + } + } + + aggregatedCreateFieldActions.push({ + type: 'create', + metadataName: 'fieldMetadata', + universalFlatFieldMetadatas: fieldsToBundle, + fieldIdByUniversalIdentifier: mergedFieldIdMap, + }); + } + + return { + ...orchestratorActionsReport, + fieldMetadata: { + ...orchestratorActionsReport.fieldMetadata, + create: aggregatedCreateFieldActions, + }, + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util.ts index 9e246757d1..89308ea43c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util.ts @@ -22,6 +22,8 @@ export type DeletedCreatedUpdatedMatrix = { string, { updates: FlatEntityPropertiesUpdates; + // TMP remove when maps is universal based + universalIdentifier: string; } >; }; @@ -104,6 +106,7 @@ export const flatEntityDeletedCreatedUpdatedMatrixDispatcher = < } initialDispatcher.updatedFlatEntityMaps.byId[toFlatEntity.id] = { + universalIdentifier: fromFlatEntity.universalIdentifier, updates, }; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/get-metadata-empty-workspace-migration-action-record.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/get-metadata-empty-workspace-migration-action-record.util.ts index 41f97e6df9..e4c27cd698 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/get-metadata-empty-workspace-migration-action-record.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/get-metadata-empty-workspace-migration-action-record.util.ts @@ -1,6 +1,6 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; -import { type MetadataWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; +import { type MetadataUniversalWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; export const getMetadataEmptyWorkspaceMigrationActionRecord = < T extends AllMetadataName, @@ -11,4 +11,4 @@ export const getMetadataEmptyWorkspaceMigrationActionRecord = < create: [], delete: [], update: [], - }) as MetadataWorkspaceMigrationActionsRecord; + }) as MetadataUniversalWorkspaceMigrationActionsRecord; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/merge-field-id-by-universal-identifier.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/merge-field-id-by-universal-identifier.util.ts new file mode 100644 index 0000000000..68fc37f16d --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/utils/merge-field-id-by-universal-identifier.util.ts @@ -0,0 +1,15 @@ +import { isDefined } from 'twenty-shared/utils'; + +export const mergeFieldIdByUniversalIdentifier = ( + existing: Record | undefined, + incoming: Record | undefined, +): Record | undefined => { + if (!isDefined(existing) && !isDefined(incoming)) { + return undefined; + } + + return { + ...existing, + ...incoming, + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service.ts index 3c603c9042..e216ae2568 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service.ts @@ -1,9 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateAgentAction = BaseCreateWorkspaceMigrationAction<'agent'>; +export type FlatCreateAgentAction = + BaseFlatCreateWorkspaceMigrationAction<'agent'>; -export type UpdateAgentAction = BaseUpdateWorkspaceMigrationAction<'agent'>; +export type FlatUpdateAgentAction = + BaseFlatUpdateWorkspaceMigrationAction<'agent'>; -export type DeleteAgentAction = BaseDeleteWorkspaceMigrationAction<'agent'>; +export type UniversalDeleteAgentAction = + BaseUniversalDeleteWorkspaceMigrationAction<'agent'>; + +export type FlatDeleteAgentAction = + BaseFlatDeleteWorkspaceMigrationAction<'agent'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service.ts index 532b80c0b3..2d3713dee6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; +import { FlatUpdateAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -84,7 +84,7 @@ export class WorkspaceMigrationAgentActionsBuilderService extends WorkspaceEntit const { flatEntityId, flatEntityUpdates } = args; - const updateAgentAction: UpdateAgentAction = { + const updateAgentAction: FlatUpdateAgentAction = { type: 'update', metadataName: 'agent', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type.ts index 0531c27df6..8488a4fd71 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateCommandMenuItemAction = - BaseCreateWorkspaceMigrationAction<'commandMenuItem'>; +export type FlatCreateCommandMenuItemAction = + BaseFlatCreateWorkspaceMigrationAction<'commandMenuItem'>; -export type UpdateCommandMenuItemAction = - BaseUpdateWorkspaceMigrationAction<'commandMenuItem'>; +export type FlatUpdateCommandMenuItemAction = + BaseFlatUpdateWorkspaceMigrationAction<'commandMenuItem'>; -export type DeleteCommandMenuItemAction = - BaseDeleteWorkspaceMigrationAction<'commandMenuItem'>; +export type UniversalDeleteCommandMenuItemAction = + BaseUniversalDeleteWorkspaceMigrationAction<'commandMenuItem'>; + +export type FlatDeleteCommandMenuItemAction = + BaseFlatDeleteWorkspaceMigrationAction<'commandMenuItem'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service.ts index f096bc7dd3..88885ea78d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; +import { FlatUpdateCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -101,7 +101,7 @@ export class WorkspaceMigrationCommandMenuItemActionsBuilderService extends Work const { flatEntityId, flatEntityUpdates } = args; - const updateCommandMenuItemAction: UpdateCommandMenuItemAction = { + const updateCommandMenuItemAction: FlatUpdateCommandMenuItemAction = { type: 'update', metadataName: 'commandMenuItem', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action.ts index 2e61426184..4d6710092c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action.ts @@ -1,18 +1,38 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; -export type CreateFieldAction = Omit< - BaseCreateWorkspaceMigrationAction<'fieldMetadata'>, +// Universal action types (always use universal identifiers) +export type UniversalCreateFieldAction = Omit< + BaseUniversalCreateWorkspaceMigrationAction<'fieldMetadata'>, + 'flatEntity' +> & { + universalFlatFieldMetadatas: UniversalFlatFieldMetadata[]; + // Optional map to provide specific IDs for field creation (for API metadata). + fieldIdByUniversalIdentifier?: Record; +}; + +export type UniversalUpdateFieldAction = + BaseUniversalUpdateWorkspaceMigrationAction<'fieldMetadata'>; + +export type UniversalDeleteFieldAction = + BaseUniversalDeleteWorkspaceMigrationAction<'fieldMetadata'>; + +// Flat action types (always use entity IDs) +export type FlatCreateFieldAction = Omit< + BaseFlatCreateWorkspaceMigrationAction<'fieldMetadata'>, 'flatEntity' > & { - objectMetadataId: string; flatFieldMetadatas: FlatFieldMetadata[]; }; -export type UpdateFieldAction = - BaseUpdateWorkspaceMigrationAction<'fieldMetadata'>; +export type FlatUpdateFieldAction = + BaseFlatUpdateWorkspaceMigrationAction<'fieldMetadata'>; -export type DeleteFieldAction = - BaseDeleteWorkspaceMigrationAction<'fieldMetadata'>; +export type FlatDeleteFieldAction = + BaseFlatDeleteWorkspaceMigrationAction<'fieldMetadata'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service.ts index 9dc765deeb..8eb30899f3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; +import { UniversalUpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -37,13 +37,20 @@ export class WorkspaceMigrationFieldActionsBuilderService extends WorkspaceEntit const { flatEntityToValidate: flatFieldMetadataToValidate } = args; + const fieldIdByUniversalIdentifier = flatFieldMetadataToValidate.id + ? { + [flatFieldMetadataToValidate.universalIdentifier]: + flatFieldMetadataToValidate.id, + } + : undefined; + return { status: 'success', action: { type: 'create', metadataName: 'fieldMetadata', - objectMetadataId: flatFieldMetadataToValidate.objectMetadataId, - flatFieldMetadatas: [flatFieldMetadataToValidate], + universalFlatFieldMetadatas: [flatFieldMetadataToValidate], + fieldIdByUniversalIdentifier, }, }; } @@ -94,12 +101,12 @@ export class WorkspaceMigrationFieldActionsBuilderService extends WorkspaceEntit }; } - const { flatEntityId, flatEntityUpdates } = args; + const { universalIdentifier, flatEntityUpdates } = args; - const updateFieldAction: UpdateFieldAction = { + const updateFieldAction: UniversalUpdateFieldAction = { type: 'update', metadataName: 'fieldMetadata', - entityId: flatEntityId, + universalIdentifier, updates: flatEntityUpdates, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type.ts index fe18c35578..6724c57aff 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateFrontComponentAction = - BaseCreateWorkspaceMigrationAction<'frontComponent'>; +export type FlatCreateFrontComponentAction = + BaseFlatCreateWorkspaceMigrationAction<'frontComponent'>; -export type UpdateFrontComponentAction = - BaseUpdateWorkspaceMigrationAction<'frontComponent'>; +export type FlatUpdateFrontComponentAction = + BaseFlatUpdateWorkspaceMigrationAction<'frontComponent'>; -export type DeleteFrontComponentAction = - BaseDeleteWorkspaceMigrationAction<'frontComponent'>; +export type UniversalDeleteFrontComponentAction = + BaseUniversalDeleteWorkspaceMigrationAction<'frontComponent'>; + +export type FlatDeleteFrontComponentAction = + BaseFlatDeleteWorkspaceMigrationAction<'frontComponent'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/workspace-migration-front-component-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/workspace-migration-front-component-actions-builder.service.ts index ef5689e424..e05ca8f77a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/workspace-migration-front-component-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/workspace-migration-front-component-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; +import { FlatUpdateFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -101,7 +101,7 @@ export class WorkspaceMigrationFrontComponentActionsBuilderService extends Works const { flatEntityId, flatEntityUpdates } = args; - const updateFrontComponentAction: UpdateFrontComponentAction = { + const updateFrontComponentAction: FlatUpdateFrontComponentAction = { type: 'update', metadataName: 'frontComponent', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action.ts index 9fa0fd9618..320c3c1597 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action.ts @@ -1,12 +1,18 @@ import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateIndexAction = BaseCreateWorkspaceMigrationAction<'index'>; +export type FlatCreateIndexAction = + BaseFlatCreateWorkspaceMigrationAction<'index'>; -export type DeleteIndexAction = BaseDeleteWorkspaceMigrationAction<'index'>; +export type UniversalDeleteIndexAction = + BaseUniversalDeleteWorkspaceMigrationAction<'index'>; -export type UpdateIndexAction = { +export type FlatDeleteIndexAction = + BaseFlatDeleteWorkspaceMigrationAction<'index'>; + +export type FlatUpdateIndexAction = { type: 'update'; metadataName: 'index'; entityId: string; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type.ts index d700b5f59e..25a801dd74 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type.ts @@ -1,16 +1,20 @@ import { type Sources } from 'twenty-shared/types'; -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateLogicFunctionAction = - BaseCreateWorkspaceMigrationAction<'logicFunction'>; +export type FlatCreateLogicFunctionAction = + BaseFlatCreateWorkspaceMigrationAction<'logicFunction'>; -export type UpdateLogicFunctionAction = - BaseUpdateWorkspaceMigrationAction<'logicFunction'> & { +export type FlatUpdateLogicFunctionAction = + BaseFlatUpdateWorkspaceMigrationAction<'logicFunction'> & { code?: Sources; }; -export type DeleteLogicFunctionAction = - BaseDeleteWorkspaceMigrationAction<'logicFunction'>; +export type UniversalDeleteLogicFunctionAction = + BaseUniversalDeleteWorkspaceMigrationAction<'logicFunction'>; + +export type FlatDeleteLogicFunctionAction = + BaseFlatDeleteWorkspaceMigrationAction<'logicFunction'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/workspace-migration-logic-function-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/workspace-migration-logic-function-actions-builder.service.ts index bbec75c0cf..75f023f817 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/workspace-migration-logic-function-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/workspace-migration-logic-function-actions-builder.service.ts @@ -3,7 +3,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { UpdateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; +import { FlatUpdateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; import { ValidateAndBuildArgs, ValidateAndBuildReturnType, @@ -141,7 +141,7 @@ export class WorkspaceMigrationLogicFunctionActionsBuilderService extends Worksp const { flatEntityId, flatEntityUpdates } = args; - const updateLogicFunctionAction: UpdateLogicFunctionAction = { + const updateLogicFunctionAction: FlatUpdateLogicFunctionAction = { type: 'update', metadataName: 'logicFunction', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type.ts index 94b49c51e5..9af11896c0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateNavigationMenuItemAction = - BaseCreateWorkspaceMigrationAction<'navigationMenuItem'>; +export type FlatCreateNavigationMenuItemAction = + BaseFlatCreateWorkspaceMigrationAction<'navigationMenuItem'>; -export type UpdateNavigationMenuItemAction = - BaseUpdateWorkspaceMigrationAction<'navigationMenuItem'>; +export type FlatUpdateNavigationMenuItemAction = + BaseFlatUpdateWorkspaceMigrationAction<'navigationMenuItem'>; -export type DeleteNavigationMenuItemAction = - BaseDeleteWorkspaceMigrationAction<'navigationMenuItem'>; +export type UniversalDeleteNavigationMenuItemAction = + BaseUniversalDeleteWorkspaceMigrationAction<'navigationMenuItem'>; + +export type FlatDeleteNavigationMenuItemAction = + BaseFlatDeleteWorkspaceMigrationAction<'navigationMenuItem'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/workspace-migration-navigation-menu-item-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/workspace-migration-navigation-menu-item-actions-builder.service.ts index 9067716340..46b2cd6637 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/workspace-migration-navigation-menu-item-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/workspace-migration-navigation-menu-item-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; +import { FlatUpdateNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -102,7 +102,7 @@ export class WorkspaceMigrationNavigationMenuItemActionsBuilderService extends W const { flatEntityId, flatEntityUpdates } = args; - const updateNavigationMenuItemAction: UpdateNavigationMenuItemAction = { + const updateNavigationMenuItemAction: FlatUpdateNavigationMenuItemAction = { type: 'update', metadataName: 'navigationMenuItem', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action.ts index 0bb56868aa..e1014c375d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action.ts @@ -1,15 +1,34 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; +import { type BaseUniversalUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type'; -export type CreateObjectAction = - BaseCreateWorkspaceMigrationAction<'objectMetadata'> & { +// Universal action types (always use universal identifiers) +export type UniversalCreateObjectAction = + BaseUniversalCreateWorkspaceMigrationAction<'objectMetadata'> & { + universalFlatFieldMetadatas: UniversalFlatFieldMetadata[]; + // Optional map to provide specific IDs for field creation (for API metadata). + fieldIdByUniversalIdentifier?: Record; + }; + +export type UniversalUpdateObjectAction = + BaseUniversalUpdateWorkspaceMigrationAction<'objectMetadata'>; + +export type UniversalDeleteObjectAction = + BaseUniversalDeleteWorkspaceMigrationAction<'objectMetadata'>; + +// Flat action types (always use entity IDs) +export type FlatCreateObjectAction = + BaseFlatCreateWorkspaceMigrationAction<'objectMetadata'> & { flatFieldMetadatas: FlatFieldMetadata[]; }; -export type UpdateObjectAction = - BaseUpdateWorkspaceMigrationAction<'objectMetadata'>; +export type FlatUpdateObjectAction = + BaseFlatUpdateWorkspaceMigrationAction<'objectMetadata'>; -export type DeleteObjectAction = - BaseDeleteWorkspaceMigrationAction<'objectMetadata'>; +export type FlatDeleteObjectAction = + BaseFlatDeleteWorkspaceMigrationAction<'objectMetadata'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/workspace-migration-object-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/workspace-migration-object-actions-builder.service.ts index edb03a49c5..9a89e711ac 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/workspace-migration-object-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/workspace-migration-object-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; +import { UniversalUpdateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -42,8 +42,9 @@ export class WorkspaceMigrationObjectActionsBuilderService extends WorkspaceEnti action: { type: 'create', metadataName: 'objectMetadata', - flatFieldMetadatas: [], + universalFlatFieldMetadatas: [], flatEntity: flatObjectMetadataToValidate, + id: flatObjectMetadataToValidate.id, }, }; } @@ -94,12 +95,12 @@ export class WorkspaceMigrationObjectActionsBuilderService extends WorkspaceEnti }; } - const { flatEntityId, flatEntityUpdates } = args; + const { universalIdentifier, flatEntityUpdates } = args; - const updateObjectAction: UpdateObjectAction = { + const updateObjectAction: UniversalUpdateObjectAction = { type: 'update', metadataName: 'objectMetadata', - entityId: flatEntityId, + universalIdentifier, updates: flatEntityUpdates, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type.ts index 08f414e591..22275489e3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreatePageLayoutTabAction = - BaseCreateWorkspaceMigrationAction<'pageLayoutTab'>; +export type FlatCreatePageLayoutTabAction = + BaseFlatCreateWorkspaceMigrationAction<'pageLayoutTab'>; -export type UpdatePageLayoutTabAction = - BaseUpdateWorkspaceMigrationAction<'pageLayoutTab'>; +export type FlatUpdatePageLayoutTabAction = + BaseFlatUpdateWorkspaceMigrationAction<'pageLayoutTab'>; -export type DeletePageLayoutTabAction = - BaseDeleteWorkspaceMigrationAction<'pageLayoutTab'>; +export type UniversalDeletePageLayoutTabAction = + BaseUniversalDeleteWorkspaceMigrationAction<'pageLayoutTab'>; + +export type FlatDeletePageLayoutTabAction = + BaseFlatDeleteWorkspaceMigrationAction<'pageLayoutTab'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/workspace-migration-page-layout-tab-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/workspace-migration-page-layout-tab-actions-builder.service.ts index 354fde48ed..9a41bfc549 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/workspace-migration-page-layout-tab-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/workspace-migration-page-layout-tab-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdatePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; +import { FlatUpdatePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -101,7 +101,7 @@ export class WorkspaceMigrationPageLayoutTabActionsBuilderService extends Worksp const { flatEntityId, flatEntityUpdates } = args; - const updatePageLayoutTabAction: UpdatePageLayoutTabAction = { + const updatePageLayoutTabAction: FlatUpdatePageLayoutTabAction = { type: 'update', metadataName: 'pageLayoutTab', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type.ts index 5bedc3aba0..411b54381c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreatePageLayoutWidgetAction = - BaseCreateWorkspaceMigrationAction<'pageLayoutWidget'>; +export type FlatCreatePageLayoutWidgetAction = + BaseFlatCreateWorkspaceMigrationAction<'pageLayoutWidget'>; -export type UpdatePageLayoutWidgetAction = - BaseUpdateWorkspaceMigrationAction<'pageLayoutWidget'>; +export type FlatUpdatePageLayoutWidgetAction = + BaseFlatUpdateWorkspaceMigrationAction<'pageLayoutWidget'>; -export type DeletePageLayoutWidgetAction = - BaseDeleteWorkspaceMigrationAction<'pageLayoutWidget'>; +export type UniversalDeletePageLayoutWidgetAction = + BaseUniversalDeleteWorkspaceMigrationAction<'pageLayoutWidget'>; + +export type FlatDeletePageLayoutWidgetAction = + BaseFlatDeleteWorkspaceMigrationAction<'pageLayoutWidget'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/workspace-migration-page-layout-widget-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/workspace-migration-page-layout-widget-actions-builder.service.ts index b8523b1d51..5b6ef5ff3e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/workspace-migration-page-layout-widget-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/workspace-migration-page-layout-widget-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdatePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; +import { FlatUpdatePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -103,7 +103,7 @@ export class WorkspaceMigrationPageLayoutWidgetActionsBuilderService extends Wor const { flatEntityId, flatEntityUpdates } = args; - const updatePageLayoutWidgetAction: UpdatePageLayoutWidgetAction = { + const updatePageLayoutWidgetAction: FlatUpdatePageLayoutWidgetAction = { type: 'update', metadataName: 'pageLayoutWidget', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type.ts index 2e56b022aa..b5199db4aa 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreatePageLayoutAction = - BaseCreateWorkspaceMigrationAction<'pageLayout'>; +export type FlatCreatePageLayoutAction = + BaseFlatCreateWorkspaceMigrationAction<'pageLayout'>; -export type UpdatePageLayoutAction = - BaseUpdateWorkspaceMigrationAction<'pageLayout'>; +export type FlatUpdatePageLayoutAction = + BaseFlatUpdateWorkspaceMigrationAction<'pageLayout'>; -export type DeletePageLayoutAction = - BaseDeleteWorkspaceMigrationAction<'pageLayout'>; +export type UniversalDeletePageLayoutAction = + BaseUniversalDeleteWorkspaceMigrationAction<'pageLayout'>; + +export type FlatDeletePageLayoutAction = + BaseFlatDeleteWorkspaceMigrationAction<'pageLayout'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/workspace-migration-page-layout-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/workspace-migration-page-layout-actions-builder.service.ts index 7899c00c96..bae10d4a44 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/workspace-migration-page-layout-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/workspace-migration-page-layout-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; +import { FlatUpdatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -97,7 +97,7 @@ export class WorkspaceMigrationPageLayoutActionsBuilderService extends Workspace const { flatEntityId, flatEntityUpdates } = args; - const updatePageLayoutAction: UpdatePageLayoutAction = { + const updatePageLayoutAction: FlatUpdatePageLayoutAction = { type: 'update', metadataName: 'pageLayout', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type.ts index 62160c801e..454ddcf79f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateRoleTargetAction = - BaseCreateWorkspaceMigrationAction<'roleTarget'>; +export type FlatCreateRoleTargetAction = + BaseFlatCreateWorkspaceMigrationAction<'roleTarget'>; -export type UpdateRoleTargetAction = - BaseUpdateWorkspaceMigrationAction<'roleTarget'>; +export type FlatUpdateRoleTargetAction = + BaseFlatUpdateWorkspaceMigrationAction<'roleTarget'>; -export type DeleteRoleTargetAction = - BaseDeleteWorkspaceMigrationAction<'roleTarget'>; +export type UniversalDeleteRoleTargetAction = + BaseUniversalDeleteWorkspaceMigrationAction<'roleTarget'>; + +export type FlatDeleteRoleTargetAction = + BaseFlatDeleteWorkspaceMigrationAction<'roleTarget'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/workspace-migration-role-target-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/workspace-migration-role-target-actions-builder.service.ts index 2631be5dc8..fc98d9c016 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/workspace-migration-role-target-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/workspace-migration-role-target-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; +import { FlatUpdateRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -93,7 +93,7 @@ export class WorkspaceMigrationRoleTargetActionsBuilderService extends Workspace const { flatEntityId, flatEntityUpdates } = args; - const updateRoleTargetAction: UpdateRoleTargetAction = { + const updateRoleTargetAction: FlatUpdateRoleTargetAction = { type: 'update', metadataName: 'roleTarget', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type.ts index 9395cad632..3a949b88e8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type.ts @@ -1,9 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateRoleAction = BaseCreateWorkspaceMigrationAction<'role'>; +export type FlatCreateRoleAction = + BaseFlatCreateWorkspaceMigrationAction<'role'>; -export type UpdateRoleAction = BaseUpdateWorkspaceMigrationAction<'role'>; +export type FlatUpdateRoleAction = + BaseFlatUpdateWorkspaceMigrationAction<'role'>; -export type DeleteRoleAction = BaseDeleteWorkspaceMigrationAction<'role'>; +export type UniversalDeleteRoleAction = + BaseUniversalDeleteWorkspaceMigrationAction<'role'>; + +export type FlatDeleteRoleAction = + BaseFlatDeleteWorkspaceMigrationAction<'role'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/workspace-migration-role-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/workspace-migration-role-actions-builder.service.ts index 70e3ff7da5..64927b0af1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/workspace-migration-role-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/workspace-migration-role-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; +import { FlatUpdateRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -84,7 +84,7 @@ export class WorkspaceMigrationRoleActionsBuilderService extends WorkspaceEntity const { flatEntityId, flatEntityUpdates } = args; - const updateRoleAction: UpdateRoleAction = { + const updateRoleAction: FlatUpdateRoleAction = { type: 'update', metadataName: 'role', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type.ts index b6a41a9b83..b974dbccb9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type.ts @@ -1,14 +1,18 @@ /* @license Enterprise */ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateRowLevelPermissionPredicateGroupAction = - BaseCreateWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; +export type FlatCreateRowLevelPermissionPredicateGroupAction = + BaseFlatCreateWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; -export type UpdateRowLevelPermissionPredicateGroupAction = - BaseUpdateWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; +export type FlatUpdateRowLevelPermissionPredicateGroupAction = + BaseFlatUpdateWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; -export type DeleteRowLevelPermissionPredicateGroupAction = - BaseDeleteWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; +export type UniversalDeleteRowLevelPermissionPredicateGroupAction = + BaseUniversalDeleteWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; + +export type FlatDeleteRowLevelPermissionPredicateGroupAction = + BaseFlatDeleteWorkspaceMigrationAction<'rowLevelPermissionPredicateGroup'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service.ts index 3f7079d45a..26a81c92ba 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service.ts @@ -4,7 +4,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; +import { FlatUpdateRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -111,7 +111,7 @@ export class WorkspaceMigrationRowLevelPermissionPredicateGroupActionsBuilderSer const { flatEntityId, flatEntityUpdates } = args; - const updateAction: UpdateRowLevelPermissionPredicateGroupAction = { + const updateAction: FlatUpdateRowLevelPermissionPredicateGroupAction = { type: 'update', metadataName: 'rowLevelPermissionPredicateGroup', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type.ts index 2b61c4e41c..1e70446b27 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type.ts @@ -1,14 +1,18 @@ /* @license Enterprise */ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateRowLevelPermissionPredicateAction = - BaseCreateWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; +export type FlatCreateRowLevelPermissionPredicateAction = + BaseFlatCreateWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; -export type UpdateRowLevelPermissionPredicateAction = - BaseUpdateWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; +export type FlatUpdateRowLevelPermissionPredicateAction = + BaseFlatUpdateWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; -export type DeleteRowLevelPermissionPredicateAction = - BaseDeleteWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; +export type UniversalDeleteRowLevelPermissionPredicateAction = + BaseUniversalDeleteWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; + +export type FlatDeleteRowLevelPermissionPredicateAction = + BaseFlatDeleteWorkspaceMigrationAction<'rowLevelPermissionPredicate'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service.ts index 72c8b587eb..e5c47703e4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service.ts @@ -4,7 +4,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; +import { FlatUpdateRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -111,7 +111,7 @@ export class WorkspaceMigrationRowLevelPermissionPredicateActionsBuilderService const { flatEntityId, flatEntityUpdates } = args; - const updateAction: UpdateRowLevelPermissionPredicateAction = { + const updateAction: FlatUpdateRowLevelPermissionPredicateAction = { type: 'update', metadataName: 'rowLevelPermissionPredicate', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type.ts index 9b59820aa6..b1989bc12d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type.ts @@ -1,9 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateSkillAction = BaseCreateWorkspaceMigrationAction<'skill'>; +export type FlatCreateSkillAction = + BaseFlatCreateWorkspaceMigrationAction<'skill'>; -export type UpdateSkillAction = BaseUpdateWorkspaceMigrationAction<'skill'>; +export type FlatUpdateSkillAction = + BaseFlatUpdateWorkspaceMigrationAction<'skill'>; -export type DeleteSkillAction = BaseDeleteWorkspaceMigrationAction<'skill'>; +export type UniversalDeleteSkillAction = + BaseUniversalDeleteWorkspaceMigrationAction<'skill'>; + +export type FlatDeleteSkillAction = + BaseFlatDeleteWorkspaceMigrationAction<'skill'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/workspace-migration-skill-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/workspace-migration-skill-actions-builder.service.ts index e004770ea4..e9bf382069 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/workspace-migration-skill-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/workspace-migration-skill-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; +import { FlatUpdateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -84,7 +84,7 @@ export class WorkspaceMigrationSkillActionsBuilderService extends WorkspaceEntit const { flatEntityId, flatEntityUpdates } = args; - const updateSkillAction: UpdateSkillAction = { + const updateSkillAction: FlatUpdateSkillAction = { type: 'update', metadataName: 'skill', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type.ts index 66d3eed72e..cea1e0ee72 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateViewFieldAction = - BaseCreateWorkspaceMigrationAction<'viewField'>; +export type FlatCreateViewFieldAction = + BaseFlatCreateWorkspaceMigrationAction<'viewField'>; -export type UpdateViewFieldAction = - BaseUpdateWorkspaceMigrationAction<'viewField'>; +export type FlatUpdateViewFieldAction = + BaseFlatUpdateWorkspaceMigrationAction<'viewField'>; -export type DeleteViewFieldAction = - BaseDeleteWorkspaceMigrationAction<'viewField'>; +export type UniversalDeleteViewFieldAction = + BaseUniversalDeleteWorkspaceMigrationAction<'viewField'>; + +export type FlatDeleteViewFieldAction = + BaseFlatDeleteWorkspaceMigrationAction<'viewField'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service.ts index b40d80e62c..8f4ed9d10a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/workspace-migration-view-field-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; +import { FlatUpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -91,7 +91,7 @@ export class WorkspaceMigrationViewFieldActionsBuilderService extends WorkspaceE const { flatEntityId, flatEntityUpdates } = args; - const updateViewFieldAction: UpdateViewFieldAction = { + const updateViewFieldAction: FlatUpdateViewFieldAction = { type: 'update', metadataName: 'viewField', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type.ts index 9d5e70a2e3..2eb6e503ac 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateViewFilterGroupAction = - BaseCreateWorkspaceMigrationAction<'viewFilterGroup'>; +export type FlatCreateViewFilterGroupAction = + BaseFlatCreateWorkspaceMigrationAction<'viewFilterGroup'>; -export type UpdateViewFilterGroupAction = - BaseUpdateWorkspaceMigrationAction<'viewFilterGroup'>; +export type FlatUpdateViewFilterGroupAction = + BaseFlatUpdateWorkspaceMigrationAction<'viewFilterGroup'>; -export type DeleteViewFilterGroupAction = - BaseDeleteWorkspaceMigrationAction<'viewFilterGroup'>; +export type UniversalDeleteViewFilterGroupAction = + BaseUniversalDeleteWorkspaceMigrationAction<'viewFilterGroup'>; + +export type FlatDeleteViewFilterGroupAction = + BaseFlatDeleteWorkspaceMigrationAction<'viewFilterGroup'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/workspace-migration-view-filter-group-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/workspace-migration-view-filter-group-actions-builder.service.ts index 4553bcf998..5f80f41269 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/workspace-migration-view-filter-group-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/workspace-migration-view-filter-group-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { type UpdateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; +import { type FlatUpdateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { type FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -101,7 +101,7 @@ export class WorkspaceMigrationViewFilterGroupActionsBuilderService extends Work const { flatEntityId, flatEntityUpdates } = args; - const updateViewFilterGroupAction: UpdateViewFilterGroupAction = { + const updateViewFilterGroupAction: FlatUpdateViewFilterGroupAction = { type: 'update', metadataName: 'viewFilterGroup', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type.ts index 5a3a5d3a63..0eeeeeb80f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateViewFilterAction = - BaseCreateWorkspaceMigrationAction<'viewFilter'>; +export type FlatCreateViewFilterAction = + BaseFlatCreateWorkspaceMigrationAction<'viewFilter'>; -export type UpdateViewFilterAction = - BaseUpdateWorkspaceMigrationAction<'viewFilter'>; +export type FlatUpdateViewFilterAction = + BaseFlatUpdateWorkspaceMigrationAction<'viewFilter'>; -export type DeleteViewFilterAction = - BaseDeleteWorkspaceMigrationAction<'viewFilter'>; +export type UniversalDeleteViewFilterAction = + BaseUniversalDeleteWorkspaceMigrationAction<'viewFilter'>; + +export type FlatDeleteViewFilterAction = + BaseFlatDeleteWorkspaceMigrationAction<'viewFilter'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/workspace-migration-view-filter-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/workspace-migration-view-filter-actions-builder.service.ts index 2bf28e2f81..450ba5accb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/workspace-migration-view-filter-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/workspace-migration-view-filter-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; +import { FlatUpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -93,7 +93,7 @@ export class WorkspaceMigrationViewFilterActionsBuilderService extends Workspace const { flatEntityId, flatEntityUpdates } = args; - const updateViewFilterAction: UpdateViewFilterAction = { + const updateViewFilterAction: FlatUpdateViewFilterAction = { type: 'update', metadataName: 'viewFilter', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type.ts index 5bd21ab588..e97b79d50f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type.ts @@ -1,12 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateViewGroupAction = - BaseCreateWorkspaceMigrationAction<'viewGroup'>; +export type FlatCreateViewGroupAction = + BaseFlatCreateWorkspaceMigrationAction<'viewGroup'>; -export type UpdateViewGroupAction = - BaseUpdateWorkspaceMigrationAction<'viewGroup'>; +export type FlatUpdateViewGroupAction = + BaseFlatUpdateWorkspaceMigrationAction<'viewGroup'>; -export type DeleteViewGroupAction = - BaseDeleteWorkspaceMigrationAction<'viewGroup'>; +export type UniversalDeleteViewGroupAction = + BaseUniversalDeleteWorkspaceMigrationAction<'viewGroup'>; + +export type FlatDeleteViewGroupAction = + BaseFlatDeleteWorkspaceMigrationAction<'viewGroup'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/workspace-migration-view-group-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/workspace-migration-view-group-actions-builder.service.ts index e156ac0cd6..fc5c8b8533 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/workspace-migration-view-group-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/workspace-migration-view-group-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; +import { FlatUpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -93,7 +93,7 @@ export class WorkspaceMigrationViewGroupActionsBuilderService extends WorkspaceE const { flatEntityId, flatEntityUpdates } = args; - const updateViewGroupAction: UpdateViewGroupAction = { + const updateViewGroupAction: FlatUpdateViewGroupAction = { type: 'update', metadataName: 'viewGroup', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type.ts index fa49c09370..b47b802e6c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type.ts @@ -1,9 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateViewAction = BaseCreateWorkspaceMigrationAction<'view'>; +export type FlatCreateViewAction = + BaseFlatCreateWorkspaceMigrationAction<'view'>; -export type UpdateViewAction = BaseUpdateWorkspaceMigrationAction<'view'>; +export type FlatUpdateViewAction = + BaseFlatUpdateWorkspaceMigrationAction<'view'>; -export type DeleteViewAction = BaseDeleteWorkspaceMigrationAction<'view'>; +export type UniversalDeleteViewAction = + BaseUniversalDeleteWorkspaceMigrationAction<'view'>; + +export type FlatDeleteViewAction = + BaseFlatDeleteWorkspaceMigrationAction<'view'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/workspace-migration-view-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/workspace-migration-view-actions-builder.service.ts index a0d7394c70..2114d42475 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/workspace-migration-view-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/workspace-migration-view-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; +import { FlatUpdateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -84,7 +84,7 @@ export class WorkspaceMigrationViewActionsBuilderService extends WorkspaceEntity const { flatEntityId, flatEntityUpdates } = args; - const updateViewAction: UpdateViewAction = { + const updateViewAction: FlatUpdateViewAction = { type: 'update', metadataName: 'view', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type.ts index 0e60610c1e..b8d68c3238 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type.ts @@ -1,9 +1,16 @@ -import { type BaseCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type'; -import { type BaseDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type'; -import { type BaseUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type'; +import { type BaseFlatCreateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type'; +import { type BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; +import { type BaseFlatUpdateWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type'; +import { type BaseUniversalDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type'; -export type CreateWebhookAction = BaseCreateWorkspaceMigrationAction<'webhook'>; +export type FlatCreateWebhookAction = + BaseFlatCreateWorkspaceMigrationAction<'webhook'>; -export type UpdateWebhookAction = BaseUpdateWorkspaceMigrationAction<'webhook'>; +export type FlatUpdateWebhookAction = + BaseFlatUpdateWorkspaceMigrationAction<'webhook'>; -export type DeleteWebhookAction = BaseDeleteWorkspaceMigrationAction<'webhook'>; +export type UniversalDeleteWebhookAction = + BaseUniversalDeleteWorkspaceMigrationAction<'webhook'>; + +export type FlatDeleteWebhookAction = + BaseFlatDeleteWorkspaceMigrationAction<'webhook'>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/workspace-migration-webhook-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/workspace-migration-webhook-actions-builder.service.ts index d6296492be..c4313300af 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/workspace-migration-webhook-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/workspace-migration-webhook-actions-builder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { UpdateWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; +import { FlatUpdateWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; import { WorkspaceEntityMigrationBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-args.type'; @@ -93,7 +93,7 @@ export class WorkspaceMigrationWebhookActionsBuilderService extends WorkspaceEnt const { flatEntityId, flatEntityUpdates } = args; - const updateWebhookAction: UpdateWebhookAction = { + const updateWebhookAction: FlatUpdateWebhookAction = { type: 'update', metadataName: 'webhook', entityId: flatEntityId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts index 5370b9c46a..eca1bbe49f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/services/workspace-entity-migration-builder.service.ts @@ -241,6 +241,7 @@ export abstract class WorkspaceEntityMigrationBuilderService< workspaceId, buildOptions, additionalCacheDataMaps, + universalIdentifier: flatEntityToUpdate.universalIdentifier, }); if (validationResult.status === 'fail') { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type.ts similarity index 63% rename from packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type.ts rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type.ts index 08ef21e92a..557a7cc344 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-create-workspace-migration-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-create-workspace-migration-action.type.ts @@ -3,8 +3,9 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; -export type BaseCreateWorkspaceMigrationAction = { - flatEntity: MetadataFlatEntity; - type: typeof WORKSPACE_MIGRATION_ACTION_TYPE.create; - metadataName: T; -}; +export type BaseFlatCreateWorkspaceMigrationAction = + { + flatEntity: MetadataFlatEntity; + type: typeof WORKSPACE_MIGRATION_ACTION_TYPE.create; + metadataName: T; + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type.ts new file mode 100644 index 0000000000..718dec6e13 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type.ts @@ -0,0 +1,10 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; + +export type BaseFlatDeleteWorkspaceMigrationAction = + { + entityId: string; + type: typeof WORKSPACE_MIGRATION_ACTION_TYPE.delete; + metadataName: T; + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type.ts new file mode 100644 index 0000000000..0793ebba32 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-update-workspace-migration-action.type.ts @@ -0,0 +1,12 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; +import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; + +export type BaseFlatUpdateWorkspaceMigrationAction = + { + type: typeof WORKSPACE_MIGRATION_ACTION_TYPE.update; + metadataName: T; + entityId: string; + updates: FlatEntityPropertiesUpdates; + }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type.ts new file mode 100644 index 0000000000..075c036c60 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-create-workspace-migration-action.type.ts @@ -0,0 +1,16 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type MetadataUniversalFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-universal-flat-entity.type'; +import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; + +export type BaseUniversalCreateWorkspaceMigrationAction< + T extends AllMetadataName, +> = { + // TODO prastoin rename to universalFlatEntity ? + flatEntity: MetadataUniversalFlatEntity; + type: typeof WORKSPACE_MIGRATION_ACTION_TYPE.create; + metadataName: T; + // Optional ID to use when creating the entity (for API metadata). + // If not provided, a new UUID will be generated. + id?: string; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type.ts similarity index 79% rename from packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type.ts rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type.ts index becaa6cb4d..772a1ee92c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-delete-workspace-migration-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-delete-workspace-migration-action.type.ts @@ -2,7 +2,9 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; -export type BaseDeleteWorkspaceMigrationAction = { +export type BaseUniversalDeleteWorkspaceMigrationAction< + T extends AllMetadataName, +> = { universalIdentifier: string; type: typeof WORKSPACE_MIGRATION_ACTION_TYPE.delete; metadataName: T; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type.ts similarity index 80% rename from packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type.ts rename to packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type.ts index 1dcf88fd39..1d58b8aca2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-update-workspace-migration-action.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-universal-update-workspace-migration-action.type.ts @@ -3,9 +3,11 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { type FlatEntityPropertiesUpdates } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-updates.type'; import { type WORKSPACE_MIGRATION_ACTION_TYPE } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/constants/workspace-migration-action-type.constant'; -export type BaseUpdateWorkspaceMigrationAction = { +export type BaseUniversalUpdateWorkspaceMigrationAction< + T extends AllMetadataName, +> = { type: typeof WORKSPACE_MIGRATION_ACTION_TYPE.update; metadataName: T; - entityId: string; + universalIdentifier: string; updates: FlatEntityPropertiesUpdates; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type.ts index 7eba2d3b4a..8806ab8a12 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type.ts @@ -9,4 +9,5 @@ export type FlatEntityUpdateValidationArgs = Omit< > & { flatEntityId: string; flatEntityUpdates: FlatEntityPropertiesUpdates; + universalIdentifier: string; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type.ts index 7b7f0bc3da..1d001e91b2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-validation-result.type.ts @@ -1,7 +1,7 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { - type MetadataWorkspaceMigrationAction, + type MetadataUniversalWorkspaceMigrationAction, type WorkspaceMigrationActionType, } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; @@ -12,9 +12,10 @@ export type FlatEntityValidationReturnType< > = | { status: 'success'; - action: - | MetadataWorkspaceMigrationAction - | MetadataWorkspaceMigrationAction[]; + action: MetadataUniversalWorkspaceMigrationAction< + TMetadataName, + TACtionType + >; } | ({ status: 'fail'; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/successful-flat-entity-validate-and-build.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/successful-flat-entity-validate-and-build.type.ts index 2752d17b19..4b65620421 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/successful-flat-entity-validate-and-build.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/successful-flat-entity-validate-and-build.type.ts @@ -1,10 +1,10 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type'; -import { type MetadataWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; +import { type MetadataUniversalWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; export type SuccessfulFlatEntityValidateAndBuild = { status: 'success'; - actions: MetadataWorkspaceMigrationActionsRecord; + actions: MetadataUniversalWorkspaceMigrationActionsRecord; optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMaps; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common.ts index 77553b07fd..99ff344bab 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common.ts @@ -1,14 +1,21 @@ import { type AllMetadataName } from 'twenty-shared/metadata'; import { - type MetadataWorkspaceMigrationAction, + type MetadataFlatWorkspaceMigrationAction, + type MetadataUniversalWorkspaceMigrationAction, type WorkspaceMigrationActionType, } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; -export type WorkspaceMigrationAction = MetadataWorkspaceMigrationAction< - AllMetadataName, - WorkspaceMigrationActionType ->; +export type AllUniversalWorkspaceMigrationAction< + TActionType extends + WorkspaceMigrationActionType = WorkspaceMigrationActionType, +> = MetadataUniversalWorkspaceMigrationAction; + +export type AllFlatWorkspaceMigrationAction = + MetadataFlatWorkspaceMigrationAction< + AllMetadataName, + WorkspaceMigrationActionType + >; export { WorkspaceMigrationActionType }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration.ts index 2bedbf8a3e..3231fc9b5f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration.ts @@ -1,8 +1,10 @@ -import { type WorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; +import { type AllUniversalWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; export type WorkspaceMigration< - TActions extends WorkspaceMigrationAction = WorkspaceMigrationAction, + TActions extends + AllUniversalWorkspaceMigrationAction = AllUniversalWorkspaceMigrationAction, > = { actions: TActions[]; workspaceId: string; + applicationUniversalIdentifier: string; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-agent-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-agent-validator.service.ts index 01782a106d..373b62f839 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-agent-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-agent-validator.service.ts @@ -7,7 +7,7 @@ import { isDefined } from 'twenty-shared/utils'; import { AgentExceptionCode } from 'src/engine/metadata-modules/ai/ai-agent/agent.exception'; import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; @@ -99,7 +99,16 @@ export class FlatAgentValidatorService { return validationResult; } - if (!buildOptions.isSystemBuild && isStandardMetadata(existingAgent)) { + if ( + !buildOptions.isSystemBuild && + // TODO refactor once agent has been migrated to universal pattern + isDefined(existingAgent.__universal) && + belongsToTwentyStandardApp({ + universalIdentifier: existingAgent.universalIdentifier, + applicationUniversalIdentifier: + existingAgent.__universal.applicationUniversalIdentifier, + }) + ) { validationResult.errors.push({ code: AgentExceptionCode.AGENT_IS_STANDARD, message: t`Cannot delete standard agent`, @@ -144,7 +153,16 @@ export class FlatAgentValidatorService { return validationResult; } - if (!buildOptions.isSystemBuild && isStandardMetadata(fromFlatAgent)) { + if ( + !buildOptions.isSystemBuild && + // TODO refactor once agent has been migrated to universal pattern + isDefined(fromFlatAgent.__universal) && + belongsToTwentyStandardApp({ + universalIdentifier: fromFlatAgent.universalIdentifier, + applicationUniversalIdentifier: + fromFlatAgent.__universal.applicationUniversalIdentifier, + }) + ) { validationResult.errors.push({ code: AgentExceptionCode.AGENT_IS_STANDARD, message: t`Cannot update standard agent`, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-field-metadata-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-field-metadata-validator.service.ts index 1167ad0416..cab2f2bee7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-field-metadata-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-field-metadata-validator.service.ts @@ -13,7 +13,7 @@ import { isFlatFieldMetadataNameSyncedWithLabel } from 'src/engine/metadata-modu import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { validateFlatFieldMetadataNameAvailability } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util'; import { validateFlatFieldMetadataName } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name.util'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { findFlatEntityPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration/utils/find-flat-entity-property-update.util'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; @@ -264,7 +264,7 @@ export class FlatFieldMetadataValidatorService { ); if ( - isStandardMetadata(flatFieldMetadataToDelete) && + belongsToTwentyStandardApp(flatFieldMetadataToDelete) && !relationTargetObjectMetadataHasBeenDeleted && !parentObjectMetadataHasBeenDeleted ) { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-navigation-menu-item-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-navigation-menu-item-validator.service.ts index 96dc2329bc..75bb32a3fb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-navigation-menu-item-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-navigation-menu-item-validator.service.ts @@ -4,8 +4,8 @@ import { msg, t } from '@lingui/core/macro'; import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; +import { MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; -import { type FlatNavigationMenuItemMaps } from 'src/engine/metadata-modules/flat-navigation-menu-item/types/flat-navigation-menu-item-maps.type'; import { NavigationMenuItemExceptionCode } from 'src/engine/metadata-modules/navigation-menu-item/navigation-menu-item.exception'; import { findFlatEntityPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration/utils/find-flat-entity-property-update.util'; import { validateFlatEntityCircularDependency } from 'src/engine/workspace-manager/workspace-migration/utils/validate-flat-entity-circular-dependency.util'; @@ -107,7 +107,7 @@ export class FlatNavigationMenuItemValidatorService { }: { navigationMenuItemId: string; folderId: string; - flatNavigationMenuItemMaps: FlatNavigationMenuItemMaps; + flatNavigationMenuItemMaps: MetadataFlatEntityMaps<'navigationMenuItem'>; }): FlatEntityValidationError[] { const circularDependencyResult = validateFlatEntityCircularDependency({ flatEntityId: navigationMenuItemId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-object-metadata-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-object-metadata-validator.service.ts index 70ce3e881b..79dd5937c6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-object-metadata-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-object-metadata-validator.service.ts @@ -7,7 +7,7 @@ import { isDefined } from 'twenty-shared/utils'; import { validateFlatObjectMetadataIdentifiers } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util'; import { validateFlatObjectMetadataNameAndLabels } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name-and-labels.util'; import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type'; @@ -140,7 +140,7 @@ export class FlatObjectMetadataValidatorService { if ( !buildOptions.isSystemBuild && - isStandardMetadata(flatObjectMetadataToDelete) + belongsToTwentyStandardApp(flatObjectMetadataToDelete) ) { validationResult.errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-skill-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-skill-validator.service.ts index b9aa4b8c29..52f6903ae6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-skill-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-builder/validators/services/flat-skill-validator.service.ts @@ -7,7 +7,7 @@ import { isDefined } from 'twenty-shared/utils'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { type FlatSkill } from 'src/engine/metadata-modules/flat-skill/types/flat-skill.type'; import { SkillExceptionCode } from 'src/engine/metadata-modules/skill/skill.exception'; -import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util'; import { findFlatEntityPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration/utils/find-flat-entity-property-update.util'; import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util'; @@ -93,7 +93,16 @@ export class FlatSkillValidatorService { return validationResult; } - if (!buildOptions.isSystemBuild && isStandardMetadata(existingSkill)) { + if ( + !buildOptions.isSystemBuild && + // TODO refactor once skill has been migrated to universal pattern + isDefined(existingSkill.__universal) && + belongsToTwentyStandardApp({ + universalIdentifier: existingSkill.universalIdentifier, + applicationUniversalIdentifier: + existingSkill.__universal.applicationUniversalIdentifier, + }) + ) { validationResult.errors.push({ code: SkillExceptionCode.SKILL_IS_STANDARD, message: t`Cannot delete standard skill`, @@ -148,9 +157,18 @@ export class FlatSkillValidatorService { (update) => update.property !== 'isActive', ); + // TODO refactor once skill has been migrated to universal pattern + const isTwentyStandardSkill = + isDefined(fromFlatSkill.__universal) && + belongsToTwentyStandardApp({ + universalIdentifier: fromFlatSkill.universalIdentifier, + applicationUniversalIdentifier: + fromFlatSkill.__universal.applicationUniversalIdentifier, + }); + if ( !buildOptions.isSystemBuild && - isStandardMetadata(fromFlatSkill) && + isTwentyStandardSkill && hasNonIsActiveUpdates ) { validationResult.errors.push({ @@ -162,7 +180,7 @@ export class FlatSkillValidatorService { // If only isActive is being updated on a standard skill, allow it if ( - isStandardMetadata(fromFlatSkill) && + isTwentyStandardSkill && isDefined(isActiveUpdate) && !hasNonIsActiveUpdates ) { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/create-agent-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/create-agent-action-handler.service.ts index b4cc7b78cd..7ca671ea15 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/create-agent-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/create-agent-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity'; -import { CreateAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateAgentActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreateAgentActionHandlerService extends WorkspaceMigrationRunnerAct super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const agentRepository = queryRunner.manager.getRepository(AgentEntity); @@ -31,7 +40,7 @@ export class CreateAgentActionHandlerService extends WorkspaceMigrationRunnerAct } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/delete-agent-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/delete-agent-action-handler.service.ts index 7a482a6d58..285be86be8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/delete-agent-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/delete-agent-action-handler.service.ts @@ -3,9 +3,14 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; -import { DeleteAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteAgentAction, + UniversalDeleteAgentAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteAgentActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,25 +21,25 @@ export class DeleteAgentActionHandlerService extends WorkspaceMigrationRunnerAct super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatAgent = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatAgentMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const agentRepository = queryRunner.manager.getRepository(AgentEntity); - await agentRepository.delete({ id: flatAgent.id, workspaceId }); + await agentRepository.delete({ id: flatAction.entityId, workspaceId }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/update-agent-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/update-agent-action-handler.service.ts index cea153c74f..a1c0af7a17 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/update-agent-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/agent/services/update-agent-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity'; -import { UpdateAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateAgentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/types/workspace-migration-agent-action-builder.service'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,11 +15,17 @@ export class UpdateAgentActionHandlerService extends WorkspaceMigrationRunnerAct 'update', 'agent', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { entityId, updates } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { entityId, updates } = flatAction; const agentRepository = queryRunner.manager.getRepository(AgentEntity); @@ -30,7 +39,7 @@ export class UpdateAgentActionHandlerService extends WorkspaceMigrationRunnerAct } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/create-command-menu-item-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/create-command-menu-item-action-handler.service.ts index ecf9fdabf0..84916f739a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/create-command-menu-item-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/create-command-menu-item-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { CommandMenuItemEntity } from 'src/engine/metadata-modules/command-menu-item/entities/command-menu-item.entity'; -import { CreateCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateCommandMenuItemActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreateCommandMenuItemActionHandlerService extends WorkspaceMigratio super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const commandMenuItemRepository = queryRunner.manager.getRepository( @@ -33,7 +42,7 @@ export class CreateCommandMenuItemActionHandlerService extends WorkspaceMigratio } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/delete-command-menu-item-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/delete-command-menu-item-action-handler.service.ts index 59392ed735..cf007cef68 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/delete-command-menu-item-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/delete-command-menu-item-action-handler.service.ts @@ -3,9 +3,14 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { CommandMenuItemEntity } from 'src/engine/metadata-modules/command-menu-item/entities/command-menu-item.entity'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; -import { DeleteCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteCommandMenuItemAction, + UniversalDeleteCommandMenuItemAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteCommandMenuItemActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,16 +21,16 @@ export class DeleteCommandMenuItemActionHandlerService extends WorkspaceMigratio super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatCommandMenuItem = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatCommandMenuItemMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const commandMenuItemRepository = queryRunner.manager.getRepository( @@ -33,13 +38,13 @@ export class DeleteCommandMenuItemActionHandlerService extends WorkspaceMigratio ); await commandMenuItemRepository.delete({ - id: flatCommandMenuItem.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/update-command-menu-item-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/update-command-menu-item-action-handler.service.ts index 30ae8f3282..36b6f3be33 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/update-command-menu-item-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/command-menu-item/services/update-command-menu-item-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { CommandMenuItemEntity } from 'src/engine/metadata-modules/command-menu-item/entities/command-menu-item.entity'; -import { UpdateCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateCommandMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/types/workspace-migration-command-menu-item-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,11 +15,17 @@ export class UpdateCommandMenuItemActionHandlerService extends WorkspaceMigratio 'update', 'commandMenuItem', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { entityId, updates } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { entityId, updates } = flatAction; const commandMenuItemRepository = queryRunner.manager.getRepository( @@ -32,7 +41,7 @@ export class UpdateCommandMenuItemActionHandlerService extends WorkspaceMigratio } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/create-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/create-field-action-handler.service.ts index 29b428100c..fc470c7f36 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/create-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/create-field-action-handler.service.ts @@ -2,17 +2,29 @@ import { Injectable } from '@nestjs/common'; import { RelationType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; +import { type QueryRunner } from 'typeorm'; +import { v4 } from 'uuid'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; +import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; import { convertOnDeleteActionToOnDelete } from 'src/engine/workspace-manager/workspace-migration/utils/convert-on-delete-action-to-on-delete.util'; -import { type CreateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + type FlatCreateFieldAction, + type UniversalCreateFieldAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; +import { fromUniversalFlatFieldMetadataToFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util'; +import { + WorkspaceMigrationActionRunnerContext, + type WorkspaceMigrationActionRunnerArgs, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util'; import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/get-workspace-schema-context-for-migration.util'; import { @@ -32,108 +44,199 @@ export class CreateFieldActionHandlerService extends WorkspaceMigrationRunnerAct super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + const { action, allFlatEntityMaps } = context; + const { universalFlatFieldMetadatas, fieldIdByUniversalIdentifier } = + action; + + const allFieldIdToBeCreatedInActionByUniversalIdentifierMap = new Map< + string, + string + >(); + + for (const universalFlatFieldMetadata of universalFlatFieldMetadatas) { + const providedId = + fieldIdByUniversalIdentifier?.[ + universalFlatFieldMetadata.universalIdentifier + ]; + + allFieldIdToBeCreatedInActionByUniversalIdentifierMap.set( + universalFlatFieldMetadata.universalIdentifier, + providedId ?? v4(), + ); + } + + const flatFieldMetadatas = universalFlatFieldMetadatas.map( + (universalFlatFieldMetadata) => + fromUniversalFlatFieldMetadataToFlatFieldMetadata({ + universalFlatFieldMetadata, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + allFlatEntityMaps, + context, + }), + ); + + return { + type: action.type, + metadataName: action.metadataName, + flatFieldMetadatas, + }; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; + const { queryRunner, flatAction } = context; + const { flatFieldMetadatas } = flatAction; + const fieldMetadataRepository = queryRunner.manager.getRepository( FieldMetadataEntity, ); - const { flatFieldMetadatas } = action; - - for (const flatFieldMetadata of flatFieldMetadatas) { - await fieldMetadataRepository.insert(flatFieldMetadata); - } + await fieldMetadataRepository.insert(flatFieldMetadatas); } async executeForWorkspaceSchema( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { const { - action, + flatAction, queryRunner, allFlatEntityMaps: { flatObjectMetadataMaps }, workspaceId, } = context; - const { flatFieldMetadatas } = action; + const { flatFieldMetadatas } = flatAction; + + const fieldsByObjectMetadataId = new Map< + string, + typeof flatFieldMetadatas + >(); - // TODO prastoin improve doing batchs for (const flatFieldMetadata of flatFieldMetadatas) { + const existingFields = fieldsByObjectMetadataId.get( + flatFieldMetadata.objectMetadataId, + ); + + if (isDefined(existingFields)) { + existingFields.push(flatFieldMetadata); + } else { + fieldsByObjectMetadataId.set(flatFieldMetadata.objectMetadataId, [ + flatFieldMetadata, + ]); + } + } + + for (const [ + objectMetadataId, + objectFlatFieldMetadatas, + ] of fieldsByObjectMetadataId) { const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: flatObjectMetadataMaps, - flatEntityId: flatFieldMetadata.objectMetadataId, + flatEntityId: objectMetadataId, }); const { schemaName, tableName } = getWorkspaceSchemaContextForMigration({ workspaceId, - flatObjectMetadata, + objectMetadata: flatObjectMetadata, }); - const enumOperations = collectEnumOperationsForField({ - flatFieldMetadata, - tableName, - operation: EnumOperation.CREATE, - }); - - const columnDefinitions = generateColumnDefinitions({ - flatFieldMetadata, - flatObjectMetadata, - }); - - await executeBatchEnumOperations({ - enumOperations, - queryRunner, - schemaName, - workspaceSchemaManagerService: this.workspaceSchemaManagerService, - }); - - await this.workspaceSchemaManagerService.columnManager.addColumns({ - queryRunner, - schemaName, - tableName, - columnDefinitions, - }); - - if ( - isMorphOrRelationFlatFieldMetadata(flatFieldMetadata) && - flatFieldMetadata.settings.relationType === RelationType.MANY_TO_ONE - ) { - const targetFlatObjectMetadata = - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: flatFieldMetadata.relationTargetObjectMetadataId, - flatEntityMaps: flatObjectMetadataMaps, - }); - const referencedTableName = computeObjectTargetTable( - targetFlatObjectMetadata, - ); - - const joinColumnName = flatFieldMetadata.settings.joinColumnName; - - if (!isDefined(joinColumnName)) { - throw new Error( - 'Join column name is not defined in a MANY_TO_ONE relation', - ); - } - - await this.workspaceSchemaManagerService.foreignKeyManager.createForeignKey( - { - queryRunner, - schemaName, - foreignKey: { - tableName, - columnName: joinColumnName, - referencedTableName, - referencedColumnName: 'id', - onDelete: - convertOnDeleteActionToOnDelete( - flatFieldMetadata.settings.onDelete, - ) ?? 'CASCADE', - }, - }, - ); + for (const flatFieldMetadata of objectFlatFieldMetadatas) { + await this.executeSingleFieldMetadataWorkspaceSchema({ + flatFieldMetadata, + flatObjectMetadata, + flatObjectMetadataMaps, + queryRunner, + schemaName, + tableName, + workspaceId, + }); } } } + + private async executeSingleFieldMetadataWorkspaceSchema({ + flatFieldMetadata, + flatObjectMetadata, + flatObjectMetadataMaps, + queryRunner, + schemaName, + tableName, + workspaceId, + }: { + flatFieldMetadata: FlatFieldMetadata; + flatObjectMetadata: FlatObjectMetadata; + flatObjectMetadataMaps: MetadataFlatEntityMaps<'objectMetadata'>; + queryRunner: QueryRunner; + schemaName: string; + tableName: string; + workspaceId: string; + }): Promise { + const enumOperations = collectEnumOperationsForField({ + flatFieldMetadata, + tableName, + operation: EnumOperation.CREATE, + }); + + const columnDefinitions = generateColumnDefinitions({ + flatFieldMetadata, + flatObjectMetadata, + workspaceId, + }); + + await executeBatchEnumOperations({ + enumOperations, + queryRunner, + schemaName, + workspaceSchemaManagerService: this.workspaceSchemaManagerService, + }); + + await this.workspaceSchemaManagerService.columnManager.addColumns({ + queryRunner, + schemaName, + tableName, + columnDefinitions, + }); + + if ( + isMorphOrRelationFlatFieldMetadata(flatFieldMetadata) && + flatFieldMetadata.settings?.relationType === RelationType.MANY_TO_ONE + ) { + const targetFlatObjectMetadata = + findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityMaps: flatObjectMetadataMaps, + flatEntityId: flatFieldMetadata.relationTargetObjectMetadataId!, + }); + const referencedTableName = computeObjectTargetTable( + targetFlatObjectMetadata, + ); + + const joinColumnName = flatFieldMetadata.settings?.joinColumnName; + + if (!isDefined(joinColumnName)) { + throw new Error( + 'Join column name is not defined in a MANY_TO_ONE relation', + ); + } + + await this.workspaceSchemaManagerService.foreignKeyManager.createForeignKey( + { + queryRunner, + schemaName, + foreignKey: { + tableName, + columnName: joinColumnName, + referencedTableName, + referencedColumnName: 'id', + onDelete: + convertOnDeleteActionToOnDelete( + flatFieldMetadata.settings?.onDelete, + ) ?? 'CASCADE', + }, + }, + ); + } + } } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/delete-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/delete-field-action-handler.service.ts index 211fc97dfe..cf63b42c4c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/delete-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/delete-field-action-handler.service.ts @@ -3,10 +3,16 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; -import { type DeleteFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + type FlatDeleteFieldAction, + type UniversalDeleteFieldAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util'; import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/get-workspace-schema-context-for-migration.util'; import { @@ -26,16 +32,16 @@ export class DeleteFieldActionHandlerService extends WorkspaceMigrationRunnerAct super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ) { - const { action, queryRunner, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatFieldMetadata = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatFieldMetadataMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ) { + const { flatAction, queryRunner, workspaceId } = context; const fieldMetadataRepository = queryRunner.manager.getRepository( @@ -43,40 +49,40 @@ export class DeleteFieldActionHandlerService extends WorkspaceMigrationRunnerAct ); await fieldMetadataRepository.delete({ - id: flatFieldMetadata.id, - workspaceId: context.workspaceId, + id: flatAction.entityId, + workspaceId, }); } async executeForWorkspaceSchema( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ) { const { - action, + flatAction, queryRunner, allFlatEntityMaps: { flatObjectMetadataMaps, flatFieldMetadataMaps }, workspaceId, } = context; - const { universalIdentifier } = action; - const fieldMetadata = findFlatEntityByUniversalIdentifierOrThrow({ + const flatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: flatFieldMetadataMaps, - universalIdentifier, + flatEntityId: flatAction.entityId, }); - const flatObjectMetadata = findFlatEntityByUniversalIdentifierOrThrow({ + const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: flatObjectMetadataMaps, - universalIdentifier: fieldMetadata.objectMetadataUniversalIdentifier, + flatEntityId: flatFieldMetadata.objectMetadataId, }); const { schemaName, tableName } = getWorkspaceSchemaContextForMigration({ workspaceId, - flatObjectMetadata, + objectMetadata: flatObjectMetadata, }); const columnDefinitions = generateColumnDefinitions({ - flatFieldMetadata: fieldMetadata, - flatObjectMetadata: flatObjectMetadata, + flatFieldMetadata, + flatObjectMetadata, + workspaceId, }); const columnNamesToDrop = columnDefinitions.map((def) => def.name); @@ -89,7 +95,7 @@ export class DeleteFieldActionHandlerService extends WorkspaceMigrationRunnerAct }); const enumOperations = collectEnumOperationsForField({ - flatFieldMetadata: fieldMetadata, + flatFieldMetadata, tableName, operation: EnumOperation.DROP, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts index 4a63b1c200..95186bd9ce 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/update-field-action-handler.service.ts @@ -9,7 +9,6 @@ import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-mana import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; import { getCompositeTypeOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/get-composite-type-or-throw.util'; -import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; import { FlatEntityPropertiesToCompare } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-properties-to-compare.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; @@ -25,13 +24,19 @@ import { PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration import { convertOnDeleteActionToOnDelete } from 'src/engine/workspace-manager/workspace-migration/utils/convert-on-delete-action-to-on-delete.util'; import { findFlatEntityPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration/utils/find-flat-entity-property-update.util'; import { isPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration/utils/is-property-update.util'; -import { UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; +import { + FlatUpdateFieldAction, + UniversalUpdateFieldAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/types/workspace-migration-field-action'; import { serializeDefaultValue } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/utils/serialize-default-value.util'; import { WorkspaceMigrationActionExecutionException, WorkspaceMigrationActionExecutionExceptionCode, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-action-execution.exception'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fieldMetadataTypeToColumnType } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/field-metadata-type-to-column-type.util'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util'; @@ -64,48 +69,68 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + const { action, allFlatEntityMaps } = context; + + const flatFieldMetadata = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatFieldMetadataMaps, + universalIdentifier: action.universalIdentifier, + }); + + // TODO: transpile settings universal identifiers when builder has been migrated + // For now, updates only contain flat entity diff properties (already IDs, not universal identifiers) + + return { + type: 'update', + metadataName: 'fieldMetadata', + entityId: flatFieldMetadata.id, + updates: action.updates, + }; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; + const { flatAction, queryRunner } = context; const fieldMetadataRepository = queryRunner.manager.getRepository( FieldMetadataEntity, ); - const { entityId } = action; + const { entityId } = flatAction; await fieldMetadataRepository.update( entityId, - fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action), + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction), ); } async executeForWorkspaceSchema( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { const { - action, + flatAction, queryRunner, allFlatEntityMaps: { flatObjectMetadataMaps, flatFieldMetadataMaps }, workspaceId, } = context; - const { entityId, updates } = action; + const { entityId, updates } = flatAction; const currentFlatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityId: entityId, flatEntityMaps: flatFieldMetadataMaps, }); - const flatObjectMetadata = findFlatEntityByUniversalIdentifierOrThrow({ + const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: flatObjectMetadataMaps, - universalIdentifier: - currentFlatFieldMetadata.objectMetadataUniversalIdentifier, + flatEntityId: currentFlatFieldMetadata.objectMetadataId, }); const { schemaName, tableName } = getWorkspaceSchemaContextForMigration({ workspaceId, - flatObjectMetadata, + objectMetadata: flatObjectMetadata, }); let optimisticFlatFieldMetadata = structuredClone(currentFlatFieldMetadata); @@ -166,9 +191,10 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct queryRunner, schemaName, tableName, - flatObjectMetadata, flatFieldMetadata: optimisticFlatFieldMetadata, + flatObjectMetadata, update, + workspaceId, }); optimisticFlatFieldMetadata.options = update.to ?? []; } @@ -337,7 +363,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct } const enumOperations = collectEnumOperationsForField({ - flatFieldMetadata: flatFieldMetadata, + flatFieldMetadata, tableName, operation: EnumOperation.RENAME, options: { @@ -360,7 +386,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct tableName, update, }: UpdateFieldPropertyUpdateHandlerArgs<'defaultValue'>) { - if (isCompositeFieldMetadataType(flatFieldMetadata.type)) { + if (isCompositeFlatFieldMetadata(flatFieldMetadata)) { const compositeType = getCompositeTypeOrThrow(flatFieldMetadata.type); for (const property of compositeType.properties) { @@ -435,8 +461,10 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct tableName, update, flatObjectMetadata, + workspaceId, }: UpdateFieldPropertyUpdateHandlerArgs<'options'> & { flatObjectMetadata: FlatObjectMetadata; + workspaceId: string; }) { const fromOptionsById = new Map( (update.from ?? []) @@ -461,8 +489,9 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct } const enumColumnDefinitions = generateColumnDefinitions({ - flatFieldMetadata: flatFieldMetadata, - flatObjectMetadata: flatObjectMetadata, + flatFieldMetadata, + flatObjectMetadata, + workspaceId, }); for (const enumColumnDefinition of enumColumnDefinitions) { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/find-field-metadata-id-in-create-field-context.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/find-field-metadata-id-in-create-field-context.util.ts new file mode 100644 index 0000000000..fb2eeaa9a8 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/find-field-metadata-id-in-create-field-context.util.ts @@ -0,0 +1,27 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; + +export const findFieldMetadataIdInCreateFieldContext = ({ + universalIdentifier, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + flatFieldMetadataMaps, +}: { + universalIdentifier: string; + allFieldIdToBeCreatedInActionByUniversalIdentifierMap: Map; + flatFieldMetadataMaps: MetadataFlatEntityMaps<'fieldMetadata'>; +}): string | null => { + const generatedId = + allFieldIdToBeCreatedInActionByUniversalIdentifierMap.get( + universalIdentifier, + ); + + if (isDefined(generatedId)) { + return generatedId; + } + + const existingFieldId = + flatFieldMetadataMaps.idByUniversalIdentifier[universalIdentifier]; + + return existingFieldId ?? null; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util.ts new file mode 100644 index 0000000000..ea73828009 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util.ts @@ -0,0 +1,147 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { type AllUniversalWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; +import { findFieldMetadataIdInCreateFieldContext } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/find-field-metadata-id-in-create-field-context.util'; +import { fromUniversalSettingsToFlatFieldMetadataSettings } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-settings-to-flat-field-metadata-settings.util'; +import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; + +export type FromUniversalFlatFieldMetadataToFlatFieldMetadataArgs = { + allFieldIdToBeCreatedInActionByUniversalIdentifierMap: Map; + universalFlatFieldMetadata: UniversalFlatFieldMetadata; + allFlatEntityMaps: AllFlatEntityMaps; + context: Pick< + WorkspaceMigrationActionRunnerArgs, + 'workspaceId' | 'flatApplication' + >; + objectMetadataId?: string; +}; + +const getIdFromUniversalIdentifier = ( + universalIdentifier: string, + flatEntityMaps: { idByUniversalIdentifier: Partial> }, +): string | null => { + return flatEntityMaps.idByUniversalIdentifier[universalIdentifier] ?? null; +}; + +export const fromUniversalFlatFieldMetadataToFlatFieldMetadata = ({ + universalFlatFieldMetadata, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + allFlatEntityMaps, + objectMetadataId: optionalObjectMetadataId, + context: { + flatApplication: { id: applicationId }, + workspaceId, + }, +}: FromUniversalFlatFieldMetadataToFlatFieldMetadataArgs): FlatFieldMetadata => { + const { + universalIdentifier, + applicationUniversalIdentifier, + objectMetadataUniversalIdentifier, + relationTargetFieldMetadataUniversalIdentifier, + relationTargetObjectMetadataUniversalIdentifier, + viewFilterUniversalIdentifiers: _viewFilterUniversalIdentifiers, + viewFieldUniversalIdentifiers: _viewFieldUniversalIdentifiers, + kanbanAggregateOperationViewUniversalIdentifiers: + _kanbanAggregateOperationViewUniversalIdentifiers, + calendarViewUniversalIdentifiers: _calendarViewUniversalIdentifiers, + mainGroupByFieldMetadataViewUniversalIdentifiers: + _mainGroupByFieldMetadataViewUniversalIdentifiers, + universalSettings, + ...restProperties + } = universalFlatFieldMetadata; + + const generatedId = + allFieldIdToBeCreatedInActionByUniversalIdentifierMap.get( + universalIdentifier, + ); + + if (!isDefined(generatedId)) { + throw new Error( + `Generated ID not found for universal identifier: ${universalIdentifier}`, + ); + } + + const objectMetadataId = + optionalObjectMetadataId ?? + getIdFromUniversalIdentifier( + objectMetadataUniversalIdentifier, + allFlatEntityMaps.flatObjectMetadataMaps, + ); + + if (!isDefined(objectMetadataId)) { + throw new Error( + `Object metadata not found for universal identifier: ${objectMetadataUniversalIdentifier}`, + ); + } + + let relationTargetFieldMetadataId: string | null = null; + + if (isDefined(relationTargetFieldMetadataUniversalIdentifier)) { + relationTargetFieldMetadataId = findFieldMetadataIdInCreateFieldContext({ + universalIdentifier: relationTargetFieldMetadataUniversalIdentifier, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + flatFieldMetadataMaps: allFlatEntityMaps.flatFieldMetadataMaps, + }); + + if (!isDefined(relationTargetFieldMetadataId)) { + throw new Error( + `Relation target field metadata not found for universal identifier: ${relationTargetFieldMetadataUniversalIdentifier}`, + ); + } + } + + let relationTargetObjectMetadataId: string | null = null; + + if (isDefined(relationTargetObjectMetadataUniversalIdentifier)) { + relationTargetObjectMetadataId = getIdFromUniversalIdentifier( + relationTargetObjectMetadataUniversalIdentifier, + allFlatEntityMaps.flatObjectMetadataMaps, + ); + + if (!isDefined(relationTargetObjectMetadataId)) { + throw new Error( + `Relation target object metadata not found for universal identifier: ${relationTargetObjectMetadataUniversalIdentifier}`, + ); + } + } + + const settings = fromUniversalSettingsToFlatFieldMetadataSettings({ + universalSettings, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + flatFieldMetadataMaps: allFlatEntityMaps.flatFieldMetadataMaps, + }); + + return { + ...restProperties, + settings, + universalSettings, + id: generatedId, + workspaceId, + applicationId, + standardId: null, + universalIdentifier, + objectMetadataId, + objectMetadataUniversalIdentifier, + relationTargetFieldMetadataId, + relationTargetFieldMetadataUniversalIdentifier: + relationTargetFieldMetadataUniversalIdentifier ?? null, + relationTargetObjectMetadataId, + relationTargetObjectMetadataUniversalIdentifier: + relationTargetObjectMetadataUniversalIdentifier ?? null, + applicationUniversalIdentifier, + // Empty aggregator arrays for newly created entities + viewFieldIds: [], + viewFilterIds: [], + calendarViewIds: [], + mainGroupByFieldMetadataViewIds: [], + kanbanAggregateOperationViewIds: [], + viewFieldUniversalIdentifiers: [], + viewFilterUniversalIdentifiers: [], + calendarViewUniversalIdentifiers: [], + mainGroupByFieldMetadataViewUniversalIdentifiers: [], + kanbanAggregateOperationViewUniversalIdentifiers: [], + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-settings-to-flat-field-metadata-settings.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-settings-to-flat-field-metadata-settings.util.ts new file mode 100644 index 0000000000..ec65c276fa --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-settings-to-flat-field-metadata-settings.util.ts @@ -0,0 +1,68 @@ +import { + type FieldMetadataSettings, + FieldMetadataType, +} from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; + +import { isUniversalFieldMetadataSettingsOftype } from 'src/engine/metadata-modules/field-metadata/utils/is-field-metadata-settings-of-type.util'; +import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; +import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type'; +import { findFieldMetadataIdInCreateFieldContext } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/find-field-metadata-id-in-create-field-context.util'; +import { + WorkspaceMigrationActionExecutionException, + WorkspaceMigrationActionExecutionExceptionCode, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-action-execution.exception'; + +export const fromUniversalSettingsToFlatFieldMetadataSettings = ({ + universalSettings, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + flatFieldMetadataMaps, +}: { + universalSettings: UniversalFlatFieldMetadata['universalSettings']; + allFieldIdToBeCreatedInActionByUniversalIdentifierMap: Map; + flatFieldMetadataMaps: MetadataFlatEntityMaps<'fieldMetadata'>; +}): FieldMetadataSettings => { + if (!isDefined(universalSettings)) { + return null; + } + + if ( + isUniversalFieldMetadataSettingsOftype( + universalSettings, + FieldMetadataType.RELATION, + ) || + isUniversalFieldMetadataSettingsOftype( + universalSettings, + FieldMetadataType.MORPH_RELATION, + ) + ) { + const { junctionTargetFieldUniversalIdentifier, ...rest } = + universalSettings; + const junctionTargetFieldId = isDefined( + junctionTargetFieldUniversalIdentifier, + ) + ? (findFieldMetadataIdInCreateFieldContext({ + universalIdentifier: junctionTargetFieldUniversalIdentifier, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + flatFieldMetadataMaps, + }) ?? undefined) + : undefined; + + if ( + isDefined(junctionTargetFieldUniversalIdentifier) && + !isDefined(junctionTargetFieldId) + ) { + throw new WorkspaceMigrationActionExecutionException({ + code: WorkspaceMigrationActionExecutionExceptionCode.FIELD_METADATA_NOT_FOUND, + message: `Could not not find junction column id for universal identifier ${junctionTargetFieldUniversalIdentifier}`, + }); + } + + return { + ...rest, + junctionTargetFieldId, + }; + } + + return universalSettings; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/create-front-component-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/create-front-component-action-handler.service.ts index 34aedf3ce3..ada32ee78b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/create-front-component-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/create-front-component-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { FrontComponentEntity } from 'src/engine/metadata-modules/front-component/entities/front-component.entity'; -import { CreateFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateFrontComponentActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreateFrontComponentActionHandlerService extends WorkspaceMigration super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const frontComponentRepository = queryRunner.manager.getRepository( @@ -33,7 +42,7 @@ export class CreateFrontComponentActionHandlerService extends WorkspaceMigration } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/delete-front-component-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/delete-front-component-action-handler.service.ts index 022ecf2300..39fa5bf653 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/delete-front-component-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/delete-front-component-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { FrontComponentEntity } from 'src/engine/metadata-modules/front-component/entities/front-component.entity'; -import { DeleteFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteFrontComponentAction, + UniversalDeleteFrontComponentAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteFrontComponentActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,16 +21,16 @@ export class DeleteFrontComponentActionHandlerService extends WorkspaceMigration super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatFrontComponent = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatFrontComponentMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const frontComponentRepository = queryRunner.manager.getRepository( @@ -33,13 +38,13 @@ export class DeleteFrontComponentActionHandlerService extends WorkspaceMigration ); await frontComponentRepository.delete({ - id: flatFrontComponent.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/update-front-component-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/update-front-component-action-handler.service.ts index 72bb30dc65..3be434699c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/update-front-component-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/front-component/services/update-front-component-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { FrontComponentEntity } from 'src/engine/metadata-modules/front-component/entities/front-component.entity'; -import { UpdateFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateFrontComponentAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/types/workspace-migration-front-component-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,11 +15,17 @@ export class UpdateFrontComponentActionHandlerService extends WorkspaceMigration 'update', 'frontComponent', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { entityId, updates } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { entityId, updates } = flatAction; const frontComponentRepository = queryRunner.manager.getRepository( @@ -32,7 +41,7 @@ export class UpdateFrontComponentActionHandlerService extends WorkspaceMigration } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/create-index-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/create-index-action-handler.service.ts index 0afa64c0af..795a50982e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/create-index-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/create-index-action-handler.service.ts @@ -4,12 +4,15 @@ import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-mana import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; -import { type CreateIndexAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; +import { type FlatCreateIndexAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; import { createIndexInWorkspaceSchema, insertIndexMetadata, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/index-action-handler.utils'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateIndexActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -22,23 +25,29 @@ export class CreateIndexActionHandlerService extends WorkspaceMigrationRunnerAct super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; + const { flatAction, queryRunner } = context; await insertIndexMetadata({ - flatIndexMetadata: action.flatEntity, + flatIndexMetadata: flatAction.flatEntity, queryRunner, }); } async executeForWorkspaceSchema( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { const { allFlatEntityMaps: { flatObjectMetadataMaps, flatFieldMetadataMaps }, - action: { flatEntity: flatIndexMetadata }, + flatAction: { flatEntity: flatIndexMetadata }, queryRunner, workspaceId, } = context; @@ -50,8 +59,8 @@ export class CreateIndexActionHandlerService extends WorkspaceMigrationRunnerAct await createIndexInWorkspaceSchema({ flatIndexMetadata, - flatObjectMetadata, flatFieldMetadataMaps, + flatObjectMetadata, workspaceSchemaManagerService: this.workspaceSchemaManagerService, queryRunner, workspaceId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/delete-index-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/delete-index-action-handler.service.ts index d801430ae7..6af2fcab52 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/delete-index-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/delete-index-action-handler.service.ts @@ -2,15 +2,21 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { type DeleteIndexAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; +import { + type FlatDeleteIndexAction, + type UniversalDeleteIndexAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; import { deleteIndexMetadata, dropIndexFromWorkspaceSchema, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/index-action-handler.utils'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteIndexActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -23,40 +29,40 @@ export class DeleteIndexActionHandlerService extends WorkspaceMigrationRunnerAct super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, allFlatEntityMaps, workspaceId } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatIndex = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatIndexMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; await deleteIndexMetadata({ - entityId: flatIndex.id, + entityId: flatAction.entityId, queryRunner, workspaceId, }); } async executeForWorkspaceSchema( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { const { - action, + flatAction, allFlatEntityMaps: { flatIndexMaps }, queryRunner, workspaceId, } = context; - const { universalIdentifier } = action; - const flatIndexMetadataToDelete = - findFlatEntityByUniversalIdentifierOrThrow({ - universalIdentifier, + const flatIndexMetadataToDelete = findFlatEntityByIdInFlatEntityMapsOrThrow( + { + flatEntityId: flatAction.entityId, flatEntityMaps: flatIndexMaps, - }); + }, + ); const schemaName = getWorkspaceSchemaName(workspaceId); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/update-index-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/update-index-action-handler.service.ts index 688a9e4aae..e2b1bf33c3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/update-index-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/services/update-index-action-handler.service.ts @@ -5,14 +5,17 @@ import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-mana import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { type UpdateIndexAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; +import { type FlatUpdateIndexAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/types/workspace-migration-index-action'; import { createIndexInWorkspaceSchema, deleteIndexMetadata, dropIndexFromWorkspaceSchema, insertIndexMetadata, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/index-action-handler.utils'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class UpdateIndexActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -25,30 +28,36 @@ export class UpdateIndexActionHandlerService extends WorkspaceMigrationRunnerAct super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; + const { flatAction, queryRunner, workspaceId } = context; // Delete old index metadata await deleteIndexMetadata({ - entityId: action.entityId, + entityId: flatAction.entityId, queryRunner, workspaceId, }); // Create new index metadata await insertIndexMetadata({ - flatIndexMetadata: action.updatedFlatEntity, + flatIndexMetadata: flatAction.updatedFlatEntity, queryRunner, }); } async executeForWorkspaceSchema( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { const { - action, + flatAction, allFlatEntityMaps: { flatIndexMaps, flatObjectMetadataMaps, @@ -58,7 +67,7 @@ export class UpdateIndexActionHandlerService extends WorkspaceMigrationRunnerAct workspaceId, } = context; - const { entityId, updatedFlatEntity } = action; + const { entityId, updatedFlatEntity } = flatAction; // Get the old index to drop it const flatIndexMetadataToDelete = findFlatEntityByIdInFlatEntityMapsOrThrow( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/index-action-handler.utils.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/index-action-handler.utils.ts index fa346f7bd2..2e1ba53041 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/index-action-handler.utils.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/index/utils/index-action-handler.utils.ts @@ -8,17 +8,16 @@ import { FlatEntityMapsException, FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; -import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; +import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { type FlatIndexFieldMetadata, type FlatIndexMetadata, } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type'; -import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { IndexFieldMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-field-metadata.entity'; import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; +import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { type WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; import { WorkspaceMigrationActionExecutionException, @@ -31,7 +30,7 @@ export const computeFlatIndexFieldColumnNames = ({ flatFieldMetadataMaps, }: { flatIndexFieldMetadatas: FlatIndexFieldMetadata[]; - flatFieldMetadataMaps: FlatEntityMaps; + flatFieldMetadataMaps: MetadataFlatEntityMaps<'fieldMetadata'>; }): string[] => { return flatIndexFieldMetadatas.flatMap(({ fieldMetadataId }) => { const flatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ @@ -149,14 +148,14 @@ export const createIndexInWorkspaceSchema = async ({ }: { flatIndexMetadata: FlatIndexMetadata; flatObjectMetadata: FlatObjectMetadata; - flatFieldMetadataMaps: FlatEntityMaps; + flatFieldMetadataMaps: MetadataFlatEntityMaps<'fieldMetadata'>; workspaceSchemaManagerService: WorkspaceSchemaManagerService; queryRunner: QueryRunner; workspaceId: string; }): Promise => { const { schemaName, tableName } = getWorkspaceSchemaContextForMigration({ workspaceId, - flatObjectMetadata, + objectMetadata: flatObjectMetadata, }); const columns = computeFlatIndexFieldColumnNames({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/create-logic-function-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/create-logic-function-action-handler.service.ts index 3df030ba6a..3d16c20a2d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/create-logic-function-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/create-logic-function-action-handler.service.ts @@ -21,8 +21,11 @@ import { LogicFunctionException, LogicFunctionExceptionCode, } from 'src/engine/metadata-modules/logic-function/logic-function.exception'; -import { CreateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; import { LogicFunctionBuildService } from 'src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service'; @@ -40,11 +43,17 @@ export class CreateLogicFunctionActionHandlerService extends WorkspaceMigrationR super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity: logicFunction } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity: logicFunction } = flatAction; const applicationUniversalIdentifier = await this.getApplicationUniversalIdentifier(logicFunction.applicationId); @@ -147,7 +156,10 @@ export class CreateLogicFunctionActionHandlerService extends WorkspaceMigrationR } async rollbackForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: Omit< + WorkspaceMigrationActionRunnerArgs, + 'queryRunner' + >, ): Promise { const { action } = context; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/delete-logic-function-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/delete-logic-function-action-handler.service.ts index ec38259a2a..3b6232210b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/delete-logic-function-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/delete-logic-function-action-handler.service.ts @@ -5,11 +5,17 @@ import { FileFolder } from 'twenty-shared/types'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import { getLogicFunctionBaseFolderPath } from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util'; -import { DeleteLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteLogicFunctionAction, + UniversalDeleteLogicFunctionAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteLogicFunctionActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -20,15 +26,20 @@ export class DeleteLogicFunctionActionHandlerService extends WorkspaceMigrationR super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatLogicFunction = findFlatEntityByUniversalIdentifierOrThrow({ + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId, allFlatEntityMaps } = context; + + const flatLogicFunction = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: allFlatEntityMaps.flatLogicFunctionMaps, - universalIdentifier, + flatEntityId: flatAction.entityId, }); const logicFunctionRepository = @@ -37,7 +48,7 @@ export class DeleteLogicFunctionActionHandlerService extends WorkspaceMigrationR ); await logicFunctionRepository.delete({ - id: flatLogicFunction.id, + id: flatAction.entityId, workspaceId, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts index 93f554e9aa..dabbdc2b2f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts @@ -23,8 +23,11 @@ import { } from 'src/engine/metadata-modules/logic-function/logic-function.exception'; import { FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; import { getLogicFunctionBaseFolderPath } from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util'; -import { UpdateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; import { LogicFunctionBuildService } from 'src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service'; @@ -43,11 +46,17 @@ export class UpdateLogicFunctionActionHandlerService extends WorkspaceMigrationR super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId, code } = action; + const { flatAction, queryRunner } = context; + const { entityId, code } = flatAction; const logicFunctionRepository = queryRunner.manager.getRepository( @@ -56,7 +65,7 @@ export class UpdateLogicFunctionActionHandlerService extends WorkspaceMigrationR await logicFunctionRepository.update( entityId, - fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action), + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction), ); const flatLogicFunction = findFlatEntityByIdInFlatEntityMapsOrThrow({ @@ -64,7 +73,7 @@ export class UpdateLogicFunctionActionHandlerService extends WorkspaceMigrationR flatEntityMaps: context.allFlatEntityMaps.flatLogicFunctionMaps, }); - for (const update of action.updates) { + for (const update of flatAction.updates) { if (update.property === 'checksum' && isDefined(code)) { await this.handleChecksumUpdate({ flatLogicFunction, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/create-navigation-menu-item-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/create-navigation-menu-item-action-handler.service.ts index accaeaf990..387a60cd2d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/create-navigation-menu-item-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/create-navigation-menu-item-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { NavigationMenuItemEntity } from 'src/engine/metadata-modules/navigation-menu-item/entities/navigation-menu-item.entity'; -import { CreateNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateNavigationMenuItemActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreateNavigationMenuItemActionHandlerService extends WorkspaceMigra super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const navigationMenuItemRepository = queryRunner.manager.getRepository( @@ -33,7 +42,7 @@ export class CreateNavigationMenuItemActionHandlerService extends WorkspaceMigra } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/delete-navigation-menu-item-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/delete-navigation-menu-item-action-handler.service.ts index d6e3673a58..d86cae7e87 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/delete-navigation-menu-item-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/delete-navigation-menu-item-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { NavigationMenuItemEntity } from 'src/engine/metadata-modules/navigation-menu-item/entities/navigation-menu-item.entity'; -import { DeleteNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteNavigationMenuItemAction, + UniversalDeleteNavigationMenuItemAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteNavigationMenuItemActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,16 +21,16 @@ export class DeleteNavigationMenuItemActionHandlerService extends WorkspaceMigra super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatNavigationMenuItem = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatNavigationMenuItemMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const navigationMenuItemRepository = queryRunner.manager.getRepository( @@ -33,13 +38,13 @@ export class DeleteNavigationMenuItemActionHandlerService extends WorkspaceMigra ); await navigationMenuItemRepository.delete({ - id: flatNavigationMenuItem.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/update-navigation-menu-item-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/update-navigation-menu-item-action-handler.service.ts index 5ef8234b34..e6d2aff227 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/update-navigation-menu-item-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/navigation-menu-item/services/update-navigation-menu-item-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { NavigationMenuItemEntity } from 'src/engine/metadata-modules/navigation-menu-item/entities/navigation-menu-item.entity'; -import { UpdateNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateNavigationMenuItemAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/navigation-menu-item/types/workspace-migration-navigation-menu-item-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,11 +15,17 @@ export class UpdateNavigationMenuItemActionHandlerService extends WorkspaceMigra 'update', 'navigationMenuItem', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { entityId, updates } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { entityId, updates } = flatAction; const navigationMenuItemRepository = queryRunner.manager.getRepository( @@ -32,7 +41,7 @@ export class UpdateNavigationMenuItemActionHandlerService extends WorkspaceMigra } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/create-object-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/create-object-action-handler.service.ts index 3edc07879c..cde9959b78 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/create-object-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/create-object-action-handler.service.ts @@ -1,5 +1,7 @@ import { Injectable } from '@nestjs/common'; +import { v4 } from 'uuid'; + import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; @@ -8,8 +10,16 @@ import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-f import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; -import { type CreateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatCreateObjectAction, + UniversalCreateObjectAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; +import { fromUniversalFlatFieldMetadataToFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/field/services/utils/from-universal-flat-field-metadata-to-flat-field-metadata.util'; +import { fromUniversalFlatObjectMetadataToFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/utils/from-universal-flat-object-metadata-to-flat-object-metadata.util'; +import { + WorkspaceMigrationActionRunnerContext, + type WorkspaceMigrationActionRunnerArgs, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util'; import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/get-workspace-schema-context-for-migration.util'; import { @@ -29,64 +39,112 @@ export class CreateObjectActionHandlerService extends WorkspaceMigrationRunnerAc super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner } = context; - const { flatEntity: flatObjectMetadata, flatFieldMetadatas } = action; - - const objectMetadataRepository = - queryRunner.manager.getRepository( - ObjectMetadataEntity, - ); + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; + const { fieldIdByUniversalIdentifier, id: providedObjectId } = action; const dataSourceRepository = queryRunner.manager.getRepository(DataSourceEntity); const lastDataSourceMetadata = await dataSourceRepository.findOneOrFail({ where: { - workspaceId: flatObjectMetadata.workspaceId, + workspaceId, }, order: { createdAt: 'DESC' }, }); - await objectMetadataRepository.insert({ - ...flatObjectMetadata, - dataSourceId: lastDataSourceMetadata.id, - targetTableName: 'DEPRECATED', - }); + const allFieldIdToBeCreatedInActionByUniversalIdentifierMap = new Map< + string, + string + >(); + + for (const universalFlatFieldMetadata of action.universalFlatFieldMetadatas) { + const providedFieldId = + fieldIdByUniversalIdentifier?.[ + universalFlatFieldMetadata.universalIdentifier + ]; + + allFieldIdToBeCreatedInActionByUniversalIdentifierMap.set( + universalFlatFieldMetadata.universalIdentifier, + providedFieldId ?? v4(), + ); + } + + const flatObjectMetadata = + fromUniversalFlatObjectMetadataToFlatObjectMetadata({ + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + allFlatEntityMaps, + context, + dataSourceId: lastDataSourceMetadata.id, + generatedId: providedObjectId ?? v4(), + universalFlatObjectMetadata: action.flatEntity, + }); + + const flatFieldMetadatas = action.universalFlatFieldMetadatas.map( + (universalFlatFieldMetadata) => + fromUniversalFlatFieldMetadataToFlatFieldMetadata({ + objectMetadataId: flatObjectMetadata.id, + universalFlatFieldMetadata, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + allFlatEntityMaps, + context, + }), + ); + + return { + type: action.type, + metadataName: action.metadataName, + flatEntity: flatObjectMetadata, + flatFieldMetadatas, + }; + } + + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { queryRunner, flatAction } = context; + const { flatEntity: flatObjectMetadata, flatFieldMetadatas } = flatAction; + + const objectMetadataRepository = + queryRunner.manager.getRepository( + ObjectMetadataEntity, + ); + + await objectMetadataRepository.insert(flatObjectMetadata); const fieldMetadataRepository = queryRunner.manager.getRepository( FieldMetadataEntity, ); - for (const flatFieldMetadata of flatFieldMetadatas) { - await fieldMetadataRepository.save(flatFieldMetadata); - } + await fieldMetadataRepository.insert(flatFieldMetadatas); } async executeForWorkspaceSchema( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity: flatObjectMetadata, flatFieldMetadatas } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity: flatObjectMetadata, flatFieldMetadatas } = flatAction; const { schemaName, tableName } = getWorkspaceSchemaContextForMigration({ workspaceId, - flatObjectMetadata, + objectMetadata: flatObjectMetadata, }); const columnDefinitions = flatFieldMetadatas.flatMap((flatFieldMetadata) => generateColumnDefinitions({ flatFieldMetadata, flatObjectMetadata, + workspaceId, }), ); const enumOrCompositeFlatFieldMetadatas = flatFieldMetadatas.filter( - (field) => - isEnumFlatFieldMetadata(field) || isCompositeFlatFieldMetadata(field), + (flatFieldMetadata) => + isEnumFlatFieldMetadata(flatFieldMetadata) || + isCompositeFlatFieldMetadata(flatFieldMetadata), ); const enumOperations = collectEnumOperationsForObject({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/delete-object-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/delete-object-action-handler.service.ts index 3d849d19be..2af94c31fe 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/delete-object-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/delete-object-action-handler.service.ts @@ -2,14 +2,21 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util'; import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; -import { type DeleteObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + type FlatDeleteObjectAction, + type UniversalDeleteObjectAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/get-workspace-schema-context-for-migration.util'; import { collectEnumOperationsForObject, @@ -28,44 +35,54 @@ export class DeleteObjectActionHandlerService extends WorkspaceMigrationRunnerAc super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + const { action, allFlatEntityMaps } = context; const flatObjectMetadata = findFlatEntityByUniversalIdentifierOrThrow({ flatEntityMaps: allFlatEntityMaps.flatObjectMetadataMaps, - universalIdentifier, + universalIdentifier: action.universalIdentifier, }); + return { + type: 'delete', + metadataName: 'objectMetadata', + entityId: flatObjectMetadata.id, + }; + } + + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner } = context; + const objectMetadataRepository = queryRunner.manager.getRepository( ObjectMetadataEntity, ); - await objectMetadataRepository.delete(flatObjectMetadata.id); + await objectMetadataRepository.delete(flatAction.entityId); } async executeForWorkspaceSchema( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { const { - action, + flatAction, queryRunner, allFlatEntityMaps: { flatObjectMetadataMaps, flatFieldMetadataMaps }, workspaceId, } = context; - const { universalIdentifier } = action; - const flatObjectMetadata = findFlatEntityByUniversalIdentifierOrThrow({ + const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: flatObjectMetadataMaps, - universalIdentifier, + flatEntityId: flatAction.entityId, }); const { schemaName, tableName } = getWorkspaceSchemaContextForMigration({ workspaceId, - flatObjectMetadata, + objectMetadata: flatObjectMetadata, }); await this.workspaceSchemaManagerService.tableManager.dropTable({ @@ -74,14 +91,17 @@ export class DeleteObjectActionHandlerService extends WorkspaceMigrationRunnerAc tableName, cascade: true, }); + const objectFlatFieldMetadatas = findManyFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: flatFieldMetadataMaps, flatEntityIds: flatObjectMetadata.fieldIds, }); + const enumOrCompositeFlatFieldMetadatas = objectFlatFieldMetadatas.filter( - (field) => - isEnumFlatFieldMetadata(field) || isCompositeFlatFieldMetadata(field), + (flatFieldMetadata) => + isEnumFlatFieldMetadata(flatFieldMetadata) || + isCompositeFlatFieldMetadata(flatFieldMetadata), ); const enumOperations = collectEnumOperationsForObject({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/update-object-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/update-object-action-handler.service.ts index a365d3b07f..9ba4ba855f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/update-object-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/update-object-action-handler.service.ts @@ -5,6 +5,7 @@ import { isDefined } from 'twenty-shared/utils'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util'; import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util'; @@ -13,8 +14,14 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; import { findFlatEntityPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration/utils/find-flat-entity-property-update.util'; -import { type UpdateObjectAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + type FlatUpdateObjectAction, + type UniversalUpdateObjectAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/object/types/workspace-migration-object-action'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/get-workspace-schema-context-for-migration.util'; import { @@ -34,10 +41,31 @@ export class UpdateObjectActionHandlerService extends WorkspaceMigrationRunnerAc super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + const { action, allFlatEntityMaps } = context; + + const flatObjectMetadata = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps: allFlatEntityMaps.flatObjectMetadataMaps, + universalIdentifier: action.universalIdentifier, + }); + + // TODO: transpile updates universal identifiers when builder has been migrated + // For now, updates only contain flat entity diff properties (already IDs, not universal identifiers) + + return { + type: 'update', + metadataName: 'objectMetadata', + entityId: flatObjectMetadata.id, + updates: action.updates, + }; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; + const { flatAction, queryRunner } = context; const objectMetadataRepository = queryRunner.manager.getRepository( @@ -45,21 +73,21 @@ export class UpdateObjectActionHandlerService extends WorkspaceMigrationRunnerAc ); await objectMetadataRepository.update( - action.entityId, - fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action), + flatAction.entityId, + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction), ); } async executeForWorkspaceSchema( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { const { - action, + flatAction, queryRunner, allFlatEntityMaps: { flatObjectMetadataMaps, flatFieldMetadataMaps }, workspaceId, } = context; - const { entityId, updates } = action; + const { entityId, updates } = flatAction; const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: flatObjectMetadataMaps, @@ -69,7 +97,7 @@ export class UpdateObjectActionHandlerService extends WorkspaceMigrationRunnerAc const { schemaName, tableName: currentTableName } = getWorkspaceSchemaContextForMigration({ workspaceId, - flatObjectMetadata: flatObjectMetadata, + objectMetadata: flatObjectMetadata, }); const nameSingularUpdate = findFlatEntityPropertyUpdate({ @@ -78,12 +106,12 @@ export class UpdateObjectActionHandlerService extends WorkspaceMigrationRunnerAc }); if (isDefined(nameSingularUpdate)) { - const updatedObjectMetadata: FlatObjectMetadata = { + const updatedFlatObjectMetadata: FlatObjectMetadata = { ...flatObjectMetadata, nameSingular: nameSingularUpdate.to, }; - const newTableName = computeObjectTargetTable(updatedObjectMetadata); + const newTableName = computeObjectTargetTable(updatedFlatObjectMetadata); if (currentTableName !== newTableName) { await this.workspaceSchemaManagerService.tableManager.renameTable({ @@ -96,13 +124,14 @@ export class UpdateObjectActionHandlerService extends WorkspaceMigrationRunnerAc const objectFlatFieldMetadatas = findManyFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityMaps: flatFieldMetadataMaps, - flatEntityIds: updatedObjectMetadata.fieldIds, + flatEntityIds: updatedFlatObjectMetadata.fieldIds, }); + const enumOrCompositeFlatFieldMetadatas = objectFlatFieldMetadatas.filter( - (flatField) => - isEnumFlatFieldMetadata(flatField) || - isCompositeFlatFieldMetadata(flatField), + (flatFieldMetadata) => + isEnumFlatFieldMetadata(flatFieldMetadata) || + isCompositeFlatFieldMetadata(flatFieldMetadata), ); const enumOperations = collectEnumOperationsForObject({ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/utils/from-universal-flat-object-metadata-to-flat-object-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/utils/from-universal-flat-object-metadata-to-flat-object-metadata.util.ts new file mode 100644 index 0000000000..6cbbd3abaf --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/object/services/utils/from-universal-flat-object-metadata-to-flat-object-metadata.util.ts @@ -0,0 +1,123 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; +import { type AllUniversalWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; +import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; + +export type FromUniversalFlatObjectMetadataToFlatObjectMetadataArgs = { + universalFlatObjectMetadata: UniversalFlatObjectMetadata; + generatedId: string; + allFlatEntityMaps: AllFlatEntityMaps; + allFieldIdToBeCreatedInActionByUniversalIdentifierMap: Map; + context: Pick< + WorkspaceMigrationActionRunnerArgs, + 'workspaceId' | 'flatApplication' + >; + dataSourceId: string; +}; + +const findFieldMetadataIdInCreateObjectContext = ({ + universalIdentifier, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + flatFieldMetadataMaps, +}: { + universalIdentifier: string; + allFieldIdToBeCreatedInActionByUniversalIdentifierMap: Map; + flatFieldMetadataMaps: AllFlatEntityMaps['flatFieldMetadataMaps']; +}): string | null => { + const generatedId = + allFieldIdToBeCreatedInActionByUniversalIdentifierMap.get( + universalIdentifier, + ); + + if (isDefined(generatedId)) { + return generatedId; + } + + const existingFieldId = + flatFieldMetadataMaps.idByUniversalIdentifier[universalIdentifier]; + + return existingFieldId ?? null; +}; + +export const fromUniversalFlatObjectMetadataToFlatObjectMetadata = ({ + universalFlatObjectMetadata, + dataSourceId, + generatedId, + allFlatEntityMaps, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + context: { + flatApplication: { id: applicationId }, + workspaceId, + }, +}: FromUniversalFlatObjectMetadataToFlatObjectMetadataArgs): FlatObjectMetadata & { + dataSourceId: string; +} => { + const { + universalIdentifier, + applicationUniversalIdentifier, + labelIdentifierFieldMetadataUniversalIdentifier, + imageIdentifierFieldMetadataUniversalIdentifier, + viewUniversalIdentifiers: _viewUniversalIdentifiers, + indexMetadataUniversalIdentifiers: _indexMetadataUniversalIdentifiers, + fieldUniversalIdentifiers: _fieldUniversalIdentifiers, + ...restProperties + } = universalFlatObjectMetadata; + + let labelIdentifierFieldMetadataId: string | null = null; + + if (isDefined(labelIdentifierFieldMetadataUniversalIdentifier)) { + labelIdentifierFieldMetadataId = findFieldMetadataIdInCreateObjectContext({ + universalIdentifier: labelIdentifierFieldMetadataUniversalIdentifier, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + flatFieldMetadataMaps: allFlatEntityMaps.flatFieldMetadataMaps, + }); + + if (!isDefined(labelIdentifierFieldMetadataId)) { + throw new Error( + `Label identifier field metadata not found for universal identifier: ${labelIdentifierFieldMetadataUniversalIdentifier}`, + ); + } + } + + let imageIdentifierFieldMetadataId: string | null = null; + + if (isDefined(imageIdentifierFieldMetadataUniversalIdentifier)) { + imageIdentifierFieldMetadataId = findFieldMetadataIdInCreateObjectContext({ + universalIdentifier: imageIdentifierFieldMetadataUniversalIdentifier, + allFieldIdToBeCreatedInActionByUniversalIdentifierMap, + flatFieldMetadataMaps: allFlatEntityMaps.flatFieldMetadataMaps, + }); + + if (!isDefined(imageIdentifierFieldMetadataId)) { + throw new Error( + `Image identifier field metadata not found for universal identifier: ${imageIdentifierFieldMetadataUniversalIdentifier}`, + ); + } + } + + return { + ...restProperties, + dataSourceId, + id: generatedId, + workspaceId, + applicationId, + standardId: null, + universalIdentifier, + applicationUniversalIdentifier, + labelIdentifierFieldMetadataId, + labelIdentifierFieldMetadataUniversalIdentifier, + targetTableName: 'DEPRECATED', + imageIdentifierFieldMetadataId, + imageIdentifierFieldMetadataUniversalIdentifier, + // Empty aggregator arrays for newly created entities + fieldIds: [], + viewIds: [], + indexMetadataIds: [], + fieldUniversalIdentifiers: [], + viewUniversalIdentifiers: [], + indexMetadataUniversalIdentifiers: [], + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/create-page-layout-tab-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/create-page-layout-tab-action-handler.service.ts index 8736616c9a..3b7f02ef94 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/create-page-layout-tab-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/create-page-layout-tab-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; -import { CreatePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreatePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreatePageLayoutTabActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreatePageLayoutTabActionHandlerService extends WorkspaceMigrationR super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const pageLayoutTabRepository = queryRunner.manager.getRepository( @@ -33,7 +42,7 @@ export class CreatePageLayoutTabActionHandlerService extends WorkspaceMigrationR } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/delete-page-layout-tab-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/delete-page-layout-tab-action-handler.service.ts index d36bc07fe3..863a310470 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/delete-page-layout-tab-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/delete-page-layout-tab-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; -import { DeletePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeletePageLayoutTabAction, + UniversalDeletePageLayoutTabAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeletePageLayoutTabActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,16 +21,16 @@ export class DeletePageLayoutTabActionHandlerService extends WorkspaceMigrationR super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatPageLayoutTab = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatPageLayoutTabMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const pageLayoutTabRepository = queryRunner.manager.getRepository( @@ -33,13 +38,13 @@ export class DeletePageLayoutTabActionHandlerService extends WorkspaceMigrationR ); await pageLayoutTabRepository.delete({ - id: flatPageLayoutTab.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/update-page-layout-tab-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/update-page-layout-tab-action-handler.service.ts index 195f30f0e0..23112e97ea 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/update-page-layout-tab-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-tab/services/update-page-layout-tab-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { PageLayoutTabEntity } from 'src/engine/metadata-modules/page-layout-tab/entities/page-layout-tab.entity'; -import { UpdatePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdatePageLayoutTabAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-tab/types/workspace-migration-page-layout-tab-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,11 +15,17 @@ export class UpdatePageLayoutTabActionHandlerService extends WorkspaceMigrationR 'update', 'pageLayoutTab', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { entityId, updates } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { entityId, updates } = flatAction; const pageLayoutTabRepository = queryRunner.manager.getRepository( @@ -32,7 +41,7 @@ export class UpdatePageLayoutTabActionHandlerService extends WorkspaceMigrationR } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/create-page-layout-widget-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/create-page-layout-widget-action-handler.service.ts index 808a0aaf0f..56b0603e08 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/create-page-layout-widget-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/create-page-layout-widget-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; -import { CreatePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreatePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreatePageLayoutWidgetActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreatePageLayoutWidgetActionHandlerService extends WorkspaceMigrati super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const pageLayoutWidgetRepository = queryRunner.manager.getRepository( @@ -33,7 +42,7 @@ export class CreatePageLayoutWidgetActionHandlerService extends WorkspaceMigrati } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/delete-page-layout-widget-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/delete-page-layout-widget-action-handler.service.ts index 3e9f8da89b..5ab3d3cf3d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/delete-page-layout-widget-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/delete-page-layout-widget-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; -import { DeletePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeletePageLayoutWidgetAction, + UniversalDeletePageLayoutWidgetAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeletePageLayoutWidgetActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,27 +21,27 @@ export class DeletePageLayoutWidgetActionHandlerService extends WorkspaceMigrati super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatPageLayoutWidget = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatPageLayoutWidgetMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner } = context; const pageLayoutWidgetRepository = queryRunner.manager.getRepository( PageLayoutWidgetEntity, ); - await pageLayoutWidgetRepository.delete({ id: flatPageLayoutWidget.id }); + await pageLayoutWidgetRepository.delete({ id: flatAction.entityId }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/update-page-layout-widget-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/update-page-layout-widget-action-handler.service.ts index b8db8750db..cb67e058a7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/update-page-layout-widget-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout-widget/services/update-page-layout-widget-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { PageLayoutWidgetEntity } from 'src/engine/metadata-modules/page-layout-widget/entities/page-layout-widget.entity'; -import { UpdatePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdatePageLayoutWidgetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout-widget/types/workspace-migration-page-layout-widget-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -16,11 +19,17 @@ export class UpdatePageLayoutWidgetActionHandlerService extends WorkspaceMigrati super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId, updates } = action; + const { flatAction, queryRunner } = context; + const { entityId, updates } = flatAction; const pageLayoutWidgetRepository = queryRunner.manager.getRepository( @@ -39,7 +48,7 @@ export class UpdatePageLayoutWidgetActionHandlerService extends WorkspaceMigrati } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/create-page-layout-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/create-page-layout-action-handler.service.ts index 439352d60a..4c5619cfdf 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/create-page-layout-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/create-page-layout-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { PageLayoutEntity } from 'src/engine/metadata-modules/page-layout/entities/page-layout.entity'; -import { CreatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreatePageLayoutActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreatePageLayoutActionHandlerService extends WorkspaceMigrationRunn super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const pageLayoutRepository = queryRunner.manager.getRepository(PageLayoutEntity); @@ -31,7 +40,7 @@ export class CreatePageLayoutActionHandlerService extends WorkspaceMigrationRunn } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/delete-page-layout-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/delete-page-layout-action-handler.service.ts index 92d0d9cc7d..fd8d131f52 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/delete-page-layout-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/delete-page-layout-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { PageLayoutEntity } from 'src/engine/metadata-modules/page-layout/entities/page-layout.entity'; -import { DeletePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeletePageLayoutAction, + UniversalDeletePageLayoutAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeletePageLayoutActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,25 +21,28 @@ export class DeletePageLayoutActionHandlerService extends WorkspaceMigrationRunn super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatPageLayout = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatPageLayoutMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const pageLayoutRepository = queryRunner.manager.getRepository(PageLayoutEntity); - await pageLayoutRepository.delete({ id: flatPageLayout.id, workspaceId }); + await pageLayoutRepository.delete({ + id: flatAction.entityId, + workspaceId, + }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/update-page-layout-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/update-page-layout-action-handler.service.ts index 9d574191da..f7a9152dc6 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/update-page-layout-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/page-layout/services/update-page-layout-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { PageLayoutEntity } from 'src/engine/metadata-modules/page-layout/entities/page-layout.entity'; -import { UpdatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdatePageLayoutAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/types/workspace-migration-page-layout-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,11 +15,17 @@ export class UpdatePageLayoutActionHandlerService extends WorkspaceMigrationRunn 'update', 'pageLayout', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { entityId, updates } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { entityId, updates } = flatAction; const pageLayoutRepository = queryRunner.manager.getRepository(PageLayoutEntity); @@ -30,7 +39,7 @@ export class UpdatePageLayoutActionHandlerService extends WorkspaceMigrationRunn } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/create-role-target-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/create-role-target-action-handler.service.ts index 4c496fa655..f2edf193a9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/create-role-target-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/create-role-target-action-handler.service.ts @@ -3,19 +3,28 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; -import { CreateRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateRoleTargetActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'create', 'roleTarget', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity: roleTarget } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity: roleTarget } = flatAction; const roleTargetRepository = queryRunner.manager.getRepository(RoleTargetEntity); @@ -27,7 +36,7 @@ export class CreateRoleTargetActionHandlerService extends WorkspaceMigrationRunn } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/delete-role-target-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/delete-role-target-action-handler.service.ts index e552ce6f12..0007796ec1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/delete-role-target-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/delete-role-target-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; -import { DeleteRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteRoleTargetAction, + UniversalDeleteRoleTargetAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteRoleTargetActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,28 +21,28 @@ export class DeleteRoleTargetActionHandlerService extends WorkspaceMigrationRunn super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatRoleTarget = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatRoleTargetMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const roleTargetRepository = queryRunner.manager.getRepository(RoleTargetEntity); await roleTargetRepository.delete({ - id: flatRoleTarget.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/update-role-target-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/update-role-target-action-handler.service.ts index 248bcaf3c6..e18b98cf33 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/update-role-target-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role-target/services/update-role-target-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; -import { UpdateRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateRoleTargetAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/types/workspace-migration-role-target-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -16,22 +19,29 @@ export class UpdateRoleTargetActionHandlerService extends WorkspaceMigrationRunn super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId } = action; + const { flatAction, queryRunner } = context; + const { entityId } = flatAction; const roleTargetRepository = queryRunner.manager.getRepository(RoleTargetEntity); - const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action); + const update = + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction); await roleTargetRepository.update(entityId, update); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/create-role-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/create-role-action-handler.service.ts index aaa6347edc..63d3ea4def 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/create-role-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/create-role-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; -import { CreateRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateRoleActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreateRoleActionHandlerService extends WorkspaceMigrationRunnerActi super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity: role } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity: role } = flatAction; const roleRepository = queryRunner.manager.getRepository(RoleEntity); @@ -31,7 +40,7 @@ export class CreateRoleActionHandlerService extends WorkspaceMigrationRunnerActi } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/delete-role-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/delete-role-action-handler.service.ts index 4e3d95540f..438f8c7983 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/delete-role-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/delete-role-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; -import { DeleteRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteRoleAction, + UniversalDeleteRoleAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteRoleActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,25 +21,25 @@ export class DeleteRoleActionHandlerService extends WorkspaceMigrationRunnerActi super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatRole = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatRoleMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const roleRepository = queryRunner.manager.getRepository(RoleEntity); - await roleRepository.delete({ id: flatRole.id, workspaceId }); + await roleRepository.delete({ id: flatAction.entityId, workspaceId }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/update-role-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/update-role-action-handler.service.ts index ff9c847109..a3dc3ad6e1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/update-role-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/role/services/update-role-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; -import { UpdateRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateRoleAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/types/workspace-migration-role-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,23 +15,29 @@ export class UpdateRoleActionHandlerService extends WorkspaceMigrationRunnerActi 'update', 'role', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { entityId } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { entityId } = flatAction; const roleRepository = queryRunner.manager.getRepository(RoleEntity); await roleRepository.update( { id: entityId, workspaceId }, - fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action), + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction), ); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/create-row-level-permission-predicate-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/create-row-level-permission-predicate-group-action-handler.service.ts index 8da47183f3..ded3b370d4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/create-row-level-permission-predicate-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/create-row-level-permission-predicate-group-action-handler.service.ts @@ -5,19 +5,28 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity'; -import { CreateRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateRowLevelPermissionPredicateGroupActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'create', 'rowLevelPermissionPredicateGroup', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const repository = queryRunner.manager.getRepository( @@ -31,7 +40,7 @@ export class CreateRowLevelPermissionPredicateGroupActionHandlerService extends } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/delete-row-level-permission-predicate-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/delete-row-level-permission-predicate-group-action-handler.service.ts index c33e99249d..5beaf3b538 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/delete-row-level-permission-predicate-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/delete-row-level-permission-predicate-group-action-handler.service.ts @@ -4,28 +4,31 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity'; -import { DeleteRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteRowLevelPermissionPredicateGroupAction, + UniversalDeleteRowLevelPermissionPredicateGroupAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteRowLevelPermissionPredicateGroupActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'delete', 'rowLevelPermissionPredicateGroup', ) { - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatRowLevelPermissionPredicateGroup = - findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: - allFlatEntityMaps.flatRowLevelPermissionPredicateGroupMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const repository = queryRunner.manager.getRepository( @@ -33,13 +36,13 @@ export class DeleteRowLevelPermissionPredicateGroupActionHandlerService extends ); await repository.delete({ - id: flatRowLevelPermissionPredicateGroup.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/update-row-level-permission-predicate-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/update-row-level-permission-predicate-group-action-handler.service.ts index 6a05fb630c..9ba1631f01 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/update-row-level-permission-predicate-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate-group/services/update-row-level-permission-predicate-group-action-handler.service.ts @@ -5,8 +5,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity'; -import { UpdateRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateRowLevelPermissionPredicateGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/types/workspace-migration-row-level-permission-predicate-group-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -14,24 +17,31 @@ export class UpdateRowLevelPermissionPredicateGroupActionHandlerService extends 'update', 'rowLevelPermissionPredicateGroup', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId } = action; + const { flatAction, queryRunner } = context; + const { entityId } = flatAction; const repository = queryRunner.manager.getRepository( RowLevelPermissionPredicateGroupEntity, ); - const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action); + const update = + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction); await repository.update(entityId, update); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/create-row-level-permission-predicate-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/create-row-level-permission-predicate-action-handler.service.ts index bed7b45612..8db1438bb9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/create-row-level-permission-predicate-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/create-row-level-permission-predicate-action-handler.service.ts @@ -5,19 +5,28 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity'; -import { CreateRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateRowLevelPermissionPredicateActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'create', 'rowLevelPermissionPredicate', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const repository = queryRunner.manager.getRepository( @@ -31,7 +40,7 @@ export class CreateRowLevelPermissionPredicateActionHandlerService extends Works } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/delete-row-level-permission-predicate-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/delete-row-level-permission-predicate-action-handler.service.ts index cb7f815ee1..899726b063 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/delete-row-level-permission-predicate-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/delete-row-level-permission-predicate-action-handler.service.ts @@ -4,27 +4,31 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity'; -import { DeleteRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteRowLevelPermissionPredicateAction, + UniversalDeleteRowLevelPermissionPredicateAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteRowLevelPermissionPredicateActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'delete', 'rowLevelPermissionPredicate', ) { - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatRowLevelPermissionPredicate = - findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatRowLevelPermissionPredicateMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const repository = queryRunner.manager.getRepository( @@ -32,13 +36,13 @@ export class DeleteRowLevelPermissionPredicateActionHandlerService extends Works ); await repository.delete({ - id: flatRowLevelPermissionPredicate.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/update-row-level-permission-predicate-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/update-row-level-permission-predicate-action-handler.service.ts index 0e250e041b..da2c1c145c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/update-row-level-permission-predicate-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/row-level-permission-predicate/services/update-row-level-permission-predicate-action-handler.service.ts @@ -5,8 +5,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity'; -import { UpdateRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateRowLevelPermissionPredicateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/types/workspace-migration-row-level-permission-predicate-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -14,24 +17,31 @@ export class UpdateRowLevelPermissionPredicateActionHandlerService extends Works 'update', 'rowLevelPermissionPredicate', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId } = action; + const { flatAction, queryRunner } = context; + const { entityId } = flatAction; const repository = queryRunner.manager.getRepository( RowLevelPermissionPredicateEntity, ); - const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action); + const update = + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction); await repository.update(entityId, update); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/create-skill-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/create-skill-action-handler.service.ts index 6194c7b456..b10022dcf3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/create-skill-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/create-skill-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { SkillEntity } from 'src/engine/metadata-modules/skill/entities/skill.entity'; -import { CreateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateSkillActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreateSkillActionHandlerService extends WorkspaceMigrationRunnerAct super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const skillRepository = queryRunner.manager.getRepository(SkillEntity); @@ -31,7 +40,7 @@ export class CreateSkillActionHandlerService extends WorkspaceMigrationRunnerAct } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/delete-skill-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/delete-skill-action-handler.service.ts index 077137599d..5654632f91 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/delete-skill-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/delete-skill-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { SkillEntity } from 'src/engine/metadata-modules/skill/entities/skill.entity'; -import { DeleteSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteSkillAction, + UniversalDeleteSkillAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteSkillActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,25 +21,25 @@ export class DeleteSkillActionHandlerService extends WorkspaceMigrationRunnerAct super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatSkill = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatSkillMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const skillRepository = queryRunner.manager.getRepository(SkillEntity); - await skillRepository.delete({ id: flatSkill.id, workspaceId }); + await skillRepository.delete({ id: flatAction.entityId, workspaceId }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/update-skill-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/update-skill-action-handler.service.ts index 56708d4fc5..5972b1f912 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/update-skill-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/skill/services/update-skill-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { SkillEntity } from 'src/engine/metadata-modules/skill/entities/skill.entity'; -import { UpdateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateSkillAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/skill/types/workspace-migration-skill-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,11 +15,17 @@ export class UpdateSkillActionHandlerService extends WorkspaceMigrationRunnerAct 'update', 'skill', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { entityId, updates } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { entityId, updates } = flatAction; const skillRepository = queryRunner.manager.getRepository(SkillEntity); @@ -30,7 +39,7 @@ export class UpdateSkillActionHandlerService extends WorkspaceMigrationRunnerAct } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/create-view-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/create-view-field-action-handler.service.ts index 700e44c9d1..aa5fbbec02 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/create-view-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/create-view-field-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { CreateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateViewFieldActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreateViewFieldActionHandlerService extends WorkspaceMigrationRunne super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const viewFieldRepository = queryRunner.manager.getRepository(ViewFieldEntity); @@ -31,7 +40,7 @@ export class CreateViewFieldActionHandlerService extends WorkspaceMigrationRunne } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/delete-view-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/delete-view-field-action-handler.service.ts index 5a480d43d3..3a76d4f53f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/delete-view-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/delete-view-field-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { DeleteViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteViewFieldAction, + UniversalDeleteViewFieldAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteViewFieldActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,28 +21,28 @@ export class DeleteViewFieldActionHandlerService extends WorkspaceMigrationRunne super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatViewField = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatViewFieldMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const viewFieldRepository = queryRunner.manager.getRepository(ViewFieldEntity); await viewFieldRepository.delete({ - id: flatViewField.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/update-view-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/update-view-field-action-handler.service.ts index a61e8748ae..a4aa5f4ccb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/update-view-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-field/services/update-view-field-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { UpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-field/types/workspace-migration-view-field-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -16,22 +19,29 @@ export class UpdateViewFieldActionHandlerService extends WorkspaceMigrationRunne super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId } = action; + const { flatAction, queryRunner } = context; + const { entityId } = flatAction; const viewFieldRepository = queryRunner.manager.getRepository(ViewFieldEntity); - const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action); + const update = + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction); await viewFieldRepository.update(entityId, update); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/create-view-filter-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/create-view-filter-group-action-handler.service.ts index 852028f01c..1f51dcbdbb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/create-view-filter-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/create-view-filter-group-action-handler.service.ts @@ -3,19 +3,28 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; -import { type CreateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { type FlatCreateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateViewFilterGroupActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'create', 'viewFilterGroup', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const viewFilterGroupRepository = queryRunner.manager.getRepository( @@ -29,7 +38,7 @@ export class CreateViewFilterGroupActionHandlerService extends WorkspaceMigratio } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/delete-view-filter-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/delete-view-filter-group-action-handler.service.ts index f96d6e9af5..5db0654a82 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/delete-view-filter-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/delete-view-filter-group-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; -import { type DeleteViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + type FlatDeleteViewFilterGroupAction, + type UniversalDeleteViewFilterGroupAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteViewFilterGroupActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,16 +21,16 @@ export class DeleteViewFilterGroupActionHandlerService extends WorkspaceMigratio super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatViewFilterGroup = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatViewFilterGroupMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const viewFilterGroupRepository = queryRunner.manager.getRepository( @@ -33,13 +38,13 @@ export class DeleteViewFilterGroupActionHandlerService extends WorkspaceMigratio ); await viewFilterGroupRepository.delete({ - id: flatViewFilterGroup.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/update-view-filter-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/update-view-filter-group-action-handler.service.ts index e32f6e2397..615eff0a08 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/update-view-filter-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter-group/services/update-view-filter-group-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity'; -import { type UpdateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { type FlatUpdateViewFilterGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter-group/types/workspace-migration-view-filter-group-action.type'; +import { + type WorkspaceMigrationActionRunnerArgs, + type WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -16,24 +19,31 @@ export class UpdateViewFilterGroupActionHandlerService extends WorkspaceMigratio super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId } = action; + const { flatAction, queryRunner } = context; + const { entityId } = flatAction; const viewFilterGroupRepository = queryRunner.manager.getRepository( ViewFilterGroupEntity, ); - const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action); + const update = + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction); await viewFilterGroupRepository.update(entityId, update); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/create-view-filter-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/create-view-filter-action-handler.service.ts index 7f25b4fe5e..d7a8c94d95 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/create-view-filter-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/create-view-filter-action-handler.service.ts @@ -3,19 +3,28 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; -import { CreateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateViewFilterActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'create', 'viewFilter', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const viewFilterRepository = queryRunner.manager.getRepository(ViewFilterEntity); @@ -27,7 +36,7 @@ export class CreateViewFilterActionHandlerService extends WorkspaceMigrationRunn } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/delete-view-filter-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/delete-view-filter-action-handler.service.ts index 48554850d8..3a94533ead 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/delete-view-filter-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/delete-view-filter-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; -import { DeleteViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteViewFilterAction, + UniversalDeleteViewFilterAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteViewFilterActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,28 +21,28 @@ export class DeleteViewFilterActionHandlerService extends WorkspaceMigrationRunn super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatViewFilter = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatViewFilterMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const viewFilterRepository = queryRunner.manager.getRepository(ViewFilterEntity); await viewFilterRepository.delete({ - id: flatViewFilter.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/update-view-filter-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/update-view-filter-action-handler.service.ts index 67bcb04fad..859bf646bf 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/update-view-filter-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-filter/services/update-view-filter-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; -import { UpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-filter/types/workspace-migration-view-filter-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -16,22 +19,29 @@ export class UpdateViewFilterActionHandlerService extends WorkspaceMigrationRunn super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId } = action; + const { flatAction, queryRunner } = context; + const { entityId } = flatAction; const viewFilterRepository = queryRunner.manager.getRepository(ViewFilterEntity); - const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action); + const update = + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction); await viewFilterRepository.update(entityId, update); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/create-view-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/create-view-group-action-handler.service.ts index 61edb518e9..69bd2f8fdc 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/create-view-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/create-view-group-action-handler.service.ts @@ -3,19 +3,28 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; -import { CreateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateViewGroupActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'create', 'viewGroup', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const viewGroupRepository = queryRunner.manager.getRepository(ViewGroupEntity); @@ -27,7 +36,7 @@ export class CreateViewGroupActionHandlerService extends WorkspaceMigrationRunne } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/delete-view-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/delete-view-group-action-handler.service.ts index 5fb75d482a..a84a6ac234 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/delete-view-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/delete-view-group-action-handler.service.ts @@ -2,38 +2,43 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; -import { DeleteViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteViewGroupAction, + UniversalDeleteViewGroupAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteViewGroupActionHandlerService extends WorkspaceMigrationRunnerActionHandler( 'delete', 'viewGroup', ) { - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatViewGroup = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatViewGroupMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const viewGroupRepository = queryRunner.manager.getRepository(ViewGroupEntity); await viewGroupRepository.delete({ - id: flatViewGroup.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/update-view-group-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/update-view-group-action-handler.service.ts index 04469d23d5..adf52a3cd9 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/update-view-group-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view-group/services/update-view-group-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; -import { UpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view-group/types/workspace-migration-view-group-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,22 +15,29 @@ export class UpdateViewGroupActionHandlerService extends WorkspaceMigrationRunne 'update', 'viewGroup', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId } = action; + const { flatAction, queryRunner } = context; + const { entityId } = flatAction; const viewGroupRepository = queryRunner.manager.getRepository(ViewGroupEntity); - const update = fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action); + const update = + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction); await viewGroupRepository.update(entityId, update); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/create-view-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/create-view-action-handler.service.ts index a14c02bc18..adc76bdf31 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/create-view-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/create-view-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { CreateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateViewActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreateViewActionHandlerService extends WorkspaceMigrationRunnerActi super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const viewRepository = queryRunner.manager.getRepository(ViewEntity); @@ -31,7 +40,7 @@ export class CreateViewActionHandlerService extends WorkspaceMigrationRunnerActi } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/delete-view-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/delete-view-action-handler.service.ts index 3a5a28c4b3..51c1dbc581 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/delete-view-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/delete-view-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { DeleteViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteViewAction, + UniversalDeleteViewAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteViewActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,28 +21,28 @@ export class DeleteViewActionHandlerService extends WorkspaceMigrationRunnerActi super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatView = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatViewMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const viewRepository = queryRunner.manager.getRepository(ViewEntity); await viewRepository.delete({ - id: flatView.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/update-view-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/update-view-action-handler.service.ts index e1cd505f76..105ebc2512 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/update-view-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/update-view-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { UpdateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateViewAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/view/types/workspace-migration-view-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -16,23 +19,29 @@ export class UpdateViewActionHandlerService extends WorkspaceMigrationRunnerActi super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner } = context; - const { entityId } = action; + const { flatAction, queryRunner } = context; + const { entityId } = flatAction; const viewRepository = queryRunner.manager.getRepository(ViewEntity); await viewRepository.update( entityId, - fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action), + fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction), ); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/create-webhook-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/create-webhook-action-handler.service.ts index ad3d35dce3..16d973ca02 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/create-webhook-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/create-webhook-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { WebhookEntity } from 'src/engine/metadata-modules/webhook/entities/webhook.entity'; -import { CreateWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatCreateWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class CreateWebhookActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -15,11 +18,17 @@ export class CreateWebhookActionHandlerService extends WorkspaceMigrationRunnerA super(); } + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { flatEntity } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { flatEntity } = flatAction; const webhookRepository = queryRunner.manager.getRepository(WebhookEntity); @@ -31,7 +40,7 @@ export class CreateWebhookActionHandlerService extends WorkspaceMigrationRunnerA } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/delete-webhook-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/delete-webhook-action-handler.service.ts index ca42075dcb..4f26de310f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/delete-webhook-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/delete-webhook-action-handler.service.ts @@ -2,10 +2,15 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { WebhookEntity } from 'src/engine/metadata-modules/webhook/entities/webhook.entity'; -import { DeleteWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + FlatDeleteWebhookAction, + UniversalDeleteWebhookAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; @Injectable() export class DeleteWebhookActionHandlerService extends WorkspaceMigrationRunnerActionHandler( @@ -16,28 +21,28 @@ export class DeleteWebhookActionHandlerService extends WorkspaceMigrationRunnerA super(); } - async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, - ): Promise { - const { action, queryRunner, workspaceId, allFlatEntityMaps } = context; - const { universalIdentifier } = action; + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return this.transpileUniversalDeleteActionToFlatDeleteAction(context); + } - const flatWebhook = findFlatEntityByUniversalIdentifierOrThrow({ - flatEntityMaps: allFlatEntityMaps.flatWebhookMaps, - universalIdentifier, - }); + async executeForMetadata( + context: WorkspaceMigrationActionRunnerContext, + ): Promise { + const { flatAction, queryRunner, workspaceId } = context; const webhookRepository = queryRunner.manager.getRepository(WebhookEntity); await webhookRepository.delete({ - id: flatWebhook.id, + id: flatAction.entityId, workspaceId, }); } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/update-webhook-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/update-webhook-action-handler.service.ts index 21741a7f60..59a96c8955 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/update-webhook-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/webhook/services/update-webhook-action-handler.service.ts @@ -3,8 +3,11 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface'; import { WebhookEntity } from 'src/engine/metadata-modules/webhook/entities/webhook.entity'; -import { UpdateWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; -import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { FlatUpdateWebhookAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/webhook/types/workspace-migration-webhook-action.type'; +import { + WorkspaceMigrationActionRunnerArgs, + WorkspaceMigrationActionRunnerContext, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; @Injectable() @@ -12,11 +15,17 @@ export class UpdateWebhookActionHandlerService extends WorkspaceMigrationRunnerA 'update', 'webhook', ) { + override async transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + return context.action; + } + async executeForMetadata( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerContext, ): Promise { - const { action, queryRunner, workspaceId } = context; - const { entityId, updates } = action; + const { flatAction, queryRunner, workspaceId } = context; + const { entityId, updates } = flatAction; const webhookRepository = queryRunner.manager.getRepository(WebhookEntity); @@ -30,7 +39,7 @@ export class UpdateWebhookActionHandlerService extends WorkspaceMigrationRunnerA } async executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-runner.exception.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-runner.exception.ts index 473e4236d5..b99df830ce 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-runner.exception.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-runner.exception.ts @@ -2,11 +2,12 @@ import { type MessageDescriptor } from '@lingui/core'; import { msg } from '@lingui/core/macro'; import { assertUnreachable, CustomError } from 'twenty-shared/utils'; -import { type WorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; +import { type AllUniversalWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; export const WorkspaceMigrationRunnerExceptionCode = { INTERNAL_SERVER_ERROR: 'INTERNAL_SERVER_ERROR', EXECUTION_FAILED: 'EXECUTION_FAILED', + APPLICATION_NOT_FOUND: 'APPLICATION_NOT_FOUND', } as const; const getWorkspaceMigrationRunnerExceptionUserFriendlyMessage = ( @@ -17,6 +18,8 @@ const getWorkspaceMigrationRunnerExceptionUserFriendlyMessage = ( return msg`An unexpected error occurred.`; case WorkspaceMigrationRunnerExceptionCode.EXECUTION_FAILED: return msg`Migration execution failed.`; + case WorkspaceMigrationRunnerExceptionCode.APPLICATION_NOT_FOUND: + return msg`Application not found.`; default: assertUnreachable(code); } @@ -25,25 +28,33 @@ const getWorkspaceMigrationRunnerExceptionUserFriendlyMessage = ( export type WorkspaceMigrationRunnerExecutionErrors = { metadata?: Error; workspaceSchema?: Error; + actionTranspilation?: Error; }; +const { + // eslint-disable-next-line unused-imports/no-unused-vars + EXECUTION_FAILED: WorkspaceMigrationRunnerExceptionExecutionFailedCode, + // eslint-disable-next-line unused-imports/no-unused-vars + ...WorkspaceMigrationRunnerExceptionCodeOtherCode +} = WorkspaceMigrationRunnerExceptionCode; + type WorkspaceMigrationRunnerExceptionConstructorArgs = | { message: string; - code: typeof WorkspaceMigrationRunnerExceptionCode.INTERNAL_SERVER_ERROR; + code: (typeof WorkspaceMigrationRunnerExceptionCodeOtherCode)[keyof typeof WorkspaceMigrationRunnerExceptionCodeOtherCode]; userFriendlyMessage?: MessageDescriptor; } | { - action: WorkspaceMigrationAction; + action: AllUniversalWorkspaceMigrationAction; errors: WorkspaceMigrationRunnerExecutionErrors; - code: typeof WorkspaceMigrationRunnerExceptionCode.EXECUTION_FAILED; + code: typeof WorkspaceMigrationRunnerExceptionExecutionFailedCode; userFriendlyMessage?: MessageDescriptor; }; export class WorkspaceMigrationRunnerException extends CustomError { code: keyof typeof WorkspaceMigrationRunnerExceptionCode; userFriendlyMessage: MessageDescriptor; - action?: WorkspaceMigrationAction; + action?: AllUniversalWorkspaceMigrationAction; errors?: WorkspaceMigrationRunnerExecutionErrors; constructor(args: WorkspaceMigrationRunnerExceptionConstructorArgs) { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface.ts index 59e1f38fa0..d103649bb3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface.ts @@ -5,34 +5,45 @@ import { AllMetadataName } from 'twenty-shared/metadata'; import { LoggerService } from 'src/engine/core-modules/logger/logger.service'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; +import { FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; +import { MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; import { MetadataRelatedFlatEntityMapsKeys } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-flat-entity-maps-keys.type'; import { MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key'; import { WorkspaceMigrationActionType } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; +import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; +import { BaseFlatDeleteWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/base-flat-delete-workspace-migration-action.type'; import { buildActionHandlerKey, - type WorkspaceMigrationAction, + type AllFlatWorkspaceMigrationAction, + type AllUniversalWorkspaceMigrationAction, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; import { WORKSPACE_MIGRATION_ACTION_HANDLER_METADATA_KEY } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/constants/workspace-migration-action-handler-metadata-key.constant'; import { WorkspaceMigrationRunnerException, WorkspaceMigrationRunnerExceptionCode, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-runner.exception'; -import { type WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { + WorkspaceMigrationActionRunnerContext, + type WorkspaceMigrationActionRunnerArgs, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { optimisticallyApplyCreateActionOnAllFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util'; import { optimisticallyApplyDeleteActionOnAllFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-delete-action-on-all-flat-entity-maps.util'; import { optimisticallyApplyUpdateActionOnAllFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util'; type OptimisticallyApplyActionOnAllFlatEntityMapsArgs< - TActionType extends WorkspaceMigrationAction, -> = Pick< - WorkspaceMigrationActionRunnerArgs, - 'allFlatEntityMaps' | 'action' ->; + TFlatAction extends AllFlatWorkspaceMigrationAction, +> = { + flatAction: TFlatAction; + allFlatEntityMaps: AllFlatEntityMaps; +}; export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< TActionType extends WorkspaceMigrationActionType, TMetadataName extends AllMetadataName, - TAction extends - WorkspaceMigrationAction = AllFlatEntityTypesByMetadataName[TMetadataName]['actions'][TActionType], + TUniversalAction extends // TODO create abstracted type utils + AllUniversalWorkspaceMigrationAction = AllFlatEntityTypesByMetadataName[TMetadataName]['universalActions'][TActionType], + TFlatAction extends + AllFlatWorkspaceMigrationAction = AllFlatEntityTypesByMetadataName[TMetadataName]['flatActions'][TActionType], > { public actionType: TActionType; public metadataName: TMetadataName; @@ -40,42 +51,71 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< @Inject(LoggerService) protected readonly logger: LoggerService; + public abstract transpileUniversalActionToFlatAction( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise; + + protected transpileUniversalDeleteActionToFlatDeleteAction( + context: 'delete' extends TActionType + ? WorkspaceMigrationActionRunnerArgs< + AllUniversalWorkspaceMigrationAction<'delete'> + > + : never, + ): BaseFlatDeleteWorkspaceMigrationAction { + const { action, allFlatEntityMaps } = context; + + const flatEntityMaps = allFlatEntityMaps[ + getMetadataFlatEntityMapsKey(action.metadataName) + ] as FlatEntityMaps>; + + const flatEntity = findFlatEntityByUniversalIdentifierOrThrow({ + flatEntityMaps, + universalIdentifier: action.universalIdentifier, + }); + + return { + type: 'delete', + metadataName: this.metadataName, + entityId: flatEntity.id, + }; + } + executeForMetadata( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return Promise.resolve(); } executeForWorkspaceSchema( - _context: WorkspaceMigrationActionRunnerArgs, + _context: WorkspaceMigrationActionRunnerContext, ): Promise { return Promise.resolve(); } private optimisticallyApplyActionOnAllFlatEntityMaps({ - action, + flatAction, allFlatEntityMaps, - }: OptimisticallyApplyActionOnAllFlatEntityMapsArgs): Pick< + }: OptimisticallyApplyActionOnAllFlatEntityMapsArgs): Pick< AllFlatEntityMaps, | MetadataRelatedFlatEntityMapsKeys | MetadataToFlatEntityMapsKey > { - switch (action.type) { + switch (flatAction.type) { case 'create': { return optimisticallyApplyCreateActionOnAllFlatEntityMaps({ - action, + flatAction, allFlatEntityMaps, }); } case 'delete': { return optimisticallyApplyDeleteActionOnAllFlatEntityMaps({ - action, + flatAction, allFlatEntityMaps, }); } case 'update': { return optimisticallyApplyUpdateActionOnAllFlatEntityMaps({ - action, + flatAction, allFlatEntityMaps, }); } @@ -83,13 +123,32 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< } rollbackForMetadata( - _context: Omit, 'queryRunner'>, + _context: Omit< + WorkspaceMigrationActionRunnerArgs, + 'queryRunner' + >, ): Promise { return Promise.resolve(); } + private async transpileUniversalActionToFlatActionOrThrow( + context: WorkspaceMigrationActionRunnerArgs, + ): Promise { + try { + return await this.transpileUniversalActionToFlatAction(context); + } catch (error) { + throw new WorkspaceMigrationRunnerException({ + action: context.action, + errors: { + actionTranspilation: error, + }, + code: WorkspaceMigrationRunnerExceptionCode.EXECUTION_FAILED, + }); + } + } + async execute( - context: WorkspaceMigrationActionRunnerArgs, + context: WorkspaceMigrationActionRunnerArgs, ): Promise< Pick< AllFlatEntityMaps, @@ -97,14 +156,18 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< | MetadataToFlatEntityMapsKey > > { + const flatAction = + await this.transpileUniversalActionToFlatActionOrThrow(context); + const [metadataResult, workspaceSchemaResult] = await Promise.allSettled([ this.asyncMethodPerformanceMetricWrapper({ label: 'executeForMetadata', - method: async () => this.executeForMetadata(context), + method: async () => this.executeForMetadata({ ...context, flatAction }), }), this.asyncMethodPerformanceMetricWrapper({ label: 'executeForWorkspaceSchema', - method: async () => this.executeForWorkspaceSchema(context), + method: async () => + this.executeForWorkspaceSchema({ ...context, flatAction }), }), ]); @@ -126,7 +189,7 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< const partialOptimisticCache = this.optimisticallyApplyActionOnAllFlatEntityMaps({ - action: context.action, + flatAction, allFlatEntityMaps: context.allFlatEntityMaps, }); @@ -134,7 +197,10 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< } async rollback( - context: Omit, 'queryRunner'>, + context: Omit< + WorkspaceMigrationActionRunnerArgs, + 'queryRunner' + >, ): Promise { try { await this.rollbackForMetadata(context); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/registry/workspace-migration-runner-action-handler-registry.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/registry/workspace-migration-runner-action-handler-registry.service.ts index d4029c88fe..79133e4c6e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/registry/workspace-migration-runner-action-handler-registry.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/registry/workspace-migration-runner-action-handler-registry.service.ts @@ -5,7 +5,7 @@ import { BaseWorkspaceMigrationRunnerActionHandlerService } from 'src/engine/wor import { buildActionHandlerKey, - type WorkspaceMigrationAction, + type AllUniversalWorkspaceMigrationAction, type WorkspaceMigrationActionHandlerKey, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; import { WorkspaceSchemaMigrationRunnerActionHandlersModule } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/workspace-schema-migration-runner-action-handlers.module'; @@ -53,7 +53,9 @@ export class WorkspaceMigrationRunnerActionHandlerRegistryService }); } - private getActionHandler(action: T) { + private getActionHandler( + action: T, + ) { const actionHandlerKey = buildActionHandlerKey( action.type, action.metadataName, @@ -70,7 +72,7 @@ export class WorkspaceMigrationRunnerActionHandlerRegistryService return handler; } - async executeActionHandler({ + async executeActionHandler({ action, context, }: { @@ -82,7 +84,9 @@ export class WorkspaceMigrationRunnerActionHandlerRegistryService return await handler.execute(context); } - async executeActionRollbackHandler({ + async executeActionRollbackHandler< + T extends AllUniversalWorkspaceMigrationAction, + >({ action, context, }: { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts index 6c49556593..8634b32ade 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { InjectDataSource } from '@nestjs/typeorm'; import { AllMetadataName } from 'twenty-shared/metadata'; +import { isDefined } from 'twenty-shared/utils'; import { DataSource } from 'typeorm'; import { LoggerService } from 'src/engine/core-modules/logger/logger.service'; @@ -148,11 +149,32 @@ export class WorkspaceMigrationRunnerService { run = async ({ actions, + applicationUniversalIdentifier, workspaceId, }: WorkspaceMigration): Promise => { this.logger.time('Runner', 'Total execution'); this.logger.time('Runner', 'Initial cache retrieval'); + const { flatApplicationMaps } = + await this.workspaceCacheService.getOrRecompute(workspaceId, [ + 'flatApplicationMaps', + ]); + + const applicationId = + flatApplicationMaps.idByUniversalIdentifier[ + applicationUniversalIdentifier + ]; + const flatApplication = isDefined(applicationId) + ? flatApplicationMaps.byId[applicationId] + : undefined; + + if (!isDefined(applicationId) || !isDefined(flatApplication)) { + throw new WorkspaceMigrationRunnerException({ + message: `Could not find application for application with universal identifier: ${applicationUniversalIdentifier}`, + code: WorkspaceMigrationRunnerExceptionCode.APPLICATION_NOT_FOUND, + }); + } + const queryRunner = this.coreDataSource.createQueryRunner(); const actionMetadataNames = [ ...new Set(actions.flatMap((action) => action.metadataName)), @@ -168,12 +190,13 @@ export class WorkspaceMigrationRunnerService { ); let allFlatEntityMaps = - await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps( - { - workspaceId, - flatMapsKeys: allFlatEntityMapsKeys, - }, - ); + await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps< + typeof allFlatEntityMapsKeys, + false + >({ + workspaceId, + flatMapsKeys: allFlatEntityMapsKeys, + }); this.logger.timeEnd('Runner', 'Initial cache retrieval'); this.logger.time('Runner', 'Transaction execution'); @@ -187,6 +210,7 @@ export class WorkspaceMigrationRunnerService { { action, context: { + flatApplication, action, allFlatEntityMaps, queryRunner, @@ -228,6 +252,7 @@ export class WorkspaceMigrationRunnerService { { action: invertedAction, context: { + flatApplication, action: invertedAction, allFlatEntityMaps, workspaceId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type.ts index 26f372fd3a..7995c9b2eb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type.ts @@ -1,13 +1,26 @@ import { type QueryRunner } from 'typeorm'; +import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; -import { type WorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; +import { + type AllFlatWorkspaceMigrationAction, + type AllUniversalWorkspaceMigrationAction, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; export type WorkspaceMigrationActionRunnerArgs< - T extends WorkspaceMigrationAction, + TUniversalAction extends AllUniversalWorkspaceMigrationAction, > = { queryRunner: QueryRunner; - action: T; + action: TUniversalAction; allFlatEntityMaps: AllFlatEntityMaps; workspaceId: string; + flatApplication: FlatApplication; +}; + +export type WorkspaceMigrationActionRunnerContext< + TFlatAction extends AllFlatWorkspaceMigrationAction, + TUniversalAction extends + AllUniversalWorkspaceMigrationAction = AllUniversalWorkspaceMigrationAction, +> = WorkspaceMigrationActionRunnerArgs & { + flatAction: TFlatAction; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/__tests__/generate-column-definitions.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/__tests__/generate-column-definitions.util.spec.ts index 2ed8e99855..210d70c1a1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/__tests__/generate-column-definitions.util.spec.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/__tests__/generate-column-definitions.util.spec.ts @@ -1,4 +1,4 @@ -import { FieldMetadataType } from 'twenty-shared/types'; +import { FieldMetadataType, RelationType } from 'twenty-shared/types'; import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock'; @@ -6,20 +6,23 @@ import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/ge import { generateColumnDefinitions } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util'; describe('Generate Column Definitions', () => { + const workspaceId = '20202020-1c25-4d02-bf25-6aeccf7ea419'; + const mockObjectId = '20202020-object-id'; + const mockObjectMetadata = getFlatObjectMetadataMock({ universalIdentifier: 'person', - id: '20202020-1c25-4d02-bf25-6aeccf7ea419', - workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + id: mockObjectId, nameSingular: 'person', + namePlural: 'persons', }); - const mockSchemaName = getWorkspaceSchemaName(mockObjectMetadata.workspaceId); + const mockSchemaName = getWorkspaceSchemaName(workspaceId); describe('Enum Field Schema Generation', () => { it('should generate deterministic enum names to prevent schema conflicts', () => { const enumField = getFlatFieldMetadataMock({ universalIdentifier: 'status', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.SELECT, name: 'status', options: [ @@ -43,6 +46,7 @@ describe('Generate Column Definitions', () => { const columns = generateColumnDefinitions({ flatFieldMetadata: enumField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); expect(columns).toHaveLength(1); @@ -63,7 +67,7 @@ describe('Generate Column Definitions', () => { it('should handle multi-select fields with proper enum generation', () => { const multiSelectField = getFlatFieldMetadataMock({ universalIdentifier: 'tags', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.MULTI_SELECT, name: 'tags', options: [ @@ -87,6 +91,7 @@ describe('Generate Column Definitions', () => { const columns = generateColumnDefinitions({ flatFieldMetadata: multiSelectField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); expect(columns).toHaveLength(1); @@ -109,15 +114,16 @@ describe('Generate Column Definitions', () => { it('should handle null relation settings without crashing', () => { const relationField = getFlatFieldMetadataMock({ universalIdentifier: 'company', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.RELATION, name: 'company', - settings: undefined, + universalSettings: null, }); const columns = generateColumnDefinitions({ flatFieldMetadata: relationField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); // Relations without join columns must return empty array @@ -127,11 +133,11 @@ describe('Generate Column Definitions', () => { it('should generate proper UUID foreign key columns for valid relations', () => { const relationField = getFlatFieldMetadataMock({ universalIdentifier: 'company', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.RELATION, name: 'company', settings: { - relationType: 'MANY_TO_ONE' as any, + relationType: RelationType.MANY_TO_ONE, joinColumnName: 'companyId', }, }); @@ -139,6 +145,7 @@ describe('Generate Column Definitions', () => { const columns = generateColumnDefinitions({ flatFieldMetadata: relationField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); expect(columns).toHaveLength(1); @@ -161,7 +168,7 @@ describe('Generate Column Definitions', () => { it('should generate all required columns for ADDRESS composite type', () => { const addressField = getFlatFieldMetadataMock({ universalIdentifier: 'address', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.ADDRESS, name: 'homeAddress', isNullable: true, @@ -170,6 +177,7 @@ describe('Generate Column Definitions', () => { const columns = generateColumnDefinitions({ flatFieldMetadata: addressField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); expect(columns).toHaveLength(8); @@ -199,7 +207,7 @@ describe('Generate Column Definitions', () => { it('should handle CURRENCY composite type properly', () => { const currencyField = getFlatFieldMetadataMock({ universalIdentifier: 'price', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.CURRENCY, name: 'price', defaultValue: { @@ -211,6 +219,7 @@ describe('Generate Column Definitions', () => { const columns = generateColumnDefinitions({ flatFieldMetadata: currencyField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); expect(columns).toHaveLength(2); @@ -243,7 +252,7 @@ describe('Generate Column Definitions', () => { it('should handle null and undefined default values safely', () => { const textField = getFlatFieldMetadataMock({ universalIdentifier: 'description', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.TEXT, name: 'description', defaultValue: null, @@ -252,6 +261,7 @@ describe('Generate Column Definitions', () => { const columns = generateColumnDefinitions({ flatFieldMetadata: textField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); expect(columns).toStrictEqual([ @@ -270,7 +280,7 @@ describe('Generate Column Definitions', () => { it('should handle boolean fields with default values', () => { const booleanField = getFlatFieldMetadataMock({ universalIdentifier: 'isActive', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.BOOLEAN, name: 'isActive', defaultValue: true, @@ -279,6 +289,7 @@ describe('Generate Column Definitions', () => { const columns = generateColumnDefinitions({ flatFieldMetadata: booleanField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); expect(columns).toStrictEqual([ @@ -299,7 +310,7 @@ describe('Generate Column Definitions', () => { it('should handle text fields without crashing', () => { const textField = getFlatFieldMetadataMock({ universalIdentifier: 'content', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.TEXT, name: 'content', }); @@ -307,6 +318,7 @@ describe('Generate Column Definitions', () => { const columns = generateColumnDefinitions({ flatFieldMetadata: textField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); expect(columns).toStrictEqual([ @@ -325,7 +337,7 @@ describe('Generate Column Definitions', () => { it('should handle UUID fields properly', () => { const uuidField = getFlatFieldMetadataMock({ universalIdentifier: 'uuid', - objectMetadataId: '20202020-1c25-4d02-bf25-6aeccf7ea419', + objectMetadataId: mockObjectId, type: FieldMetadataType.UUID, name: 'uuid', }); @@ -333,6 +345,7 @@ describe('Generate Column Definitions', () => { const columns = generateColumnDefinitions({ flatFieldMetadata: uuidField, flatObjectMetadata: mockObjectMetadata, + workspaceId, }); expect(columns).toStrictEqual([ diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util.ts index 4d3e58658b..6e9421acde 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/generate-column-definitions.util.ts @@ -24,16 +24,18 @@ import { getWorkspaceSchemaContextForMigration } from 'src/engine/workspace-mana export const generateCompositeColumnDefinition = ({ compositeProperty, - parentFieldMetadata, + parentFlatFieldMetadata, flatObjectMetadata, + workspaceId, }: { compositeProperty: CompositeProperty; - parentFieldMetadata: FlatFieldMetadata; + parentFlatFieldMetadata: FlatFieldMetadata; flatObjectMetadata: FlatObjectMetadata; + workspaceId: string; }): WorkspaceSchemaColumnDefinition => { const { tableName, schemaName } = getWorkspaceSchemaContextForMigration({ - workspaceId: flatObjectMetadata.workspaceId, - flatObjectMetadata, + workspaceId, + objectMetadata: flatObjectMetadata, }); if ( @@ -47,12 +49,12 @@ export const generateCompositeColumnDefinition = ({ } const columnName = computeCompositeColumnName( - parentFieldMetadata.name, + parentFlatFieldMetadata.name, compositeProperty, ); const defaultValue = // @ts-expect-error - TODO: fix this - parentFieldMetadata.defaultValue?.[compositeProperty.name]; + parentFlatFieldMetadata.defaultValue?.[compositeProperty.name]; const columnType = fieldMetadataTypeToColumnType(compositeProperty.type); const serializedDefaultValue = serializeDefaultValue({ columnName, @@ -73,8 +75,9 @@ export const generateCompositeColumnDefinition = ({ columnType === 'enum' ? `"${schemaName}"."${computePostgresEnumName({ tableName, columnName })}"` : columnType, - isNullable: parentFieldMetadata.isNullable || !compositeProperty.isRequired, - isUnique: parentFieldMetadata.isUnique ?? false, + isNullable: + parentFlatFieldMetadata.isNullable || !compositeProperty.isRequired, + isUnique: parentFlatFieldMetadata.isUnique ?? false, default: serializedDefaultValue, isArray: isArrayFlag, isPrimary: false, @@ -166,13 +169,15 @@ const generateColumnDefinition = ({ export const generateColumnDefinitions = ({ flatFieldMetadata, flatObjectMetadata, + workspaceId, }: { flatFieldMetadata: FlatFieldMetadata; flatObjectMetadata: FlatObjectMetadata; + workspaceId: string; }): WorkspaceSchemaColumnDefinition[] => { const { tableName, schemaName } = getWorkspaceSchemaContextForMigration({ - workspaceId: flatObjectMetadata.workspaceId, - flatObjectMetadata, + workspaceId, + objectMetadata: flatObjectMetadata, }); if (isCompositeFlatFieldMetadata(flatFieldMetadata)) { @@ -181,8 +186,9 @@ export const generateColumnDefinitions = ({ return compositeType.properties.map((property) => generateCompositeColumnDefinition({ compositeProperty: property, - parentFieldMetadata: flatFieldMetadata, + parentFlatFieldMetadata: flatFieldMetadata, flatObjectMetadata, + workspaceId, }), ); } @@ -200,6 +206,10 @@ export const generateColumnDefinitions = ({ } return [ - generateColumnDefinition({ flatFieldMetadata, tableName, schemaName }), + generateColumnDefinition({ + flatFieldMetadata, + tableName, + schemaName, + }), ]; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/get-workspace-schema-context-for-migration.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/get-workspace-schema-context-for-migration.util.ts index 4dcf11687b..ba6c37b497 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/get-workspace-schema-context-for-migration.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/get-workspace-schema-context-for-migration.util.ts @@ -1,6 +1,7 @@ import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; +import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type'; export type WorkspaceSchemaContextForMigration = { schemaName: string; @@ -9,13 +10,16 @@ export type WorkspaceSchemaContextForMigration = { export const getWorkspaceSchemaContextForMigration = ({ workspaceId, - flatObjectMetadata, + objectMetadata, }: { workspaceId: string; - flatObjectMetadata: FlatObjectMetadata; + objectMetadata: Pick< + FlatObjectMetadata | UniversalFlatObjectMetadata, + 'nameSingular' | 'isCustom' + >; }): WorkspaceSchemaContextForMigration => { return { schemaName: getWorkspaceSchemaName(workspaceId), - tableName: computeObjectTargetTable(flatObjectMetadata), + tableName: computeObjectTargetTable(objectMetadata), }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util.ts index f630122993..3bfd37c9b0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-create-action-on-all-flat-entity-maps.util.ts @@ -4,31 +4,30 @@ import { assertUnreachable } from 'twenty-shared/utils'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; import { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; -import { addFlatNavigationMenuItemToMapsAndUpdateIndex } from 'src/engine/metadata-modules/flat-navigation-menu-item/utils/add-flat-navigation-menu-item-to-maps-and-update-index.util'; -type CreateAction = - AllFlatEntityTypesByMetadataName[TMetadataName]['actions']['create']; +type FlatCreateAction = + AllFlatEntityTypesByMetadataName[TMetadataName]['flatActions']['create']; export type OptimisticallyApplyCreateActionOnAllFlatEntityMapsArgs< TMetadataName extends AllMetadataName, > = { - action: CreateAction; + flatAction: FlatCreateAction; allFlatEntityMaps: AllFlatEntityMaps; }; export const optimisticallyApplyCreateActionOnAllFlatEntityMaps = < TMetadataName extends AllMetadataName, >({ - action, + flatAction, allFlatEntityMaps, }: OptimisticallyApplyCreateActionOnAllFlatEntityMapsArgs): AllFlatEntityMaps => { - switch (action.metadataName) { + switch (flatAction.metadataName) { case 'fieldMetadata': { - action.flatFieldMetadatas.forEach((flatEntity) => + flatAction.flatFieldMetadatas.forEach((flatEntity) => addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ flatEntity, flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, - metadataName: action.metadataName, + metadataName: flatAction.metadataName, }), ); @@ -36,12 +35,12 @@ export const optimisticallyApplyCreateActionOnAllFlatEntityMaps = < } case 'objectMetadata': { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ - flatEntity: action.flatEntity, + flatEntity: flatAction.flatEntity, flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, - metadataName: action.metadataName, + metadataName: flatAction.metadataName, }); - action.flatFieldMetadatas.forEach((flatField) => + flatAction.flatFieldMetadatas.forEach((flatField) => addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ flatEntity: flatField, flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, @@ -69,26 +68,18 @@ export const optimisticallyApplyCreateActionOnAllFlatEntityMaps = < case 'pageLayoutTab': case 'commandMenuItem': case 'frontComponent': + case 'navigationMenuItem': case 'webhook': { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ - flatEntity: action.flatEntity, + flatEntity: flatAction.flatEntity, flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, - metadataName: action.metadataName, - }); - - return allFlatEntityMaps; - } - case 'navigationMenuItem': { - addFlatNavigationMenuItemToMapsAndUpdateIndex({ - flatNavigationMenuItem: action.flatEntity, - flatNavigationMenuItemMaps: - allFlatEntityMaps.flatNavigationMenuItemMaps, + metadataName: flatAction.metadataName, }); return allFlatEntityMaps; } default: { - assertUnreachable(action); + assertUnreachable(flatAction); } } }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-delete-action-on-all-flat-entity-maps.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-delete-action-on-all-flat-entity-maps.util.ts index 048d52f2e5..dfe86aef5c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-delete-action-on-all-flat-entity-maps.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-delete-action-on-all-flat-entity-maps.util.ts @@ -5,27 +5,26 @@ import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/ import { type AllFlatEntityTypesByMetadataName } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-types-by-metadata-name'; import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; import { deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; -import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; -import { deleteFlatNavigationMenuItemFromMapsAndIndex } from 'src/engine/metadata-modules/flat-navigation-menu-item/utils/delete-flat-navigation-menu-item-from-maps-and-index.util'; -type DeleteAction = - AllFlatEntityTypesByMetadataName[TMetadataName]['actions']['delete']; +type FlatDeleteAction = + AllFlatEntityTypesByMetadataName[TMetadataName]['flatActions']['delete']; export type OptimisticallyApplyDeleteActionOnAllFlatEntityMapsArgs< TMetadataName extends AllMetadataName, > = { - action: DeleteAction; + flatAction: FlatDeleteAction; allFlatEntityMaps: AllFlatEntityMaps; }; export const optimisticallyApplyDeleteActionOnAllFlatEntityMaps = < TMetadataName extends AllMetadataName, >({ - action, + flatAction, allFlatEntityMaps, }: OptimisticallyApplyDeleteActionOnAllFlatEntityMapsArgs): AllFlatEntityMaps => { - switch (action.metadataName) { + switch (flatAction.metadataName) { case 'fieldMetadata': case 'objectMetadata': case 'view': @@ -46,40 +45,28 @@ export const optimisticallyApplyDeleteActionOnAllFlatEntityMaps = < case 'pageLayoutTab': case 'commandMenuItem': case 'frontComponent': + case 'navigationMenuItem': case 'webhook': { - const flatEntityToDelete = findFlatEntityByUniversalIdentifierOrThrow< - MetadataFlatEntity + const flatEntityToDelete = findFlatEntityByIdInFlatEntityMapsOrThrow< + MetadataFlatEntity >({ - universalIdentifier: action.universalIdentifier, + flatEntityId: flatAction.entityId, flatEntityMaps: - allFlatEntityMaps[getMetadataFlatEntityMapsKey(action.metadataName)], + allFlatEntityMaps[ + getMetadataFlatEntityMapsKey(flatAction.metadataName) + ], }); deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ flatEntity: flatEntityToDelete, flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, - metadataName: action.metadataName, - }); - - return allFlatEntityMaps; - } - case 'navigationMenuItem': { - const flatNavigationMenuItemToDelete = - findFlatEntityByUniversalIdentifierOrThrow({ - universalIdentifier: action.universalIdentifier, - flatEntityMaps: allFlatEntityMaps.flatNavigationMenuItemMaps, - }); - - deleteFlatNavigationMenuItemFromMapsAndIndex({ - flatNavigationMenuItem: flatNavigationMenuItemToDelete, - flatNavigationMenuItemMaps: - allFlatEntityMaps.flatNavigationMenuItemMaps, + metadataName: flatAction.metadataName, }); return allFlatEntityMaps; } default: { - assertUnreachable(action); + assertUnreachable(flatAction); } } }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util.ts index f835feff5d..8d1f1c63c2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/optimistically-apply-update-action-on-all-flat-entity-maps.util.ts @@ -8,43 +8,42 @@ import { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } f import { deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util'; -import { replaceFlatNavigationMenuItemInMapsAndUpdateIndex } from 'src/engine/metadata-modules/flat-navigation-menu-item/utils/replace-flat-navigation-menu-item-in-maps-and-update-index.util'; import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; -type UpdateAction = - AllFlatEntityTypesByMetadataName[TMetadataName]['actions']['update']; +type FlatUpdateAction = + AllFlatEntityTypesByMetadataName[TMetadataName]['flatActions']['update']; export type OptimisticallyApplyUpdateActionOnAllFlatEntityMapsArgs< TMetadataName extends AllMetadataName, > = { - action: UpdateAction; + flatAction: FlatUpdateAction; allFlatEntityMaps: AllFlatEntityMaps; }; export const optimisticallyApplyUpdateActionOnAllFlatEntityMaps = < TMetadataName extends AllMetadataName, >({ - action, + flatAction, allFlatEntityMaps, }: OptimisticallyApplyUpdateActionOnAllFlatEntityMapsArgs): AllFlatEntityMaps => { - switch (action.metadataName) { + switch (flatAction.metadataName) { case 'index': { const flatIndex = findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: action.entityId, + flatEntityId: flatAction.entityId, flatEntityMaps: allFlatEntityMaps['flatIndexMaps'], }); deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ flatEntity: flatIndex, flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, - metadataName: action.metadataName, + metadataName: flatAction.metadataName, }); addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({ - flatEntity: action.updatedFlatEntity, + flatEntity: flatAction.updatedFlatEntity, flatEntityAndRelatedMapsToMutate: allFlatEntityMaps, - metadataName: action.metadataName, + metadataName: flatAction.metadataName, }); return allFlatEntityMaps; @@ -68,20 +67,21 @@ export const optimisticallyApplyUpdateActionOnAllFlatEntityMaps = < case 'pageLayoutTab': case 'commandMenuItem': case 'frontComponent': + case 'navigationMenuItem': case 'webhook': { const flatEntityMapsKey = getMetadataFlatEntityMapsKey( - action.metadataName, + flatAction.metadataName, ); const fromFlatEntity = findFlatEntityByIdInFlatEntityMapsOrThrow< - MetadataFlatEntity + MetadataFlatEntity >({ - flatEntityId: action.entityId, + flatEntityId: flatAction.entityId, flatEntityMaps: allFlatEntityMaps[flatEntityMapsKey], }); const toFlatEntity = { ...fromFlatEntity, - ...fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action), + ...fromFlatEntityPropertiesUpdatesToPartialFlatEntity(flatAction), }; replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({ @@ -91,29 +91,8 @@ export const optimisticallyApplyUpdateActionOnAllFlatEntityMaps = < return allFlatEntityMaps; } - case 'navigationMenuItem': { - const fromFlatNavigationMenuItem = - findFlatEntityByIdInFlatEntityMapsOrThrow({ - flatEntityId: action.entityId, - flatEntityMaps: allFlatEntityMaps.flatNavigationMenuItemMaps, - }); - - const toFlatNavigationMenuItem = { - ...fromFlatNavigationMenuItem, - ...fromFlatEntityPropertiesUpdatesToPartialFlatEntity(action), - }; - - replaceFlatNavigationMenuItemInMapsAndUpdateIndex({ - fromFlatNavigationMenuItem, - toFlatNavigationMenuItem, - flatNavigationMenuItemMaps: - allFlatEntityMaps.flatNavigationMenuItemMaps, - }); - - return allFlatEntityMaps; - } default: { - assertUnreachable(action); + assertUnreachable(flatAction); } } }; diff --git a/packages/twenty-server/src/modules/connected-account/query-hooks/connected-account-delete-one.pre-query.hook.ts b/packages/twenty-server/src/modules/connected-account/query-hooks/connected-account-delete-one.pre-query.hook.ts index 638903fa7f..cc4c0b96be 100644 --- a/packages/twenty-server/src/modules/connected-account/query-hooks/connected-account-delete-one.pre-query.hook.ts +++ b/packages/twenty-server/src/modules/connected-account/query-hooks/connected-account-delete-one.pre-query.hook.ts @@ -1,13 +1,13 @@ -import { assertIsDefinedOrThrow } from 'twenty-shared/utils'; import { STANDARD_OBJECT_IDS } from 'twenty-shared/metadata'; +import { assertIsDefinedOrThrow } from 'twenty-shared/utils'; import { type WorkspacePreQueryHookInstance } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/interfaces/workspace-query-hook.interface'; import { type DeleteOneResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface'; -import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator'; import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type'; +import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type'; import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; diff --git a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-install-application.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-install-application.integration-spec.ts.snap index e54f210723..ef57d74298 100644 --- a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-install-application.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-install-application.integration-spec.ts.snap @@ -11,11 +11,7 @@ exports[`Install application should fail when entity does not exist should fail }, "code": "APPLICATION_INSTALLATION_FAILED", "errors": { - "metadata": { - "code": "ENTITY_NOT_FOUND", - "message": "Could not find flat entity with universal identifier 20202020-6110-4547-9fd0-2525257a2c3f", - }, - "workspaceSchema": { + "actionTranspilation": { "code": "ENTITY_NOT_FOUND", "message": "Could not find flat entity with universal identifier 20202020-6110-4547-9fd0-2525257a2c3f", },