Keep simplifying logic functions (#17595)

## Summary

Refactors the `LogicFunctionService` API by consolidating v1 and v2
services:

In metadata-module (presentation layer module)
- **Renamed methods**: `deleteOneLogicFunction` → `destroyOne`,
`updateOneLogicFunction` → `updateOne`, `createOneLogicFunction` →
`createOne`
- **Added duplicate methods**: `duplicateLogicFunction`,
`createLogicFunctionFromExistingLogicFunctionById`
- **Removed soft delete/restore** functionality - only hard delete
(`destroyOne`) is supported

In core-module (lower level module)
- **Moved execution methods** to `LogicFunctionExecutorService` which is
lower level: `executeOneLogicFunction`, `getAvailablePackages`,
`getLogicFunctionSourceCode`
This commit is contained in:
Charles Bochet
2026-01-30 20:30:52 +01:00
committed by GitHub
parent db31b83a86
commit 46d28509b9
18 changed files with 371 additions and 803 deletions
@@ -7,6 +7,7 @@ import { isDefined } from 'twenty-shared/utils';
import { PreventNestToAutoLogGraphqlErrorsFilter } from 'src/engine/core-modules/graphql/filters/prevent-nest-to-auto-log-graphql-errors.filter';
import { ResolverValidationPipe } from 'src/engine/core-modules/graphql/pipes/resolver-validation.pipe';
import { LogicFunctionExecutorService } from 'src/engine/core-modules/logic-function/logic-function-executor/services/logic-function-executor.service';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
import { FeatureFlagGuard } from 'src/engine/guards/feature-flag.guard';
@@ -22,7 +23,7 @@ import { LogicFunctionLogsDTO } from 'src/engine/metadata-modules/logic-function
import { LogicFunctionLogsInput } from 'src/engine/metadata-modules/logic-function/dtos/logic-function-logs.input';
import { LogicFunctionDTO } from 'src/engine/metadata-modules/logic-function/dtos/logic-function.dto';
import { UpdateLogicFunctionInput } from 'src/engine/metadata-modules/logic-function/dtos/update-logic-function.input';
import { LogicFunctionService } from 'src/engine/metadata-modules/logic-function/logic-function.service';
import { LogicFunctionService } from 'src/engine/metadata-modules/logic-function/services/logic-function.service';
import { FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type';
import { findFlatLogicFunctionOrThrow } from 'src/engine/metadata-modules/logic-function/utils/find-flat-logic-function-or-throw.util';
import { fromFlatLogicFunctionToLogicFunctionDto } from 'src/engine/metadata-modules/logic-function/utils/from-flat-logic-function-to-logic-function-dto.util';
@@ -41,6 +42,7 @@ import { SubscriptionService } from 'src/engine/subscriptions/subscription.servi
export class LogicFunctionResolver {
constructor(
private readonly logicFunctionService: LogicFunctionService,
private readonly logicFunctionExecutorService: LogicFunctionExecutorService,
private readonly subscriptionService: SubscriptionService,
private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService,
) {}
@@ -104,7 +106,7 @@ export class LogicFunctionResolver {
@Query(() => graphqlTypeJson)
async getAvailablePackages(@Args('input') { id }: LogicFunctionIdInput) {
try {
return await this.logicFunctionService.getAvailablePackages(id);
return await this.logicFunctionExecutorService.getAvailablePackages(id);
} catch (error) {
return logicFunctionGraphQLApiExceptionHandler(error);
}
@@ -116,7 +118,7 @@ export class LogicFunctionResolver {
@AuthWorkspace() { id: workspaceId }: WorkspaceEntity,
) {
try {
return await this.logicFunctionService.getLogicFunctionSourceCode(
return await this.logicFunctionExecutorService.getLogicFunctionSourceCode(
workspaceId,
input.id,
);
@@ -132,11 +134,10 @@ export class LogicFunctionResolver {
@AuthWorkspace() { id: workspaceId }: WorkspaceEntity,
): Promise<LogicFunctionDTO> {
try {
const flatLogicFunction =
await this.logicFunctionService.deleteOneLogicFunction({
id: input.id,
workspaceId,
});
const flatLogicFunction = await this.logicFunctionService.destroyOne({
id: input.id,
workspaceId,
});
return fromFlatLogicFunctionToLogicFunctionDto({
flatLogicFunction,
@@ -154,11 +155,11 @@ export class LogicFunctionResolver {
@AuthWorkspace() { id: workspaceId }: WorkspaceEntity,
): Promise<LogicFunctionDTO> {
try {
const flatLogicFunction =
await this.logicFunctionService.updateOneLogicFunction(
input,
workspaceId,
);
const flatLogicFunction = await this.logicFunctionService.updateOne({
id: input.id,
update: input.update,
workspaceId,
});
return fromFlatLogicFunctionToLogicFunctionDto({
flatLogicFunction,
@@ -176,11 +177,10 @@ export class LogicFunctionResolver {
@AuthWorkspace() { id: workspaceId }: WorkspaceEntity,
): Promise<LogicFunctionDTO> {
try {
const flatLogicFunction =
await this.logicFunctionService.createOneLogicFunction(
input,
workspaceId,
);
const flatLogicFunction = await this.logicFunctionService.createOne({
input,
workspaceId,
});
return fromFlatLogicFunctionToLogicFunctionDto({
flatLogicFunction,
@@ -199,7 +199,7 @@ export class LogicFunctionResolver {
try {
const { id, payload } = input;
return await this.logicFunctionService.executeOneLogicFunction({
return await this.logicFunctionExecutorService.executeOneLogicFunction({
id,
workspaceId,
payload,