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 99ff344bab..25460a262e 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 @@ -11,11 +11,10 @@ export type AllUniversalWorkspaceMigrationAction< WorkspaceMigrationActionType = WorkspaceMigrationActionType, > = MetadataUniversalWorkspaceMigrationAction; -export type AllFlatWorkspaceMigrationAction = - MetadataFlatWorkspaceMigrationAction< - AllMetadataName, - WorkspaceMigrationActionType - >; +export type AllFlatWorkspaceMigrationAction< + TActionType extends + WorkspaceMigrationActionType = WorkspaceMigrationActionType, +> = MetadataFlatWorkspaceMigrationAction; export { WorkspaceMigrationActionType }; 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 3adafdf891..f535e4c0e4 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 @@ -25,20 +25,35 @@ import { WorkspaceMigrationRunnerException, WorkspaceMigrationRunnerExceptionCode, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-runner.exception'; +import { type MetadataEvent } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/metadata-event'; import { WorkspaceMigrationActionRunnerContext, type WorkspaceMigrationActionRunnerArgs, } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; +import { deriveMetadataEventsFromCreateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-create-action.util'; +import { deriveMetadataEventsFromDeleteAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-delete-action.util'; +import { deriveMetadataEventsFromUpdateAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-update-action.util'; 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< +type FlatActionWithAllFlatEntityMapsArgs< TFlatAction extends AllFlatWorkspaceMigrationAction, > = { flatAction: TFlatAction; allFlatEntityMaps: AllFlatEntityMaps; }; + +export type ActionHandlerExecuteResult = + { + partialOptimisticCache: Pick< + AllFlatEntityMaps, + | MetadataRelatedFlatEntityMapsKeys + | MetadataToFlatEntityMapsKey + >; + metadataEvents: MetadataEvent[]; + }; + export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< TActionType extends WorkspaceMigrationActionType, TMetadataName extends AllMetadataName, @@ -97,7 +112,7 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< private optimisticallyApplyActionOnAllFlatEntityMaps({ flatAction, allFlatEntityMaps, - }: OptimisticallyApplyActionOnAllFlatEntityMapsArgs): Pick< + }: FlatActionWithAllFlatEntityMapsArgs): Pick< AllFlatEntityMaps, | MetadataRelatedFlatEntityMapsKeys | MetadataToFlatEntityMapsKey @@ -124,6 +139,29 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< } } + private deriveMetadataEventsFromFlatAction({ + flatAction, + allFlatEntityMaps, + }: FlatActionWithAllFlatEntityMapsArgs): MetadataEvent[] { + switch (flatAction.type) { + case 'create': { + return deriveMetadataEventsFromCreateAction(flatAction); + } + case 'delete': { + return deriveMetadataEventsFromDeleteAction({ + flatAction, + allFlatEntityMaps, + }); + } + case 'update': { + return deriveMetadataEventsFromUpdateAction({ + flatAction, + allFlatEntityMaps, + }); + } + } + } + rollbackForMetadata( _context: Omit< WorkspaceMigrationActionRunnerArgs, @@ -178,13 +216,7 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< async execute( context: WorkspaceMigrationActionRunnerArgs, - ): Promise< - Pick< - AllFlatEntityMaps, - | MetadataRelatedFlatEntityMapsKeys - | MetadataToFlatEntityMapsKey - > - > { + ): Promise> { const flatAction = await this.transpileUniversalActionToFlatActionOrThrow(context); @@ -216,13 +248,18 @@ export abstract class BaseWorkspaceMigrationRunnerActionHandlerService< }); } + const metadataEvents = this.deriveMetadataEventsFromFlatAction({ + flatAction, + allFlatEntityMaps: context.allFlatEntityMaps, + }); + const partialOptimisticCache = this.optimisticallyApplyActionOnAllFlatEntityMaps({ flatAction, allFlatEntityMaps: context.allFlatEntityMaps, }); - return partialOptimisticCache; + return { partialOptimisticCache, metadataEvents }; } async rollback( 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 42f57daefb..a7c13ccc8c 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 @@ -8,6 +8,7 @@ import { DataSource } from 'typeorm'; import { LoggerService } from 'src/engine/core-modules/logger/logger.service'; 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'; +import { type MetadataEvent } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/metadata-event'; 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 { getMetadataSerializedRelationNames } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-serialized-relation-names.util'; @@ -152,7 +153,10 @@ export class WorkspaceMigrationRunnerService { actions, applicationUniversalIdentifier, workspaceId, - }: WorkspaceMigration): Promise => { + }: WorkspaceMigration): Promise<{ + allFlatEntityMaps: AllFlatEntityMaps; + metadataEvents: MetadataEvent[]; + }> => { this.logger.time('Runner', 'Total execution'); this.logger.time('Runner', 'Initial cache retrieval'); @@ -207,8 +211,10 @@ export class WorkspaceMigrationRunnerService { await queryRunner.connect(); await queryRunner.startTransaction(); + const allMetadataEvents: MetadataEvent[] = []; + for (const action of actions) { - const result = + const { partialOptimisticCache, metadataEvents } = await this.workspaceMigrationRunnerActionHandlerRegistry.executeActionHandler( { action, @@ -224,8 +230,10 @@ export class WorkspaceMigrationRunnerService { allFlatEntityMaps = { ...allFlatEntityMaps, - ...result, + ...partialOptimisticCache, } as typeof allFlatEntityMaps; + + allMetadataEvents.push(...metadataEvents); } await queryRunner.commitTransaction(); @@ -239,7 +247,7 @@ export class WorkspaceMigrationRunnerService { this.logger.timeEnd('Runner', 'Total execution'); - return allFlatEntityMaps; + return { allFlatEntityMaps, metadataEvents: allMetadataEvents }; } catch (error) { if (queryRunner.isTransactionActive) { await queryRunner.rollbackTransaction().catch((error) => diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/metadata-event.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/metadata-event.ts new file mode 100644 index 0000000000..7e8ef374e3 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/metadata-event.ts @@ -0,0 +1,52 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; +import { type MetadataUniversalFlatEntityPropertiesToCompare } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type'; + +type BaseMetadataEvent = { + metadataName: T; + properties: TPayload; +}; + +export type DeleteMetadataEvent = BaseMetadataEvent< + T, + { before: MetadataFlatEntity } +> & { + type: 'delete'; +}; + +export type UpdateMetadataEventDiff< + T extends AllMetadataName, + TProperties extends MetadataUniversalFlatEntityPropertiesToCompare, +> = { + [P in TProperties]: { + before: MetadataFlatEntity[P]; + after: MetadataFlatEntity[P]; + }; +}; + +export type UpdateMetadataEvent< + T extends AllMetadataName, + TProperties extends + MetadataUniversalFlatEntityPropertiesToCompare = MetadataUniversalFlatEntityPropertiesToCompare, +> = BaseMetadataEvent< + T, + { + updatedFields: TProperties[]; + diff: UpdateMetadataEventDiff; + before: MetadataFlatEntity; + after: MetadataFlatEntity; + } +> & { type: 'update' }; + +export type CreateMetadataEvent = BaseMetadataEvent< + T, + { + after: MetadataFlatEntity; + } +> & { type: 'create' }; + +export type MetadataEvent = + | DeleteMetadataEvent + | UpdateMetadataEvent + | CreateMetadataEvent; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-create-action.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-create-action.util.ts new file mode 100644 index 0000000000..da2345fd9d --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-create-action.util.ts @@ -0,0 +1,79 @@ +import { assertUnreachable } from 'twenty-shared/utils'; + +import { type AllFlatWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; +import { + type CreateMetadataEvent, + type MetadataEvent, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/metadata-event'; + +export const deriveMetadataEventsFromCreateAction = ( + flatAction: AllFlatWorkspaceMigrationAction<'create'>, +): MetadataEvent[] => { + switch (flatAction.metadataName) { + case 'fieldMetadata': { + return flatAction.flatFieldMetadatas.map( + (flatFieldMetadata): CreateMetadataEvent<'fieldMetadata'> => ({ + type: 'create', + metadataName: 'fieldMetadata', + properties: { + after: flatFieldMetadata, + }, + }), + ); + } + case 'objectMetadata': { + const objectEvent: CreateMetadataEvent<'objectMetadata'> = { + type: 'create', + metadataName: 'objectMetadata', + properties: { + after: flatAction.flatEntity, + }, + }; + + const fieldEvents: MetadataEvent[] = flatAction.flatFieldMetadatas.map( + (flatFieldMetadata): CreateMetadataEvent<'fieldMetadata'> => ({ + type: 'create', + metadataName: 'fieldMetadata', + properties: { + after: flatFieldMetadata, + }, + }), + ); + + return [objectEvent, ...fieldEvents]; + } + case 'view': + case 'viewField': + case 'viewGroup': + case 'rowLevelPermissionPredicate': + case 'rowLevelPermissionPredicateGroup': + case 'viewFilterGroup': + case 'index': + case 'logicFunction': + case 'viewFilter': + case 'role': + case 'roleTarget': + case 'agent': + case 'skill': + case 'pageLayout': + case 'pageLayoutWidget': + case 'pageLayoutTab': + case 'commandMenuItem': + case 'frontComponent': + case 'navigationMenuItem': + case 'webhook': { + return [ + { + type: 'create', + metadataName: flatAction.metadataName, + properties: { + after: flatAction.flatEntity, + }, + }, + ]; + } + default: { + assertUnreachable(flatAction); + } + } +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-delete-action.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-delete-action.util.ts new file mode 100644 index 0000000000..7aa4e9c7b4 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-delete-action.util.ts @@ -0,0 +1,66 @@ +import { assertUnreachable } from 'twenty-shared/utils'; + +import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; +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 { type AllFlatWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; +import { type MetadataEvent } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/metadata-event'; + +export type DeriveMetadataEventsFromDeleteActionArgs = { + flatAction: AllFlatWorkspaceMigrationAction<'delete'>; + allFlatEntityMaps: AllFlatEntityMaps; +}; + +export const deriveMetadataEventsFromDeleteAction = ({ + flatAction, + allFlatEntityMaps, +}: DeriveMetadataEventsFromDeleteActionArgs): MetadataEvent[] => { + switch (flatAction.metadataName) { + case 'fieldMetadata': + case 'objectMetadata': + case 'view': + case 'viewField': + case 'viewGroup': + case 'rowLevelPermissionPredicate': + case 'rowLevelPermissionPredicateGroup': + case 'viewFilterGroup': + case 'index': + case 'logicFunction': + case 'viewFilter': + case 'role': + case 'roleTarget': + case 'agent': + case 'skill': + case 'pageLayout': + case 'pageLayoutWidget': + case 'pageLayoutTab': + case 'commandMenuItem': + case 'frontComponent': + case 'navigationMenuItem': + case 'webhook': { + const flatEntityToDelete = findFlatEntityByIdInFlatEntityMapsOrThrow< + MetadataFlatEntity + >({ + flatEntityId: flatAction.entityId, + flatEntityMaps: + allFlatEntityMaps[ + getMetadataFlatEntityMapsKey(flatAction.metadataName) + ], + }); + + return [ + { + type: 'delete', + metadataName: flatAction.metadataName, + properties: { + before: flatEntityToDelete, + }, + }, + ]; + } + default: { + assertUnreachable(flatAction); + } + } +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-update-action.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-update-action.util.ts new file mode 100644 index 0000000000..be5072c559 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/derive-metadata-events-from-update-action.util.ts @@ -0,0 +1,143 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; +import { assertUnreachable } from 'twenty-shared/utils'; + +import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; +import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; +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 { type MetadataUniversalFlatEntityPropertiesToCompare } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/metadata-universal-flat-entity-properties-to-compare.type'; +import { type AllFlatWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; +import { + type UpdateMetadataEventDiff, + type CreateMetadataEvent, + type DeleteMetadataEvent, + type MetadataEvent, + type UpdateMetadataEvent, +} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/metadata-event'; + +export type DeriveMetadataEventsFromUpdateActionArgs = { + flatAction: AllFlatWorkspaceMigrationAction<'update'>; + allFlatEntityMaps: AllFlatEntityMaps; +}; + +const buildUpdateMetadataEvent = ({ + metadataName, + before, + after, + updatedFields, +}: { + metadataName: TMetadataName; + before: MetadataFlatEntity; + after: MetadataFlatEntity; + updatedFields: MetadataUniversalFlatEntityPropertiesToCompare[]; +}): UpdateMetadataEvent => { + const diff = Object.fromEntries( + updatedFields.map((field) => [ + field, + { + before: before[field], + after: after[field], + }, + ]), + ) as UpdateMetadataEventDiff; + + return { + type: 'update', + metadataName, + properties: { + updatedFields, + diff, + before, + after, + }, + }; +}; + +export const deriveMetadataEventsFromUpdateAction = ({ + flatAction, + allFlatEntityMaps, +}: DeriveMetadataEventsFromUpdateActionArgs): MetadataEvent[] => { + switch (flatAction.metadataName) { + case 'index': { + const fromFlatEntity = findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId: flatAction.entityId, + flatEntityMaps: allFlatEntityMaps['flatIndexMaps'], + }); + + const toFlatEntity = flatAction.updatedFlatIndex; + + const deleteIndexMetadataEvent: DeleteMetadataEvent<'index'> = { + metadataName: 'index', + properties: { + before: fromFlatEntity, + }, + type: 'delete', + }; + + const createIndexMetadataEvent: CreateMetadataEvent<'index'> = { + metadataName: 'index', + properties: { + after: toFlatEntity, + }, + type: 'create', + }; + + return [deleteIndexMetadataEvent, createIndexMetadataEvent]; + } + case 'fieldMetadata': + case 'objectMetadata': + case 'view': + case 'viewField': + case 'viewGroup': + case 'rowLevelPermissionPredicate': + case 'rowLevelPermissionPredicateGroup': + case 'viewFilterGroup': + case 'logicFunction': + case 'viewFilter': + case 'role': + case 'roleTarget': + case 'agent': + case 'skill': + case 'pageLayout': + case 'pageLayoutWidget': + case 'pageLayoutTab': + case 'commandMenuItem': + case 'frontComponent': + case 'navigationMenuItem': + case 'webhook': { + const flatEntityMapsKey = getMetadataFlatEntityMapsKey( + flatAction.metadataName, + ); + + const fromFlatEntity = findFlatEntityByIdInFlatEntityMapsOrThrow< + MetadataFlatEntity + >({ + flatEntityId: flatAction.entityId, + flatEntityMaps: allFlatEntityMaps[flatEntityMapsKey], + }); + + const toFlatEntity = { + ...fromFlatEntity, + ...flatAction.update, + } as MetadataFlatEntity; + + const updatedFields = Object.keys( + flatAction.update, + ) as MetadataUniversalFlatEntityPropertiesToCompare< + typeof flatAction.metadataName + >[]; + + return [ + buildUpdateMetadataEvent({ + metadataName: flatAction.metadataName, + before: fromFlatEntity, + after: toFlatEntity, + updatedFields, + }), + ]; + } + default: { + assertUnreachable(flatAction); + } + } +}; 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 3bfd37c9b0..0de6190717 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 @@ -1,26 +1,18 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; 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 { type AllFlatWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; -type FlatCreateAction = - AllFlatEntityTypesByMetadataName[TMetadataName]['flatActions']['create']; - -export type OptimisticallyApplyCreateActionOnAllFlatEntityMapsArgs< - TMetadataName extends AllMetadataName, -> = { - flatAction: FlatCreateAction; +export type OptimisticallyApplyCreateActionOnAllFlatEntityMapsArgs = { + flatAction: AllFlatWorkspaceMigrationAction<'create'>; allFlatEntityMaps: AllFlatEntityMaps; }; -export const optimisticallyApplyCreateActionOnAllFlatEntityMaps = < - TMetadataName extends AllMetadataName, ->({ +export const optimisticallyApplyCreateActionOnAllFlatEntityMaps = ({ flatAction, allFlatEntityMaps, -}: OptimisticallyApplyCreateActionOnAllFlatEntityMapsArgs): AllFlatEntityMaps => { +}: OptimisticallyApplyCreateActionOnAllFlatEntityMapsArgs): AllFlatEntityMaps => { switch (flatAction.metadataName) { case 'fieldMetadata': { flatAction.flatFieldMetadatas.forEach((flatEntity) => 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 dfe86aef5c..14749b889e 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 @@ -1,29 +1,21 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; 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 { 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 { 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 { type AllFlatWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; -type FlatDeleteAction = - AllFlatEntityTypesByMetadataName[TMetadataName]['flatActions']['delete']; - -export type OptimisticallyApplyDeleteActionOnAllFlatEntityMapsArgs< - TMetadataName extends AllMetadataName, -> = { - flatAction: FlatDeleteAction; +export type OptimisticallyApplyDeleteActionOnAllFlatEntityMapsArgs = { + flatAction: AllFlatWorkspaceMigrationAction<'delete'>; allFlatEntityMaps: AllFlatEntityMaps; }; -export const optimisticallyApplyDeleteActionOnAllFlatEntityMaps = < - TMetadataName extends AllMetadataName, ->({ +export const optimisticallyApplyDeleteActionOnAllFlatEntityMaps = ({ flatAction, allFlatEntityMaps, -}: OptimisticallyApplyDeleteActionOnAllFlatEntityMapsArgs): AllFlatEntityMaps => { +}: OptimisticallyApplyDeleteActionOnAllFlatEntityMapsArgs): AllFlatEntityMaps => { switch (flatAction.metadataName) { case 'fieldMetadata': case 'objectMetadata': 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 d5086b46cd..606761bd71 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 @@ -1,31 +1,23 @@ -import { type AllMetadataName } from 'twenty-shared/metadata'; 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 { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type'; 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 { 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 { type AllFlatWorkspaceMigrationAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/workspace-migration-action-common'; import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util'; -type FlatUpdateAction = - AllFlatEntityTypesByMetadataName[TMetadataName]['flatActions']['update']; - -export type OptimisticallyApplyUpdateActionOnAllFlatEntityMapsArgs< - TMetadataName extends AllMetadataName, -> = { - flatAction: FlatUpdateAction; +export type OptimisticallyApplyUpdateActionOnAllFlatEntityMapsArgs = { + flatAction: AllFlatWorkspaceMigrationAction<'update'>; allFlatEntityMaps: AllFlatEntityMaps; }; -export const optimisticallyApplyUpdateActionOnAllFlatEntityMaps = < - TMetadataName extends AllMetadataName, ->({ +export const optimisticallyApplyUpdateActionOnAllFlatEntityMaps = ({ flatAction, allFlatEntityMaps, -}: OptimisticallyApplyUpdateActionOnAllFlatEntityMapsArgs): AllFlatEntityMaps => { +}: OptimisticallyApplyUpdateActionOnAllFlatEntityMapsArgs): AllFlatEntityMaps => { switch (flatAction.metadataName) { case 'index': { const flatIndex = findFlatEntityByIdInFlatEntityMapsOrThrow({