Logic function refactorization (#17861)

As title
This commit is contained in:
martmull
2026-02-12 11:40:49 +01:00
committed by GitHub
parent b456f79167
commit a4ed043d43
122 changed files with 1441 additions and 1897 deletions
@@ -1,11 +1,7 @@
import { type Sources } from 'twenty-shared/types';
import { type LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity';
import { type UniversalFlatEntityFrom } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type';
export type UniversalFlatLogicFunction = UniversalFlatEntityFrom<
LogicFunctionEntity,
'logicFunction'
> & {
code?: Sources;
};
>;
@@ -1,5 +1,3 @@
import { type Sources } from 'twenty-shared/types';
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';
@@ -14,9 +12,7 @@ export type UniversalCreateLogicFunctionAction =
BaseUniversalCreateWorkspaceMigrationAction<'logicFunction'>;
export type FlatUpdateLogicFunctionAction =
BaseFlatUpdateWorkspaceMigrationAction<'logicFunction'> & {
code?: Sources;
};
BaseFlatUpdateWorkspaceMigrationAction<'logicFunction'>;
export type UniversalUpdateLogicFunctionAction =
BaseUniversalUpdateWorkspaceMigrationAction<'logicFunction'>;
@@ -2,7 +2,6 @@ import { Injectable } from '@nestjs/common';
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
import { UniversalUpdateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type';
import {
ValidateAndBuildArgs,
@@ -27,7 +26,6 @@ export class WorkspaceMigrationLogicFunctionActionsBuilderService extends Worksp
public async validateAndBuild(
args: ValidateAndBuildArgs<typeof ALL_METADATA_NAME.logicFunction>,
): ValidateAndBuildReturnType<typeof ALL_METADATA_NAME.logicFunction> {
const { to: toFlatEntityMaps } = args;
const baseResult = await super.validateAndBuild(args);
if (baseResult.status === 'fail') {
@@ -35,19 +33,7 @@ export class WorkspaceMigrationLogicFunctionActionsBuilderService extends Worksp
}
const updatedActions = baseResult.actions.update.map((action) => {
if (action.type !== 'update') {
return action;
}
const toLogicFunction = findFlatEntityByUniversalIdentifier({
universalIdentifier: action.universalIdentifier,
flatEntityMaps: toFlatEntityMaps,
});
return {
...action,
code: toLogicFunction?.code,
};
return action;
});
return {
@@ -1,16 +1,10 @@
import { Injectable } from '@nestjs/common';
import { FileFolder } from 'twenty-shared/types';
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 { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity';
import {
LogicFunctionException,
LogicFunctionExceptionCode,
} from 'src/engine/metadata-modules/logic-function/logic-function.exception';
import {
FlatCreateLogicFunctionAction,
UniversalCreateLogicFunctionAction,
@@ -25,10 +19,6 @@ export class CreateLogicFunctionActionHandlerService extends WorkspaceMigrationR
'create',
'logicFunction',
) {
constructor(private readonly fileStorageService: FileStorageService) {
super();
}
override async transpileUniversalActionToFlatAction({
action,
flatApplication,
@@ -48,25 +38,9 @@ export class CreateLogicFunctionActionHandlerService extends WorkspaceMigrationR
async executeForMetadata(
context: WorkspaceMigrationActionRunnerContext<FlatCreateLogicFunctionAction>,
): Promise<void> {
const { flatAction, queryRunner, workspaceId, flatApplication } = context;
const { flatAction, queryRunner, workspaceId } = context;
const { flatEntity: logicFunction } = flatAction;
const applicationUniversalIdentifier = flatApplication.universalIdentifier;
const builtExists = await this.fileStorageService.checkFileExists({
workspaceId,
applicationUniversalIdentifier,
fileFolder: FileFolder.BuiltLogicFunction,
resourcePath: logicFunction.builtHandlerPath,
});
if (!builtExists) {
throw new LogicFunctionException(
'Logic function built file missing before create',
LogicFunctionExceptionCode.LOGIC_FUNCTION_CREATE_FAILED,
);
}
const logicFunctionRepository =
queryRunner.manager.getRepository<LogicFunctionEntity>(
LogicFunctionEntity,
@@ -15,6 +15,7 @@ import {
WorkspaceMigrationActionRunnerArgs,
WorkspaceMigrationActionRunnerContext,
} from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type';
import { getLogicFunctionSubfolderForFromSource } from 'src/engine/metadata-modules/logic-function/utils/get-logic-function-subfolder-for-from-source';
@Injectable()
export class DeleteLogicFunctionActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
@@ -59,6 +60,15 @@ export class DeleteLogicFunctionActionHandlerService extends WorkspaceMigrationR
const applicationUniversalIdentifier = flatApplication.universalIdentifier;
await this.fileStorageService.delete({
workspaceId,
applicationUniversalIdentifier,
fileFolder: FileFolder.Source,
resourcePath: getLogicFunctionSubfolderForFromSource(
flatLogicFunction.id,
),
});
await this.fileStorageService.delete({
workspaceId,
applicationUniversalIdentifier,
@@ -1,18 +1,9 @@
import { Injectable } from '@nestjs/common';
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 { 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 { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity';
import {
LogicFunctionException,
LogicFunctionExceptionCode,
} 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 { resolveUniversalUpdateRelationIdentifiersToIds } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/resolve-universal-update-relation-identifiers-to-ids.util';
import {
FlatUpdateLogicFunctionAction,
@@ -28,10 +19,6 @@ export class UpdateLogicFunctionActionHandlerService extends WorkspaceMigrationR
'update',
'logicFunction',
) {
constructor(private readonly fileStorageService: FileStorageService) {
super();
}
override async transpileUniversalActionToFlatAction(
context: WorkspaceMigrationActionRunnerArgs<UniversalUpdateLogicFunctionAction>,
): Promise<FlatUpdateLogicFunctionAction> {
@@ -59,7 +46,7 @@ export class UpdateLogicFunctionActionHandlerService extends WorkspaceMigrationR
async executeForMetadata(
context: WorkspaceMigrationActionRunnerContext<FlatUpdateLogicFunctionAction>,
): Promise<void> {
const { flatAction, queryRunner, flatApplication, workspaceId } = context;
const { flatAction, queryRunner, workspaceId } = context;
const { entityId, update } = flatAction;
const logicFunctionRepository =
@@ -68,41 +55,5 @@ export class UpdateLogicFunctionActionHandlerService extends WorkspaceMigrationR
);
await logicFunctionRepository.update({ id: entityId, workspaceId }, update);
const flatLogicFunction = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: entityId,
flatEntityMaps: context.allFlatEntityMaps.flatLogicFunctionMaps,
});
const applicationUniversalIdentifier = flatApplication.universalIdentifier;
if (update.checksum) {
await this.verifySourceAndBuiltFilesExist({
flatLogicFunction,
applicationUniversalIdentifier,
});
}
}
private async verifySourceAndBuiltFilesExist({
flatLogicFunction,
applicationUniversalIdentifier,
}: {
flatLogicFunction: FlatLogicFunction;
applicationUniversalIdentifier: string;
}): Promise<void> {
const builtExists = await this.fileStorageService.checkFileExists({
workspaceId: flatLogicFunction.workspaceId,
applicationUniversalIdentifier,
fileFolder: FileFolder.BuiltLogicFunction,
resourcePath: flatLogicFunction.builtHandlerPath,
});
if (!builtExists) {
throw new LogicFunctionException(
'Logic function source or built file missing before update',
LogicFunctionExceptionCode.LOGIC_FUNCTION_NOT_READY,
);
}
}
}