diff --git a/.cursor/rules/creating-syncable-entity.mdc b/.cursor/rules/creating-syncable-entity.mdc index eb24e519b5c..f56bf8d1126 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 284341069c8..00000000000 --- 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 919b8b0cb25..4a4a72866fd 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 09df6efca2e..ffc74199ae1 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 12169144184..62bf8c367d5 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 14b77dc1edb..3b87a6e9094 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 72d44bcba25..2f2502e29b1 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 ec18c511dde..f372ef515f3 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 df1812892fa..9409dba7996 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 f21dd130aca..d7d37b6c6f1 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 c9323fa3eb4..9a39ec23425 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 728250df203..7e5fa5008a9 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 e7daa00cfcc..d5aaa354b3b 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 f1314804613..594da978780 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 ba1939dafb7..946d006a91d 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 1b431209e0c..4f6776a37c0 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 d9cb9d0c7a2..c446a9b23a5 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 0ed5719251d..b75aac2dd26 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 1fbe6861f82..d7c6116dc88 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 b0a71a9c959..5cf78482df4 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 62d5dde2cf7..b4f1a057b0f 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 5e149d8ecef..b152d9bfc5c 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 b2e1a48429c..e13ad55aa5b 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 8b5511cd82b..c544467a6ac 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 52250eed651..cfcfa943d7d 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 e2cfe0357b3..5951a619eb9 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 36e321d2954..913bb5de851 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 34cbab308ba..8475c8acb63 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 a2cdd5a2a0d..bf1305cbd37 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 54c6a104ce4..00000000000 --- 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 64a238c7846..221d88b55eb 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 3f80ed0c7e5..00000000000 --- 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 7b2b5a220e2..00000000000 --- 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 cd0a7dcea34..c756f30ca65 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 2166214451d..b468c7ff5ed 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 aa13fa7bc02..3ad44915b0f 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 d765c694086..d7b6f0991f0 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 f807d434f56..2296343c387 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 48332cae2f6..6092c5c7fd9 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 0718f90607f..d694aea6473 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 032b15c27b7..e3ce8bbbed6 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 486622e98c8..653669bffff 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 6dbe149d6b5..92077cf1228 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 c762ec53056..e4e031a3107 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 9a77f540a67..11e6cc8efb2 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 328db5c5a3a..ee290db8c9e 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 9307f68c5b8..fb4eda8565e 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 1396906fdcf..b747a52b468 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 fc875c0dcc4..5d25aafa900 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 148bbe84e2c..66a12961351 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 77df13c1d27..5da47d5044b 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 789cf2934ef..28f4c1611e8 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 00000000000..b9bf6409d18 --- /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 8d8fbf8f2d7..00000000000 --- 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 54985c22197..317059c83d2 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 7e752c3f2fa..b10f9115ff5 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 a4c1461ffd5..518d0ef3d72 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 45ff0fce83d..421a53e9204 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 2164386f3d6..86569f5dd18 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 ef553f6eaa5..475b31b51bc 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 ec3f3ffa467..03bb1c7f820 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 7b8639d729f..d5bd781b847 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 9fab2822c4a..06308007072 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 0a6147e7db2..6f5e47dc1bf 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 c2d3725b8fe..46d06914d54 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 0dafe4acd90..b8e387d1c19 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 b70cf766fa7..7ded9455267 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 52915fa1b15..59e01d1deb4 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 514cd83aba0..058136ec6f8 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 886c0bc841c..ce9f9c6784e 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 a93772d7b18..20163daef11 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 982e5fc4cfa..aa53ae7161c 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 2232377ecc4..00000000000 --- 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 5964365db89..00000000000 --- 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 a34f7aab0b3..ae7c348b775 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 00000000000..a8fb084ea2c --- /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 ed2ae33435b..1c06128c695 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 00000000000..a8af6529f36 --- /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 e4bbc4b6320..00000000000 --- 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 f3dd7ab2ea0..fa273db7365 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 00000000000..a7cd724585d --- /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 00000000000..1f28af8f427 --- /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 a863a0e21f0..00000000000 --- 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 883e3b2ef4e..147e2d61c49 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 a04f77b4a07..ac09a621f16 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 00000000000..1829bcbfc03 --- /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 9e246757d15..89308ea43c1 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 41f97e6df9a..e4c27cd698d 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 00000000000..68fc37f16de --- /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 3c603c90422..e216ae25683 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 532b80c0b34..2d3713dee65 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 0531c27df60..8488a4fd713 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 f096bc7dd3f..88885ea78dc 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 2e614261842..4d6710092c2 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 9dc765deeb4..8eb30899f3a 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 fe18c355789..6724c57aff5 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 ef5689e4242..e05ca8f77a9 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 9fa0fd9618b..320c3c1597a 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 d700b5f59e6..25a801dd74c 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 bbec75c0cf3..75f023f817e 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 94b49c51e55..9af11896c01 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 90677163408..46b2cd6637f 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 0bb56868aa0..e1014c375da 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 edb03a49c5b..9a89e711ac0 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 08f414e5915..22275489e3a 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 354fde48ed6..9a41bfc5491 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 5bedc3aba0c..411b54381c3 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 b8523b1d518..5b6ef5ff3e0 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 2e56b022aa6..b5199db4aac 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 7899c00c96c..bae10d4a448 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 62160c801e9..454ddcf79f5 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 2631be5dc89..fc98d9c0163 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 9395cad6324..3a949b88e82 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 70e3ff7da50..64927b0af17 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 b6a41a9b83c..b974dbccb9c 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 3f7079d45a3..26a81c92ba8 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 2b61c4e41c7..1e70446b277 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 72c8b587eb2..e5c47703e40 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 9b59820aa63..b1989bc12d8 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 e004770ea46..e9bf3820695 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 66d3eed72ea..cea1e0ee72f 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 b40d80e62cb..8f4ed9d10a5 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 9d5e70a2e30..2eb6e503ac6 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 4553bcf9986..5f80f412695 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 5a3a5d3a63d..0eeeeeb80f6 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 2bf28e2f815..450ba5accb7 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 5bd21ab588d..e97b79d50f3 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 e156ac0cd6f..fc5c8b85339 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 fa49c093709..b47b802e6c0 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 a0d7394c709..2114d424752 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 0e60610c1ee..b8d68c32389 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 d6296492be9..c4313300af3 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 5370b9c46a0..eca1bbe49fb 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 08ef21e92a2..557a7cc344a 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 00000000000..718dec6e13b --- /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 00000000000..0793ebba32c --- /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 00000000000..075c036c608 --- /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 becaa6cb4df..772a1ee92c3 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 1dcf88fd39f..1d58b8aca2b 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 7eba2d3b4ae..8806ab8a120 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 7b7f0bc3da0..1d001e91b2e 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 2752d17b192..4b656204216 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 77553b07fda..99ff344babe 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 2bedbf8a3ef..3231fc9b5ff 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 01782a106d0..373b62f8398 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 1167ad0416e..cab2f2bee73 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 96dc2329bc7..75bb32a3fb7 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 70ce3e881b6..79dd5937c60 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 b9aa4b8c294..52f6903ae68 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 b4cc7b78cda..7ca671ea158 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 7a482a6d580..285be86be83 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 cea153c74fc..a1c0af7a17e 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 ecf9fdabf09..84916f739a5 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 59392ed7351..cf007cef684 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 30ae8f3282b..36b6f3be332 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 29b428100c8..fc470c7f360 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 211fc97dfe3..cf63b42c4c9 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 4a63b1c200b..95186bd9ceb 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 00000000000..fb2eeaa9a83 --- /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 00000000000..ea738280096 --- /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 00000000000..ec65c276fa9 --- /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 34aedf3ce31..ada32ee78b7 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 022ecf23002..39fa5bf6533 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 72bb30dc657..3be434699ce 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 0afa64c0afe..795a50982e1 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 d801430ae7b..6af2fcab52a 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 688a9e4aae6..e2b1bf33c3d 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 fa346f7bd28..2e1ba53041d 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 3df030ba6a2..3d16c20a2d3 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 ec38259a2a5..3b6232210bb 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 93f554e9aaf..dabbdc2b2f4 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 accaeaf990f..387a60cd2d6 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 d6e3673a582..d86cae7e875 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 5ef8234b34d..e6d2aff2276 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 3edc07879c5..cde9959b78a 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 3d849d19be1..2af94c31fed 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 a365d3b07ff..9ba4ba855f0 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 00000000000..6cbbd3abaf3 --- /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 8736616c9ac..3b7f02ef947 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 d36bc07fe3e..863a3104706 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 195f30f0e0b..23112e97ea0 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 808a0aaf0f0..56b0603e08d 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 3e9f8da89b5..5ab3d3cf3d0 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 b8db8750db2..cb67e058a75 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 439352d60ad..4c5619cfdf8 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 92d0d9cc7db..fd8d131f528 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 9d574191dae..f7a9152dc6c 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 4c496fa6558..f2edf193a9f 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 e552ce6f124..0007796ec1b 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 248bcaf3c68..e18b98cf334 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 aaa6347edc2..63d3ea4def4 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 4e3d95540f8..438f8c79839 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 ff9c847109d..a3dc3ad6e12 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 8da47183f3b..ded3b370d48 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 c33e99249d4..5beaf3b5383 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 6a05fb630c5..9ba1631f01e 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 bed7b456120..8db1438bb9a 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 cb7f815ee1a..899726b0634 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 0e250e041b4..da2c1c145c3 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 6194c7b4566..b10022dcf3f 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 077137599de..5654632f91b 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 56708d4fc5d..5972b1f9120 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 700e44c9d1e..aa5fbbec02b 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 5a480d43d34..3a76d4f53ff 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 a61e8748aed..a4aa5f4ccbe 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 852028f01c0..1f51dcbdbb4 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 f96d6e9af53..5db0654a824 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 e32f6e23970..615eff0a08d 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 7f25b4fe5ed..d7a8c94d954 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 48554850d89..3a94533ead9 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 67bcb04fada..859bf646bf4 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 61edb518e90..69bd2f8fdc0 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 5fb75d482a6..a84a6ac2344 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 04469d23d5e..adf52a3cd99 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 a14c02bc18d..adc76bdf319 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 3a5a28c4b35..51c1dbc581e 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 e1cd505f769..105ebc25129 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 ad3d35dce30..16d973ca02e 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 ca42075dcbf..4f26de310fd 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 21741a7f600..59a96c89557 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 473e4236d54..b99df830ce5 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 59e1f38fa02..d103649bb3e 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 d4029c88fec..79133e4c6e8 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 6c495565934..8634b32ade4 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 26f372fd3a6..7995c9b2eb9 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 2ed8e998558..210d70c1a17 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 4d3e58658b4..6e9421acde8 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 4dcf11687b9..ba6c37b497f 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 f630122993a..3bfd37c9b07 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 048d52f2e50..dfe86aef5c4 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 f835feff5d8..8d1f1c63c2f 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 638903fa7f3..cc4c0b96be5 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 e54f210723e..ef57d742982 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", },