## Summary - **Consolidate logic function services**: Remove `LogicFunctionMetadataService` and consolidate all logic function CRUD operations into `LogicFunctionFromSourceService`, with a new `LogicFunctionFromSourceHelperService` for shared validation/migration logic - **Introduce typed conversion utils following the skill pattern**: Add `fromCreateLogicFunctionFromSourceInputToUniversalFlatLogicFunctionToCreate` and `fromUpdateLogicFunctionFromSourceInputToFlatLogicFunctionToUpdate` that convert DTO inputs directly to flat entities (`UniversalFlatLogicFunction` / `FlatLogicFunction`), replacing the previous intermediate `UpdateLogicFunctionMetadataParams` indirection - **Simplify `CodeStepBuildService`**: Remove ~100 lines of manual duplication logic by delegating to `LogicFunctionFromSourceService.duplicateOneWithSource` - **Remove completed 1-17 migration**: Delete `MigrateWorkflowCodeStepsCommand` and associated utils that migrated workflow code steps from serverless functions to logic functions
106 lines
2.4 KiB
TypeScript
106 lines
2.4 KiB
TypeScript
import { Field, InputType } from '@nestjs/graphql';
|
|
|
|
import { Type } from 'class-transformer';
|
|
import {
|
|
IsBoolean,
|
|
IsNotEmpty,
|
|
IsNumber,
|
|
IsObject,
|
|
IsOptional,
|
|
IsString,
|
|
IsUUID,
|
|
Matches,
|
|
Max,
|
|
Min,
|
|
ValidateNested,
|
|
} from 'class-validator';
|
|
import graphqlTypeJson from 'graphql-type-json';
|
|
import {
|
|
CronTriggerSettings,
|
|
DatabaseEventTriggerSettings,
|
|
HttpRouteTriggerSettings,
|
|
} from 'twenty-shared/application';
|
|
|
|
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
|
|
import type { JsonbProperty } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/jsonb-property.type';
|
|
|
|
@InputType()
|
|
class UpdateLogicFunctionFromSourceInputUpdates {
|
|
@IsString()
|
|
@Field({ nullable: true })
|
|
@IsOptional()
|
|
name?: string;
|
|
|
|
@IsString()
|
|
@Field({ nullable: true })
|
|
@IsOptional()
|
|
description?: string;
|
|
|
|
@IsNumber()
|
|
@Field({ nullable: true })
|
|
@Min(1)
|
|
@Max(900)
|
|
@IsOptional()
|
|
timeoutSeconds?: number;
|
|
|
|
@IsString()
|
|
@Field({ nullable: true })
|
|
@IsOptional()
|
|
sourceHandlerCode?: string;
|
|
|
|
@Field(() => graphqlTypeJson, { nullable: true })
|
|
@IsObject()
|
|
@IsOptional()
|
|
toolInputSchema?: object;
|
|
|
|
@IsString()
|
|
@Matches(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/, {
|
|
message: 'handlerName must be a valid JavaScript identifier',
|
|
})
|
|
@Field({ nullable: true })
|
|
@IsOptional()
|
|
handlerName?: string;
|
|
|
|
@IsString()
|
|
@Field({ nullable: true })
|
|
@IsOptional()
|
|
sourceHandlerPath?: string;
|
|
|
|
@IsBoolean()
|
|
@Field({ nullable: true })
|
|
@IsOptional()
|
|
isTool?: boolean;
|
|
|
|
@IsObject()
|
|
@Field(() => graphqlTypeJson, { nullable: true })
|
|
@IsOptional()
|
|
cronTriggerSettings?: JsonbProperty<CronTriggerSettings>;
|
|
|
|
@IsObject()
|
|
@Field(() => graphqlTypeJson, { nullable: true })
|
|
@IsOptional()
|
|
databaseEventTriggerSettings?: JsonbProperty<DatabaseEventTriggerSettings>;
|
|
|
|
@IsObject()
|
|
@Field(() => graphqlTypeJson, { nullable: true })
|
|
@IsOptional()
|
|
httpRouteTriggerSettings?: JsonbProperty<HttpRouteTriggerSettings>;
|
|
}
|
|
|
|
@InputType()
|
|
export class UpdateLogicFunctionFromSourceInput {
|
|
@Field(() => UUIDScalarType, {
|
|
description: 'Id of the logic function to update',
|
|
})
|
|
@IsNotEmpty()
|
|
@IsUUID()
|
|
id: string;
|
|
|
|
@Type(() => UpdateLogicFunctionFromSourceInputUpdates)
|
|
@ValidateNested()
|
|
@Field(() => UpdateLogicFunctionFromSourceInputUpdates, {
|
|
description: 'The logic function updates',
|
|
})
|
|
update: UpdateLogicFunctionFromSourceInputUpdates;
|
|
}
|