diff --git a/packages/twenty-front/src/generated/graphql.tsx b/packages/twenty-front/src/generated/graphql.tsx index 9a44597c4d2c..8f607ef329f8 100644 --- a/packages/twenty-front/src/generated/graphql.tsx +++ b/packages/twenty-front/src/generated/graphql.tsx @@ -315,6 +315,7 @@ export type Mutation = { disablePostgresProxy: PostgresCredentials; emailPasswordResetLink: EmailPasswordResetLink; enablePostgresProxy: PostgresCredentials; + enableWorkflowTrigger: Scalars['Boolean']; exchangeAuthorizationCode: ExchangeAuthCode; generateApiKeyToken: ApiKeyToken; generateJWT: AuthTokens; @@ -377,6 +378,11 @@ export type MutationEmailPasswordResetLinkArgs = { }; +export type MutationEnableWorkflowTriggerArgs = { + workflowVersionId: Scalars['String']; +}; + + export type MutationExchangeAuthorizationCodeArgs = { authorizationCode: Scalars['String']; clientSecret?: InputMaybe; diff --git a/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts b/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts index 2e4b47c9f457..0fec06b89311 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts @@ -1,6 +1,6 @@ import { DataSource } from 'typeorm'; -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; const tableName = 'featureFlag'; @@ -16,47 +16,47 @@ export const seedFeatureFlags = async ( .orIgnore() .values([ { - key: FeatureFlagKeys.IsBlocklistEnabled, + key: FeatureFlagKey.IsBlocklistEnabled, workspaceId: workspaceId, value: true, }, { - key: FeatureFlagKeys.IsAirtableIntegrationEnabled, + key: FeatureFlagKey.IsAirtableIntegrationEnabled, workspaceId: workspaceId, value: true, }, { - key: FeatureFlagKeys.IsPostgreSQLIntegrationEnabled, + key: FeatureFlagKey.IsPostgreSQLIntegrationEnabled, workspaceId: workspaceId, value: true, }, { - key: FeatureFlagKeys.IsEventObjectEnabled, + key: FeatureFlagKey.IsEventObjectEnabled, workspaceId: workspaceId, value: false, }, { - key: FeatureFlagKeys.IsStripeIntegrationEnabled, + key: FeatureFlagKey.IsStripeIntegrationEnabled, workspaceId: workspaceId, value: true, }, { - key: FeatureFlagKeys.IsMessagingAliasFetchingEnabled, + key: FeatureFlagKey.IsMessagingAliasFetchingEnabled, workspaceId: workspaceId, value: true, }, { - key: FeatureFlagKeys.IsGoogleCalendarSyncV2Enabled, + key: FeatureFlagKey.IsGoogleCalendarSyncV2Enabled, workspaceId: workspaceId, value: true, }, { - key: FeatureFlagKeys.IsFunctionSettingsEnabled, + key: FeatureFlagKey.IsFunctionSettingsEnabled, workspaceId: workspaceId, value: true, }, { - key: FeatureFlagKeys.IsWorkflowEnabled, + key: FeatureFlagKey.IsWorkflowEnabled, workspaceId: workspaceId, value: false, }, diff --git a/packages/twenty-server/src/engine/core-modules/ai-sql-query/ai-sql-query.resolver.ts b/packages/twenty-server/src/engine/core-modules/ai-sql-query/ai-sql-query.resolver.ts index 6aa38399a91c..16f8aff9bf00 100644 --- a/packages/twenty-server/src/engine/core-modules/ai-sql-query/ai-sql-query.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/ai-sql-query/ai-sql-query.resolver.ts @@ -1,20 +1,18 @@ -import { Args, Query, Resolver, ArgsType, Field } from '@nestjs/graphql'; import { ForbiddenException, UseGuards } from '@nestjs/common'; +import { Args, ArgsType, Field, Query, Resolver } from '@nestjs/graphql'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { AISQLQueryService } from 'src/engine/core-modules/ai-sql-query/ai-sql-query.service'; +import { AISQLQueryResult } from 'src/engine/core-modules/ai-sql-query/dtos/ai-sql-query-result.dto'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { User } from 'src/engine/core-modules/user/user.entity'; -import { JwtAuthGuard } from 'src/engine/guards/jwt.auth.guard'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; -import { - FeatureFlagEntity, - FeatureFlagKeys, -} from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { AuthUser } from 'src/engine/decorators/auth/auth-user.decorator'; -import { AISQLQueryResult } from 'src/engine/core-modules/ai-sql-query/dtos/ai-sql-query-result.dto'; -import { AISQLQueryService } from 'src/engine/core-modules/ai-sql-query/ai-sql-query.service'; +import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; +import { JwtAuthGuard } from 'src/engine/guards/jwt.auth.guard'; @ArgsType() class GetAISQLQueryArgs { @@ -40,13 +38,13 @@ export class AISQLQueryResolver { const isCopilotEnabledFeatureFlag = await this.featureFlagRepository.findOneBy({ workspaceId, - key: FeatureFlagKeys.IsCopilotEnabled, + key: FeatureFlagKey.IsCopilotEnabled, value: true, }); if (!isCopilotEnabledFeatureFlag?.value) { throw new ForbiddenException( - `${FeatureFlagKeys.IsCopilotEnabled} feature flag is disabled`, + `${FeatureFlagKey.IsCopilotEnabled} feature flag is disabled`, ); } diff --git a/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-exchange-code-for-token.guard.ts b/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-exchange-code-for-token.guard.ts index 56780ecbcc20..21b8927402e2 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-exchange-code-for-token.guard.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-exchange-code-for-token.guard.ts @@ -13,12 +13,10 @@ import { GoogleAPIScopeConfig, GoogleAPIsOauthExchangeCodeForTokenStrategy, } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-exchange-code-for-token.auth.strategy'; -import { - FeatureFlagEntity, - FeatureFlagKeys, -} from 'src/engine/core-modules/feature-flag/feature-flag.entity'; -import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; import { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; @Injectable() export class GoogleAPIsOauthExchangeCodeForTokenGuard extends AuthGuard( @@ -52,7 +50,7 @@ export class GoogleAPIsOauthExchangeCodeForTokenGuard extends AuthGuard( isMessagingAliasFetchingEnabled: !!(await this.featureFlagRepository.findOneBy({ workspaceId, - key: FeatureFlagKeys.IsMessagingAliasFetchingEnabled, + key: FeatureFlagKey.IsMessagingAliasFetchingEnabled, value: true, })), }; diff --git a/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-request-code.guard.ts b/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-request-code.guard.ts index d34ea86180b8..51ec671a0451 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-request-code.guard.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-request-code.guard.ts @@ -10,13 +10,11 @@ import { Repository } from 'typeorm'; import { TokenService } from 'src/engine/core-modules/auth/services/token.service'; import { GoogleAPIScopeConfig } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-exchange-code-for-token.auth.strategy'; -import { - FeatureFlagEntity, - FeatureFlagKeys, -} from 'src/engine/core-modules/feature-flag/feature-flag.entity'; -import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; import { GoogleAPIsOauthRequestCodeStrategy } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-request-code.auth.strategy'; import { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; @Injectable() export class GoogleAPIsOauthRequestCodeGuard extends AuthGuard('google-apis') { @@ -49,7 +47,7 @@ export class GoogleAPIsOauthRequestCodeGuard extends AuthGuard('google-apis') { isMessagingAliasFetchingEnabled: !!(await this.featureFlagRepository.findOneBy({ workspaceId, - key: FeatureFlagKeys.IsMessagingAliasFetchingEnabled, + key: FeatureFlagKey.IsMessagingAliasFetchingEnabled, value: true, })), }; diff --git a/packages/twenty-server/src/engine/core-modules/billing/billing.service.ts b/packages/twenty-server/src/engine/core-modules/billing/billing.service.ts index 34cae6a376e4..1994f770520d 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/billing.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/billing.service.ts @@ -3,16 +3,14 @@ import { InjectRepository } from '@nestjs/typeorm'; import { In, Repository } from 'typeorm'; -import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; import { BillingSubscription, SubscriptionStatus, } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -import { - FeatureFlagEntity, - FeatureFlagKeys, -} from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; @Injectable() export class BillingService { @@ -47,7 +45,7 @@ export class BillingService { const freeAccessFeatureFlags = await this.featureFlagRepository.find({ where: { - key: FeatureFlagKeys.IsFreeAccessEnabled, + key: FeatureFlagKey.IsFreeAccessEnabled, value: true, }, select: ['workspaceId'], diff --git a/packages/twenty-server/src/engine/core-modules/billing/billing.workspace-service.ts b/packages/twenty-server/src/engine/core-modules/billing/billing.workspace-service.ts index f03935858848..169f24811fe8 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/billing.workspace-service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/billing.workspace-service.ts @@ -13,10 +13,8 @@ import { SubscriptionStatus, } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; import { StripeService } from 'src/engine/core-modules/billing/stripe/stripe.service'; -import { - FeatureFlagEntity, - FeatureFlagKeys, -} from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; import { User } from 'src/engine/core-modules/user/user.entity'; import { @@ -57,7 +55,7 @@ export class BillingWorkspaceService { async isBillingEnabledForWorkspace(workspaceId: string) { const isFreeAccessEnabled = await this.featureFlagRepository.findOneBy({ workspaceId, - key: FeatureFlagKeys.IsFreeAccessEnabled, + key: FeatureFlagKey.IsFreeAccessEnabled, value: true, }); @@ -330,7 +328,7 @@ export class BillingWorkspaceService { await this.featureFlagRepository.delete({ workspaceId, - key: FeatureFlagKeys.IsFreeAccessEnabled, + key: FeatureFlagKey.IsFreeAccessEnabled, }); if ( diff --git a/packages/twenty-server/src/engine/core-modules/feature-flag/enums/feature-flag-key.enum.ts b/packages/twenty-server/src/engine/core-modules/feature-flag/enums/feature-flag-key.enum.ts new file mode 100644 index 000000000000..05bda801fedb --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/feature-flag/enums/feature-flag-key.enum.ts @@ -0,0 +1,13 @@ +export enum FeatureFlagKey { + IsBlocklistEnabled = 'IS_BLOCKLIST_ENABLED', + IsEventObjectEnabled = 'IS_EVENT_OBJECT_ENABLED', + IsAirtableIntegrationEnabled = 'IS_AIRTABLE_INTEGRATION_ENABLED', + IsPostgreSQLIntegrationEnabled = 'IS_POSTGRESQL_INTEGRATION_ENABLED', + IsStripeIntegrationEnabled = 'IS_STRIPE_INTEGRATION_ENABLED', + IsCopilotEnabled = 'IS_COPILOT_ENABLED', + IsMessagingAliasFetchingEnabled = 'IS_MESSAGING_ALIAS_FETCHING_ENABLED', + IsGoogleCalendarSyncV2Enabled = 'IS_GOOGLE_CALENDAR_SYNC_V2_ENABLED', + IsFreeAccessEnabled = 'IS_FREE_ACCESS_ENABLED', + IsFunctionSettingsEnabled = 'IS_FUNCTION_SETTINGS_ENABLED', + IsWorkflowEnabled = 'IS_WORKFLOW_ENABLED', +} diff --git a/packages/twenty-server/src/engine/core-modules/feature-flag/feature-flag.entity.ts b/packages/twenty-server/src/engine/core-modules/feature-flag/feature-flag.entity.ts index 8d79be8f02f6..6601ed689de9 100644 --- a/packages/twenty-server/src/engine/core-modules/feature-flag/feature-flag.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/feature-flag/feature-flag.entity.ts @@ -13,22 +13,9 @@ import { } from 'typeorm'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -export enum FeatureFlagKeys { - IsBlocklistEnabled = 'IS_BLOCKLIST_ENABLED', - IsEventObjectEnabled = 'IS_EVENT_OBJECT_ENABLED', - IsAirtableIntegrationEnabled = 'IS_AIRTABLE_INTEGRATION_ENABLED', - IsPostgreSQLIntegrationEnabled = 'IS_POSTGRESQL_INTEGRATION_ENABLED', - IsStripeIntegrationEnabled = 'IS_STRIPE_INTEGRATION_ENABLED', - IsCopilotEnabled = 'IS_COPILOT_ENABLED', - IsMessagingAliasFetchingEnabled = 'IS_MESSAGING_ALIAS_FETCHING_ENABLED', - IsGoogleCalendarSyncV2Enabled = 'IS_GOOGLE_CALENDAR_SYNC_V2_ENABLED', - IsFreeAccessEnabled = 'IS_FREE_ACCESS_ENABLED', - IsFunctionSettingsEnabled = 'IS_FUNCTION_SETTINGS_ENABLED', - IsWorkflowEnabled = 'IS_WORKFLOW_ENABLED', -} - @Entity({ name: 'featureFlag', schema: 'core' }) @ObjectType('FeatureFlag') @Unique('IndexOnKeyAndWorkspaceIdUnique', ['key', 'workspaceId']) @@ -37,9 +24,9 @@ export class FeatureFlagEntity { @PrimaryGeneratedColumn('uuid') id: string; - @Field() + @Field(() => String) @Column({ nullable: false, type: 'text' }) - key: FeatureFlagKeys; + key: FeatureFlagKey; @Field() @Column({ nullable: false, type: 'uuid' }) diff --git a/packages/twenty-server/src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface.ts b/packages/twenty-server/src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface.ts index 11c8cc4bbe53..92d530f6c7df 100644 --- a/packages/twenty-server/src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface.ts +++ b/packages/twenty-server/src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface.ts @@ -1,3 +1,3 @@ -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; -export type FeatureFlagMap = Record<`${FeatureFlagKeys}`, boolean>; +export type FeatureFlagMap = Record<`${FeatureFlagKey}`, boolean>; diff --git a/packages/twenty-server/src/engine/core-modules/feature-flag/services/is-feature-enabled.service.ts b/packages/twenty-server/src/engine/core-modules/feature-flag/services/is-feature-enabled.service.ts index 33e3bcc8655c..d76020012c31 100644 --- a/packages/twenty-server/src/engine/core-modules/feature-flag/services/is-feature-enabled.service.ts +++ b/packages/twenty-server/src/engine/core-modules/feature-flag/services/is-feature-enabled.service.ts @@ -3,10 +3,8 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { - FeatureFlagEntity, - FeatureFlagKeys, -} from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; @Injectable() export class IsFeatureEnabledService { @@ -16,7 +14,7 @@ export class IsFeatureEnabledService { ) {} public async isFeatureEnabled( - key: FeatureFlagKeys, + key: FeatureFlagKey, workspaceId: string, ): Promise { const featureFlag = await this.featureFlagRepository.findOneBy({ diff --git a/packages/twenty-server/src/engine/metadata-modules/remote-server/utils/validate-remote-server-type.util.ts b/packages/twenty-server/src/engine/metadata-modules/remote-server/utils/validate-remote-server-type.util.ts index 333353970c8d..762581b18c25 100644 --- a/packages/twenty-server/src/engine/metadata-modules/remote-server/utils/validate-remote-server-type.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/remote-server/utils/validate-remote-server-type.util.ts @@ -1,9 +1,7 @@ import { Repository } from 'typeorm'; -import { - FeatureFlagEntity, - FeatureFlagKeys, -} from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { RemoteServerType } from 'src/engine/metadata-modules/remote-server/remote-server.entity'; import { RemoteServerException, @@ -36,9 +34,9 @@ export const validateRemoteServerType = async ( const getFeatureFlagKey = (remoteServerType: RemoteServerType) => { switch (remoteServerType) { case RemoteServerType.POSTGRES_FDW: - return FeatureFlagKeys.IsPostgreSQLIntegrationEnabled; + return FeatureFlagKey.IsPostgreSQLIntegrationEnabled; case RemoteServerType.STRIPE_FDW: - return FeatureFlagKeys.IsStripeIntegrationEnabled; + return FeatureFlagKey.IsStripeIntegrationEnabled; default: throw new RemoteServerException( `Type ${remoteServerType} is not supported.`, diff --git a/packages/twenty-server/src/engine/metadata-modules/serverless-function/serverless-function.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/serverless-function/serverless-function.resolver.ts index 76a4a4762780..7b84cbf768ea 100644 --- a/packages/twenty-server/src/engine/metadata-modules/serverless-function/serverless-function.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/serverless-function/serverless-function.resolver.ts @@ -5,26 +5,24 @@ import { InjectRepository } from '@nestjs/typeorm'; import { FileUpload, GraphQLUpload } from 'graphql-upload'; import { Repository } from 'typeorm'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; import { JwtAuthGuard } from 'src/engine/guards/jwt.auth.guard'; -import { ServerlessFunctionService } from 'src/engine/metadata-modules/serverless-function/serverless-function.service'; +import { CreateServerlessFunctionFromFileInput } from 'src/engine/metadata-modules/serverless-function/dtos/create-serverless-function-from-file.input'; +import { CreateServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/create-serverless-function.input'; +import { DeleteServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/delete-serverless-function.input'; import { ExecuteServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/execute-serverless-function.input'; -import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; -import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -import { ServerlessFunctionDto } from 'src/engine/metadata-modules/serverless-function/dtos/serverless-function.dto'; import { ServerlessFunctionExecutionResultDto } from 'src/engine/metadata-modules/serverless-function/dtos/serverless-function-execution-result.dto'; -import { serverlessFunctionGraphQLApiExceptionHandler } from 'src/engine/metadata-modules/serverless-function/utils/serverless-function-graphql-api-exception-handler.utils'; -import { CreateServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/create-serverless-function.input'; -import { CreateServerlessFunctionFromFileInput } from 'src/engine/metadata-modules/serverless-function/dtos/create-serverless-function-from-file.input'; +import { ServerlessFunctionDto } from 'src/engine/metadata-modules/serverless-function/dtos/serverless-function.dto'; import { UpdateServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/update-serverless-function.input'; -import { DeleteServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/delete-serverless-function.input'; -import { - FeatureFlagEntity, - FeatureFlagKeys, -} from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { ServerlessFunctionException, ServerlessFunctionExceptionCode, } from 'src/engine/metadata-modules/serverless-function/serverless-function.exception'; +import { ServerlessFunctionService } from 'src/engine/metadata-modules/serverless-function/serverless-function.service'; +import { serverlessFunctionGraphQLApiExceptionHandler } from 'src/engine/metadata-modules/serverless-function/utils/serverless-function-graphql-api-exception-handler.utils'; @UseGuards(JwtAuthGuard) @Resolver() @@ -39,7 +37,7 @@ export class ServerlessFunctionResolver { const isFunctionSettingsEnabled = await this.featureFlagRepository.findOneBy({ workspaceId, - key: FeatureFlagKeys.IsFunctionSettingsEnabled, + key: FeatureFlagKey.IsFunctionSettingsEnabled, value: true, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-status/services/workspace-status.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-status/services/workspace-status.service.ts index 4792e62edd8f..28b4d035ae03 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-status/services/workspace-status.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-status/services/workspace-status.service.ts @@ -7,10 +7,8 @@ import { BillingSubscription, SubscriptionStatus, } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; -import { - FeatureFlagEntity, - FeatureFlagKeys, -} from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; +import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; @@ -55,7 +53,7 @@ export class WorkspaceStatusService { await this.featureFlagRepository.find({ where: { workspaceId: Any(workspaceIds), - key: FeatureFlagKeys.IsFreeAccessEnabled, + key: FeatureFlagKey.IsFreeAccessEnabled, value: true, }, }); diff --git a/packages/twenty-server/src/modules/activity/standard-objects/activity-target.workspace-entity.ts b/packages/twenty-server/src/modules/activity/standard-objects/activity-target.workspace-entity.ts index ca621ca9fbbf..907e16b9f0e0 100644 --- a/packages/twenty-server/src/modules/activity/standard-objects/activity-target.workspace-entity.ts +++ b/packages/twenty-server/src/modules/activity/standard-objects/activity-target.workspace-entity.ts @@ -1,6 +1,6 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity'; @@ -99,14 +99,14 @@ export class ActivityTargetWorkspaceEntity extends BaseWorkspaceEntity { inverseSideFieldKey: 'activityTargets', }) @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) @WorkspaceIsNullable() workflow: Relation | null; @WorkspaceJoinColumn('workflow') @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) workflowId: string | null; diff --git a/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts b/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts index 15244b037276..d80c0ec8c7d0 100644 --- a/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts +++ b/packages/twenty-server/src/modules/attachment/standard-objects/attachment.workspace-entity.ts @@ -1,6 +1,6 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; @@ -147,13 +147,13 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity { }) @WorkspaceIsNullable() @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) workflow: Relation | null; @WorkspaceJoinColumn('workflow') @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) workflowId: string | null; diff --git a/packages/twenty-server/src/modules/favorite/standard-objects/favorite.workspace-entity.ts b/packages/twenty-server/src/modules/favorite/standard-objects/favorite.workspace-entity.ts index 50cdaa70832b..e0f8dbbea509 100644 --- a/packages/twenty-server/src/modules/favorite/standard-objects/favorite.workspace-entity.ts +++ b/packages/twenty-server/src/modules/favorite/standard-objects/favorite.workspace-entity.ts @@ -1,6 +1,6 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; @@ -113,14 +113,14 @@ export class FavoriteWorkspaceEntity extends BaseWorkspaceEntity { inverseSideFieldKey: 'favorites', }) @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) @WorkspaceIsNullable() workflow: Relation | null; @WorkspaceJoinColumn('workflow') @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) workflowId: string; diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-messages-import.service.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-messages-import.service.ts index 35c505c9bbfb..d39b507545ef 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-messages-import.service.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/services/messaging-messages-import.service.ts @@ -1,6 +1,6 @@ import { Injectable, Logger } from '@nestjs/common'; -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { IsFeatureEnabledService } from 'src/engine/core-modules/feature-flag/services/is-feature-enabled.service'; import { CacheStorageService } from 'src/engine/integrations/cache-storage/cache-storage.service'; import { InjectCacheStorage } from 'src/engine/integrations/cache-storage/decorators/cache-storage.decorator'; @@ -108,7 +108,7 @@ export class MessagingMessagesImportService { if ( await this.isFeatureEnabledService.isFeatureEnabled( - FeatureFlagKeys.IsMessagingAliasFetchingEnabled, + FeatureFlagKey.IsMessagingAliasFetchingEnabled, workspaceId, ) ) { diff --git a/packages/twenty-server/src/modules/timeline/standard-objects/behavioral-event.workspace-entity.ts b/packages/twenty-server/src/modules/timeline/standard-objects/behavioral-event.workspace-entity.ts index a74069685bbc..7827ce9a64f3 100644 --- a/packages/twenty-server/src/modules/timeline/standard-objects/behavioral-event.workspace-entity.ts +++ b/packages/twenty-server/src/modules/timeline/standard-objects/behavioral-event.workspace-entity.ts @@ -1,11 +1,11 @@ -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; +import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator'; import { WorkspaceGate } from 'src/engine/twenty-orm/decorators/workspace-gate.decorator'; import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.decorator'; import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator'; -import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; import { BEHAVIORAL_EVENT_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; @@ -19,7 +19,7 @@ import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync }) @WorkspaceIsSystem() @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsEventObjectEnabled, + featureFlag: FeatureFlagKey.IsEventObjectEnabled, }) export class BehavioralEventWorkspaceEntity extends BaseWorkspaceEntity { /** diff --git a/packages/twenty-server/src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts b/packages/twenty-server/src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts index 9022c0d99167..dc1942ac4165 100644 --- a/packages/twenty-server/src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts +++ b/packages/twenty-server/src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts @@ -1,6 +1,6 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; @@ -163,14 +163,14 @@ export class TimelineActivityWorkspaceEntity extends BaseWorkspaceEntity { inverseSideFieldKey: 'timelineActivities', }) @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) @WorkspaceIsNullable() workflow: Relation | null; @WorkspaceJoinColumn('workflow') @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) workflowId: string | null; diff --git a/packages/twenty-server/src/modules/workflow/standard-objects/workflow-event-listener.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/standard-objects/workflow-event-listener.workspace-entity.ts index 2cf07c5f354c..ce84c6227bae 100644 --- a/packages/twenty-server/src/modules/workflow/standard-objects/workflow-event-listener.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/standard-objects/workflow-event-listener.workspace-entity.ts @@ -1,6 +1,6 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; @@ -25,7 +25,7 @@ import { WorkflowWorkspaceEntity } from 'src/modules/workflow/standard-objects/w WORKFLOW_EVENT_LISTENER_STANDARD_FIELD_IDS.eventName, }) @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) @WorkspaceIsSystem() export class WorkflowEventListenerWorkspaceEntity extends BaseWorkspaceEntity { diff --git a/packages/twenty-server/src/modules/workflow/standard-objects/workflow-version.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/standard-objects/workflow-version.workspace-entity.ts index 27191682432f..57b478ca2390 100644 --- a/packages/twenty-server/src/modules/workflow/standard-objects/workflow-version.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/standard-objects/workflow-version.workspace-entity.ts @@ -1,6 +1,6 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; @@ -39,7 +39,7 @@ export type WorkflowTrigger = WorkflowDatabaseEventTrigger; labelIdentifierStandardId: WORKFLOW_VERSION_STANDARD_FIELD_IDS.name, }) @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) @WorkspaceIsSystem() export class WorkflowVersionWorkspaceEntity extends BaseWorkspaceEntity { diff --git a/packages/twenty-server/src/modules/workflow/standard-objects/workflow.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/standard-objects/workflow.workspace-entity.ts index d09cdd1f3e0a..7bbaef2e93da 100644 --- a/packages/twenty-server/src/modules/workflow/standard-objects/workflow.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/standard-objects/workflow.workspace-entity.ts @@ -1,6 +1,6 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { RelationMetadataType, @@ -32,7 +32,7 @@ import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/standard-ob labelIdentifierStandardId: WORKFLOW_STANDARD_FIELD_IDS.name, }) @WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + featureFlag: FeatureFlagKey.IsWorkflowEnabled, }) export class WorkflowWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceField({