diff --git a/packages/twenty-server/.env.example b/packages/twenty-server/.env.example index ff6d0b8b7..e81da3a79 100644 --- a/packages/twenty-server/.env.example +++ b/packages/twenty-server/.env.example @@ -75,4 +75,6 @@ FRONTEND_URL=http://localhost:3001 # SSL_CERT_PATH="./certs/your-cert.crt" # CLOUDFLARE_API_KEY= # CLOUDFLARE_ZONE_ID= -# CLOUDFLARE_WEBHOOK_SECRET= \ No newline at end of file +# CLOUDFLARE_WEBHOOK_SECRET= +# IS_CONFIG_VARIABLES_IN_DB_ENABLED=false + diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/common/1743085000787-updateKeyValuePairTypeEnum.ts b/packages/twenty-server/src/database/typeorm/core/migrations/common/1743085000787-updateKeyValuePairTypeEnum.ts new file mode 100644 index 000000000..7e862202e --- /dev/null +++ b/packages/twenty-server/src/database/typeorm/core/migrations/common/1743085000787-updateKeyValuePairTypeEnum.ts @@ -0,0 +1,69 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class UpdateKeyValuePairTypeEnum1743085000787 + implements MigrationInterface +{ + name = 'UpdateKeyValuePairTypeEnum1743085000787'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "core"."keyValuePair" ALTER COLUMN "type" DROP DEFAULT`, + ); + + await queryRunner.query( + `ALTER TABLE "core"."keyValuePair" ALTER COLUMN "type" TYPE text USING "type"::text`, + ); + + await queryRunner.query( + `UPDATE "core"."keyValuePair" SET "type" = 'USER_VARIABLE' WHERE "type" = 'USER_VAR'`, + ); + await queryRunner.query( + `UPDATE "core"."keyValuePair" SET "type" = 'CONFIG_VARIABLE' WHERE "type" = 'SYSTEM_VAR'`, + ); + + await queryRunner.query(`DROP TYPE "core"."keyValuePair_type_enum"`); + + await queryRunner.query( + `CREATE TYPE "core"."keyValuePair_type_enum" AS ENUM('USER_VARIABLE', 'FEATURE_FLAG', 'CONFIG_VARIABLE')`, + ); + + await queryRunner.query( + `ALTER TABLE "core"."keyValuePair" ALTER COLUMN "type" TYPE "core"."keyValuePair_type_enum" USING "type"::"core"."keyValuePair_type_enum"`, + ); + + await queryRunner.query( + `ALTER TABLE "core"."keyValuePair" ALTER COLUMN "type" SET DEFAULT 'USER_VARIABLE'`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "core"."keyValuePair" ALTER COLUMN "type" DROP DEFAULT`, + ); + + await queryRunner.query( + `ALTER TABLE "core"."keyValuePair" ALTER COLUMN "type" TYPE text USING "type"::text`, + ); + + await queryRunner.query( + `UPDATE "core"."keyValuePair" SET "type" = 'USER_VAR' WHERE "type" = 'USER_VARIABLE'`, + ); + await queryRunner.query( + `UPDATE "core"."keyValuePair" SET "type" = 'SYSTEM_VAR' WHERE "type" = 'CONFIG_VARIABLE'`, + ); + + await queryRunner.query(`DROP TYPE "core"."keyValuePair_type_enum"`); + + await queryRunner.query( + `CREATE TYPE "core"."keyValuePair_type_enum" AS ENUM('USER_VAR', 'FEATURE_FLAG', 'SYSTEM_VAR')`, + ); + + await queryRunner.query( + `ALTER TABLE "core"."keyValuePair" ALTER COLUMN "type" TYPE "core"."keyValuePair_type_enum" USING "type"::"core"."keyValuePair_type_enum"`, + ); + + await queryRunner.query( + `ALTER TABLE "core"."keyValuePair" ALTER COLUMN "type" SET DEFAULT 'USER_VAR'`, + ); + } +} diff --git a/packages/twenty-server/src/engine/core-modules/key-value-pair/key-value-pair.entity.ts b/packages/twenty-server/src/engine/core-modules/key-value-pair/key-value-pair.entity.ts index 68629572e..805a398e6 100644 --- a/packages/twenty-server/src/engine/core-modules/key-value-pair/key-value-pair.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/key-value-pair/key-value-pair.entity.ts @@ -19,9 +19,9 @@ import { User } from 'src/engine/core-modules/user/user.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; export enum KeyValuePairType { - USER_VAR = 'USER_VAR', + USER_VARIABLE = 'USER_VARIABLE', FEATURE_FLAG = 'FEATURE_FLAG', - SYSTEM_VAR = 'SYSTEM_VAR', + CONFIG_VARIABLE = 'CONFIG_VARIABLE', } @Entity({ name: 'keyValuePair', schema: 'core' }) @@ -75,7 +75,7 @@ export class KeyValuePair { type: 'enum', enum: Object.values(KeyValuePairType), nullable: false, - default: KeyValuePairType.USER_VAR, + default: KeyValuePairType.USER_VARIABLE, }) type: KeyValuePairType; diff --git a/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts b/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts index f566bd91e..8824f19e9 100644 --- a/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts +++ b/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts @@ -720,6 +720,15 @@ export class ConfigVariables { @IsOptional() PG_SSL_ALLOW_SELF_SIGNED = false; + @ConfigVariablesMetadata({ + group: ConfigVariablesGroup.ServerConfig, + description: 'Enable configuration variables to be stored in the database', + }) + @CastToBoolean() + @IsBoolean() + @IsOptional() + IS_CONFIG_VARIABLES_IN_DB_ENABLED = false; + @ConfigVariablesMetadata({ group: ConfigVariablesGroup.TokensDuration, description: 'Time-to-live for cache storage in seconds', diff --git a/packages/twenty-server/src/engine/core-modules/user/user-vars/services/user-vars.service.ts b/packages/twenty-server/src/engine/core-modules/user/user-vars/services/user-vars.service.ts index 2d60cf030..d3eff0b9c 100644 --- a/packages/twenty-server/src/engine/core-modules/user/user-vars/services/user-vars.service.ts +++ b/packages/twenty-server/src/engine/core-modules/user/user-vars/services/user-vars.service.ts @@ -23,7 +23,7 @@ export class UserVarsService< if (workspaceId) { userVarWorkspaceLevel = await this.keyValuePairService.get({ - type: KeyValuePairType.USER_VAR, + type: KeyValuePairType.USER_VARIABLE, userId: null, workspaceId, key, @@ -40,7 +40,7 @@ export class UserVarsService< if (userId) { userVarUserLevel = await this.keyValuePairService.get({ - type: KeyValuePairType.USER_VAR, + type: KeyValuePairType.USER_VARIABLE, userId, workspaceId: null, key, @@ -55,7 +55,7 @@ export class UserVarsService< if (userId && workspaceId) { userVarWorkspaceAndUserLevel = await this.keyValuePairService.get({ - type: KeyValuePairType.USER_VAR, + type: KeyValuePairType.USER_VARIABLE, userId, workspaceId, key, @@ -88,7 +88,7 @@ export class UserVarsService< result = [ ...result, ...(await this.keyValuePairService.get({ - type: KeyValuePairType.USER_VAR, + type: KeyValuePairType.USER_VARIABLE, userId, workspaceId: null, })), @@ -99,7 +99,7 @@ export class UserVarsService< result = [ ...result, ...(await this.keyValuePairService.get({ - type: KeyValuePairType.USER_VAR, + type: KeyValuePairType.USER_VARIABLE, userId: null, workspaceId, })), @@ -110,7 +110,7 @@ export class UserVarsService< result = [ ...result, ...(await this.keyValuePairService.get({ - type: KeyValuePairType.USER_VAR, + type: KeyValuePairType.USER_VARIABLE, userId, workspaceId, })), @@ -136,7 +136,7 @@ export class UserVarsService< workspaceId, key: key, value, - type: KeyValuePairType.USER_VAR, + type: KeyValuePairType.USER_VARIABLE, }); } @@ -153,7 +153,7 @@ export class UserVarsService< userId, workspaceId, key, - type: KeyValuePairType.USER_VAR, + type: KeyValuePairType.USER_VARIABLE, }); } }