Rename serverlessFunction to logicFunction (#17494)

## Summary

Rename "Serverless Function" to "Logic Function" across the codebase for
clearer naming.

### Environment Variable Changes

| Old | New |
|-----|-----|
| `SERVERLESS_TYPE` | `LOGIC_FUNCTION_TYPE` |
| `SERVERLESS_LAMBDA_REGION` | `LOGIC_FUNCTION_LAMBDA_REGION` |
| `SERVERLESS_LAMBDA_ROLE` | `LOGIC_FUNCTION_LAMBDA_ROLE` |
| `SERVERLESS_LAMBDA_SUBHOSTING_URL` |
`LOGIC_FUNCTION_LAMBDA_SUBHOSTING_URL` |
| `SERVERLESS_LAMBDA_ACCESS_KEY_ID` |
`LOGIC_FUNCTION_LAMBDA_ACCESS_KEY_ID` |
| `SERVERLESS_LAMBDA_SECRET_ACCESS_KEY` |
`LOGIC_FUNCTION_LAMBDA_SECRET_ACCESS_KEY` |

### Breaking Changes

- Environment variables must be updated in production deployments
- Database migration renames `serverlessFunction` → `logicFunction`
tables
This commit is contained in:
Charles Bochet
2026-01-28 01:42:19 +01:00
committed by GitHub
parent 59d123d2b1
commit da6f1bbef3
351 changed files with 5054 additions and 5139 deletions
@@ -39,8 +39,8 @@ import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity';
import { RowLevelPermissionPredicateGroupEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate-group.entity';
import { RowLevelPermissionPredicateEntity } from 'src/engine/metadata-modules/row-level-permission-predicate/entities/row-level-permission-predicate.entity';
import { SearchFieldMetadataEntity } from 'src/engine/metadata-modules/search-field-metadata/search-field-metadata.entity';
import { ServerlessFunctionLayerEntity } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity';
import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { LogicFunctionLayerEntity } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.entity';
import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity';
import { SkillEntity } from 'src/engine/metadata-modules/skill/entities/skill.entity';
import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity';
import { ViewFilterGroupEntity } from 'src/engine/metadata-modules/view-filter-group/entities/view-filter-group.entity';
@@ -83,7 +83,7 @@ const WORKSPACE_RELATED_ENTITIES: EntityTarget<ObjectLiteral>[] = [
FieldMetadataEntity,
PageLayoutEntity,
SkillEntity,
ServerlessFunctionEntity,
LogicFunctionEntity,
// Level 1: Core entities with CASCADE deletes - delete after their children
ObjectMetadataEntity,
@@ -91,7 +91,7 @@ const WORKSPACE_RELATED_ENTITIES: EntityTarget<ObjectLiteral>[] = [
AgentEntity,
UserWorkspaceEntity,
ApiKeyEntity,
ServerlessFunctionLayerEntity,
LogicFunctionLayerEntity,
// Level 0: Independent entities (no foreign keys to other workspace entities)
ApplicationEntity,
@@ -23,10 +23,7 @@ const REMAINING_ENTITIES_METADATA_NAMES = [
'rowLevelPermissionPredicate',
'rowLevelPermissionPredicateGroup',
'viewFilterGroup',
'cronTrigger',
'databaseEventTrigger',
'routeTrigger',
'serverlessFunction',
'logicFunction',
'skill',
'pageLayoutWidget',
'pageLayout',
@@ -36,7 +33,7 @@ const REMAINING_ENTITIES_METADATA_NAMES = [
@Command({
name: 'upgrade:1-16:identify-remaining-entities-metadata',
description:
'Identify remaining entities metadata (roleTarget, rowLevelPermissionPredicate, rowLevelPermissionPredicateGroup, viewFilterGroup, viewSort, cronTrigger, databaseEventTrigger, routeTrigger, serverlessFunction, skill, pageLayoutWidget, pageLayout, pageLayoutTab)',
'Identify remaining entities metadata (roleTarget, rowLevelPermissionPredicate, rowLevelPermissionPredicateGroup, viewFilterGroup, viewSort, logicFunction, skill, pageLayoutWidget, pageLayout, pageLayoutTab)',
})
export class IdentifyRemainingEntitiesMetadataCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner {
constructor(
@@ -13,7 +13,7 @@ import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspac
@Command({
name: 'upgrade:1-16:make-remaining-entities-universal-identifier-and-application-id-not-nullable-migration',
description:
'Make universalIdentifier and applicationId columns NOT NULL on remaining entities (roleTarget, rowLevelPermissionPredicate, rowLevelPermissionPredicateGroup, viewFilterGroup, viewSort, cronTrigger, databaseEventTrigger, routeTrigger, serverlessFunction, skill, pageLayoutWidget, pageLayout, pageLayoutTab)',
'Make universalIdentifier and applicationId columns NOT NULL on remaining entities (roleTarget, rowLevelPermissionPredicate, rowLevelPermissionPredicateGroup, viewFilterGroup, viewSort, cronTrigger, databaseEventTrigger, routeTrigger, logicFunction, skill, pageLayoutWidget, pageLayout, pageLayoutTab)',
})
export class MakeRemainingEntitiesUniversalIdentifierAndApplicationIdNotNullableMigrationCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner {
private hasRunOnce = false;
@@ -0,0 +1,53 @@
import { type MigrationInterface, type QueryRunner } from 'typeorm';
export class RenameServerless1769556947746 implements MigrationInterface {
name = 'RenameServerless1769556947746';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "core"."serverlessFunctionLayer" RENAME TO "logicFunctionLayer"`,
);
await queryRunner.query(
`ALTER TABLE "core"."serverlessFunction" RENAME TO "logicFunction"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" RENAME COLUMN "serverlessFunctionLayerId" TO "logicFunctionLayerId"`,
);
await queryRunner.query(
`ALTER TABLE "core"."application" RENAME COLUMN "serverlessFunctionLayerId" TO "logicFunctionLayerId"`,
);
await queryRunner.query(
`ALTER TABLE "core"."application" RENAME COLUMN "defaultServerlessFunctionRoleId" TO "defaultLogicFunctionRoleId"`,
);
await queryRunner.query(
`ALTER INDEX "core"."IDX_SERVERLESS_FUNCTION_ID_DELETED_AT" RENAME TO "IDX_LOGIC_FUNCTION_ID_DELETED_AT"`,
);
await queryRunner.query(
`ALTER INDEX "core"."IDX_SERVERLESS_FUNCTION_LAYER_ID" RENAME TO "IDX_LOGIC_FUNCTION_LAYER_ID"`,
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER INDEX "core"."IDX_LOGIC_FUNCTION_LAYER_ID" RENAME TO "IDX_SERVERLESS_FUNCTION_LAYER_ID"`,
);
await queryRunner.query(
`ALTER INDEX "core"."IDX_LOGIC_FUNCTION_ID_DELETED_AT" RENAME TO "IDX_SERVERLESS_FUNCTION_ID_DELETED_AT"`,
);
await queryRunner.query(
`ALTER TABLE "core"."application" RENAME COLUMN "defaultLogicFunctionRoleId" TO "defaultServerlessFunctionRoleId"`,
);
await queryRunner.query(
`ALTER TABLE "core"."application" RENAME COLUMN "logicFunctionLayerId" TO "serverlessFunctionLayerId"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" RENAME COLUMN "logicFunctionLayerId" TO "serverlessFunctionLayerId"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" RENAME TO "serverlessFunction"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunctionLayer" RENAME TO "serverlessFunctionLayer"`,
);
}
}
@@ -0,0 +1,85 @@
import { type MigrationInterface, type QueryRunner } from 'typeorm';
export class UpdateLogicFunctionConstraints1769557200000
implements MigrationInterface
{
name = 'UpdateLogicFunctionConstraints1769557200000';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "core"."logicFunctionLayer" DROP CONSTRAINT IF EXISTS "FK_ca0699c3c906e903d7381c6a771"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" DROP CONSTRAINT IF EXISTS "FK_4b9625a4babf7f4fa942fd26514"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" DROP CONSTRAINT IF EXISTS "FK_62cbd26626ff76df897181c7994"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" DROP CONSTRAINT IF EXISTS "FK_ef5dde6a681970b9c1e10563498"`,
);
await queryRunner.query(
`DROP INDEX IF EXISTS "core"."IDX_5b43e65e322d516c9307bed97a"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" DROP CONSTRAINT IF EXISTS "CHK_4a5179975ee017934a91703247"`,
);
await queryRunner.query(
`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_2f0fd3da807fb993701619d0ac" ON "core"."logicFunction" ("workspaceId", "universalIdentifier") `,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" ADD CONSTRAINT "CHK_349d2959a97c0b14fa0bf7cadd" CHECK ("timeoutSeconds" >= 1 AND "timeoutSeconds" <= 900)`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunctionLayer" ADD CONSTRAINT "FK_0a2947ca6a9adefa41eb62b2322" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" ADD CONSTRAINT "FK_a6ff4745db9bbe5a9616cfdfd5b" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" ADD CONSTRAINT "FK_daed3cd4d8048fbe85646874615" FOREIGN KEY ("applicationId") REFERENCES "core"."application"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" ADD CONSTRAINT "FK_87e3f7b8f23cd90709e127f60c5" FOREIGN KEY ("logicFunctionLayerId") REFERENCES "core"."logicFunctionLayer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" DROP CONSTRAINT "FK_87e3f7b8f23cd90709e127f60c5"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" DROP CONSTRAINT "FK_daed3cd4d8048fbe85646874615"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" DROP CONSTRAINT "FK_a6ff4745db9bbe5a9616cfdfd5b"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunctionLayer" DROP CONSTRAINT "FK_0a2947ca6a9adefa41eb62b2322"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" DROP CONSTRAINT "CHK_349d2959a97c0b14fa0bf7cadd"`,
);
await queryRunner.query(
`DROP INDEX "core"."IDX_2f0fd3da807fb993701619d0ac"`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" ADD CONSTRAINT "CHK_4a5179975ee017934a91703247" CHECK ((("timeoutSeconds" >= 1) AND ("timeoutSeconds" <= 900)))`,
);
await queryRunner.query(
`CREATE UNIQUE INDEX "IDX_5b43e65e322d516c9307bed97a" ON "core"."logicFunction" ("workspaceId", "universalIdentifier") `,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" ADD CONSTRAINT "FK_ef5dde6a681970b9c1e10563498" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" ADD CONSTRAINT "FK_62cbd26626ff76df897181c7994" FOREIGN KEY ("applicationId") REFERENCES "core"."application"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunction" ADD CONSTRAINT "FK_4b9625a4babf7f4fa942fd26514" FOREIGN KEY ("logicFunctionLayerId") REFERENCES "core"."logicFunctionLayer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
);
await queryRunner.query(
`ALTER TABLE "core"."logicFunctionLayer" ADD CONSTRAINT "FK_ca0699c3c906e903d7381c6a771" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
);
}
}