Compare commits

...

1 Commits

Author SHA1 Message Date
prastoin 2ed2004a0f wip 2026-03-25 10:06:29 +01:00
7 changed files with 85 additions and 1 deletions
@@ -18,6 +18,7 @@ import { buildFromToAllUniversalFlatEntityMaps } from 'src/engine/core-modules/a
import { getApplicationSubAllFlatEntityMaps } from 'src/engine/core-modules/application/application-manifest/utils/get-application-sub-all-flat-entity-maps.util';
import { ApplicationVariableEntityService } from 'src/engine/core-modules/application/application-variable/application-variable.service';
import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { LogicFunctionDriverFactory } from 'src/engine/core-modules/logic-function/logic-function-drivers/logic-function-driver.factory';
import { createEmptyAllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-all-flat-entity-maps.constant';
import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util';
import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service';
@@ -37,6 +38,7 @@ export class ApplicationSyncService {
private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService,
private readonly workspaceCacheService: WorkspaceCacheService,
private readonly fileStorageService: FileStorageService,
private readonly logicFunctionDriverFactory: LogicFunctionDriverFactory,
) {}
public async synchronizeFromManifest({
@@ -200,6 +202,20 @@ export class ApplicationSyncService {
);
}
const logicFunctionDriver =
this.logicFunctionDriverFactory.getCurrentDriver();
const flatLogicFunctions = Object.values(
applicationFromAllFlatEntityMaps.flatLogicFunctionMaps
.byUniversalIdentifier,
).filter(isDefined);
await logicFunctionDriver.deleteApplicationResources({
workspaceId,
applicationUniversalIdentifier,
flatLogicFunctions,
});
await this.applicationService.delete(
applicationUniversalIdentifier,
workspaceId,
@@ -157,6 +157,12 @@ export class FileStorageService {
},
});
const driver = this.fileStorageDriverFactory.getCurrentDriver();
await driver.delete({
folderPath: join(workspaceId, applicationUniversalIdentifier),
});
await this.fileRepository.delete({
applicationId: application.id,
workspaceId,
@@ -14,6 +14,10 @@ export class DisabledDriver implements LogicFunctionDriver {
// No-op when disabled
}
async deleteApplicationResources(): Promise<void> {
// No-op when disabled
}
async execute(): Promise<LogicFunctionExecuteResult> {
throw new LogicFunctionException(
'Logic function execution is disabled. Set LOGIC_FUNCTION_TYPE to LOCAL or LAMBDA to enable.',
@@ -802,6 +802,34 @@ export class LambdaDriver implements LogicFunctionDriver {
}
}
async deleteApplicationResources({
workspaceId,
applicationUniversalIdentifier,
flatLogicFunctions,
}: {
workspaceId: string;
applicationUniversalIdentifier: string;
flatLogicFunctions: FlatLogicFunction[];
}): Promise<void> {
await Promise.all(
flatLogicFunctions.map((flatLogicFunction) =>
this.delete(flatLogicFunction),
),
);
const lambdaClient = await this.getLambdaClient();
const sdkLayerName = this.getSdkLayerName({
workspaceId,
applicationUniversalIdentifier,
});
await this.deleteAllLayerVersions({
lambdaClient,
layerName: sdkLayerName,
});
}
private async deleteAllLayerVersions({
lambdaClient,
layerName,
@@ -161,6 +161,22 @@ export class LocalDriver implements LogicFunctionDriver {
async delete() {}
async deleteApplicationResources({
workspaceId,
applicationUniversalIdentifier,
}: {
workspaceId: string;
applicationUniversalIdentifier: string;
flatLogicFunctions: unknown[];
}): Promise<void> {
const sdkLayerPath = this.getSdkLayerPath({
workspaceId,
applicationUniversalIdentifier,
});
await fs.rm(sdkLayerPath, { recursive: true, force: true });
}
async build({
flatApplication,
applicationUniversalIdentifier,
@@ -37,6 +37,11 @@ export type LogicFunctionTranspileResult = {
export interface LogicFunctionDriver {
delete(flatLogicFunction: FlatLogicFunction): Promise<void>;
deleteApplicationResources(params: {
workspaceId: string;
applicationUniversalIdentifier: string;
flatLogicFunctions: FlatLogicFunction[];
}): Promise<void>;
execute(
params: LogicFunctionExecuteParams,
): Promise<LogicFunctionExecuteResult>;
@@ -5,6 +5,7 @@ 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 { LogicFunctionDriverFactory } from 'src/engine/core-modules/logic-function/logic-function-drivers/logic-function-driver.factory';
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 {
@@ -22,7 +23,10 @@ export class DeleteLogicFunctionActionHandlerService extends WorkspaceMigrationR
'delete',
'logicFunction',
) {
constructor(private readonly fileStorageService: FileStorageService) {
constructor(
private readonly fileStorageService: FileStorageService,
private readonly logicFunctionDriverFactory: LogicFunctionDriverFactory,
) {
super();
}
@@ -58,6 +62,11 @@ export class DeleteLogicFunctionActionHandlerService extends WorkspaceMigrationR
workspaceId,
});
const logicFunctionDriver =
this.logicFunctionDriverFactory.getCurrentDriver();
await logicFunctionDriver.delete(flatLogicFunction);
const applicationUniversalIdentifier = flatApplication.universalIdentifier;
await this.fileStorageService.delete({