From 4cb83e050f6c696739f436978d9e1a10a384d09b Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Thu, 25 Jul 2024 20:33:31 +0200 Subject: [PATCH] Put workfows behind a feature flag (#6417) We have recently merged [#workflow](https://github.com/twentyhq/twenty/pull/6412) but we should put the workflow standard object behind a feature flag for now --------- Co-authored-by: bosiraphael --- .../data-seed-dev-workspace.command.ts | 2 -- .../services}/feature-flags.factory.ts | 5 ++- .../object-metadata/object-metadata.entity.ts | 2 +- .../decorators/workspace-index.decorator.ts | 9 ++++++ .../factories/entity-schema-column.factory.ts | 11 +++---- .../factories/entity-schema.factory.ts | 1 - ...workspace-index-metadata-args.interface.ts | 7 +++++ .../standard-objects-prefill-data.ts | 2 -- .../view-workflow-fields.ts | 31 ------------------- .../standard-objects-prefill-data/view.ts | 11 ------- .../workflow-version.ts | 0 .../standard-objects-prefill-data/workflow.ts | 21 ------------- .../factories/index.ts | 2 +- .../factories/standard-index.factory.ts | 17 ++++++++-- .../workspace-sync-metadata.service.ts | 7 +++-- .../activity-target.workspace-entity.ts | 8 +++++ .../attachment.workspace-entity.ts | 8 +++++ .../favorite.workspace-entity.ts | 8 +++++ .../timeline-activity.workspace-entity.ts | 8 +++++ .../workflow-version.workspace-entity.ts | 6 ++-- .../workflow.workspace-entity.ts | 6 ++-- 21 files changed, 81 insertions(+), 91 deletions(-) rename packages/twenty-server/src/engine/{workspace-manager/workspace-sync-metadata/factories => core-modules/feature-flag/services}/feature-flags.factory.ts (77%) delete mode 100644 packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-workflow-fields.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/workflow-version.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/workflow.ts diff --git a/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts b/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts index d4edeeef8..f7d5475ee 100644 --- a/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts +++ b/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts @@ -29,7 +29,6 @@ import { DataSourceService } from 'src/engine/metadata-modules/data-source/data- import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view'; -import { workflowPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/workflow'; import { WorkspaceSyncMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service'; // TODO: implement dry-run @@ -125,7 +124,6 @@ export class DataSeedWorkspaceCommand extends CommandRunner { dataSourceMetadata.schema, workspaceId, ); - await workflowPrefillData(entityManager, dataSourceMetadata.schema); if (workspaceId === SEED_APPLE_WORKSPACE_ID) { await seedMessageThread(entityManager, dataSourceMetadata.schema); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/feature-flags.factory.ts b/packages/twenty-server/src/engine/core-modules/feature-flag/services/feature-flags.factory.ts similarity index 77% rename from packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/feature-flags.factory.ts rename to packages/twenty-server/src/engine/core-modules/feature-flag/services/feature-flags.factory.ts index 763f1b437..856b5d11b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/feature-flags.factory.ts +++ b/packages/twenty-server/src/engine/core-modules/feature-flag/services/feature-flags.factory.ts @@ -3,7 +3,6 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface'; import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; @@ -15,9 +14,9 @@ export class FeatureFlagFactory { private readonly featureFlagRepository: Repository, ) {} - async create(context: WorkspaceSyncContext): Promise { + async create(workspaceId: string): Promise { const workspaceFeatureFlags = await this.featureFlagRepository.find({ - where: { workspaceId: context.workspaceId }, + where: { workspaceId }, }); const workspaceFeatureFlagsMap = workspaceFeatureFlags.reduce( diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts index f3200502c..3d550b02f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.entity.ts @@ -83,7 +83,7 @@ export class ObjectMetadataEntity implements ObjectMetadataInterface { }) fields: Relation; - @OneToMany(() => FieldMetadataEntity, (field) => field.object, { + @OneToMany(() => IndexMetadataEntity, (index) => index.objectMetadata, { cascade: true, }) indexes: Relation; diff --git a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-index.decorator.ts b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-index.decorator.ts index 0ba01f8e0..eed0c9979 100644 --- a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-index.decorator.ts +++ b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-index.decorator.ts @@ -1,6 +1,7 @@ import { generateDeterministicIndexName } from 'src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name'; import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage'; import { convertClassNameToObjectMetadataName } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/convert-class-to-object-metadata-name.util'; +import { TypedReflect } from 'src/utils/typed-reflect'; export interface WorkspaceIndexOptions { columns?: string[]; @@ -16,6 +17,12 @@ export function WorkspaceIndex( throw new Error('Class level WorkspaceIndex should be used with columns'); } + const gate = TypedReflect.getMetadata( + 'workspace:gate-metadata-args', + target, + propertyKey.toString(), + ); + // TODO: handle composite field metadata types if (Array.isArray(columns) && columns.length > 0) { @@ -26,6 +33,7 @@ export function WorkspaceIndex( ])}`, columns, target: target, + gate, }); return; @@ -38,6 +46,7 @@ export function WorkspaceIndex( ])}`, columns: [propertyKey.toString()], target: target.constructor, + gate, }); }; } diff --git a/packages/twenty-server/src/engine/twenty-orm/factories/entity-schema-column.factory.ts b/packages/twenty-server/src/engine/twenty-orm/factories/entity-schema-column.factory.ts index 6fa77853b..bdbf5d73f 100644 --- a/packages/twenty-server/src/engine/twenty-orm/factories/entity-schema-column.factory.ts +++ b/packages/twenty-server/src/engine/twenty-orm/factories/entity-schema-column.factory.ts @@ -2,16 +2,16 @@ import { Injectable } from '@nestjs/common'; import { ColumnType, EntitySchemaColumnOptions } from 'typeorm'; -import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util'; -import { isEnumFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util'; -import { serializeDefaultValue } from 'src/engine/metadata-modules/field-metadata/utils/serialize-default-value'; -import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; -import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; import { compositeTypeDefintions } from 'src/engine/metadata-modules/field-metadata/composite-types'; import { FieldMetadataEntity, FieldMetadataType, } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; +import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; +import { isEnumFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util'; +import { serializeDefaultValue } from 'src/engine/metadata-modules/field-metadata/utils/serialize-default-value'; +import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util'; import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util'; type EntitySchemaColumnMap = { @@ -21,7 +21,6 @@ type EntitySchemaColumnMap = { @Injectable() export class EntitySchemaColumnFactory { create( - workspaceId: string, fieldMetadataCollection: FieldMetadataEntity[], ): EntitySchemaColumnMap { let entitySchemaColumnMap: EntitySchemaColumnMap = {}; diff --git a/packages/twenty-server/src/engine/twenty-orm/factories/entity-schema.factory.ts b/packages/twenty-server/src/engine/twenty-orm/factories/entity-schema.factory.ts index 348dc5fa6..14564a029 100644 --- a/packages/twenty-server/src/engine/twenty-orm/factories/entity-schema.factory.ts +++ b/packages/twenty-server/src/engine/twenty-orm/factories/entity-schema.factory.ts @@ -20,7 +20,6 @@ export class EntitySchemaFactory { objectMetadata: ObjectMetadataEntity, ): Promise { const columns = this.entitySchemaColumnFactory.create( - workspaceId, objectMetadata.fields, ); diff --git a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-index-metadata-args.interface.ts b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-index-metadata-args.interface.ts index add4c89e7..9412e417c 100644 --- a/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-index-metadata-args.interface.ts +++ b/packages/twenty-server/src/engine/twenty-orm/interfaces/workspace-index-metadata-args.interface.ts @@ -1,3 +1,5 @@ +import { Gate } from 'src/engine/twenty-orm/interfaces/gate.interface'; + export interface WorkspaceIndexMetadataArgs { /** * Class to which index is applied. @@ -14,4 +16,9 @@ export interface WorkspaceIndexMetadataArgs { * Index columns. */ columns: string[]; + + /** + * Field gate. + */ + readonly gate?: Gate; } diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts index 9bcbe8dde..19ab7a055 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts @@ -4,7 +4,6 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat import { companyPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/company'; import { personPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/person'; import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view'; -import { workflowPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/workflow'; export const standardObjectsPrefillData = async ( workspaceDataSource: DataSource, @@ -35,7 +34,6 @@ export const standardObjectsPrefillData = async ( workspaceDataSource.transaction(async (entityManager: EntityManager) => { await companyPrefillData(entityManager, schemaName); await personPrefillData(entityManager, schemaName); - await workflowPrefillData(entityManager, schemaName); await viewPrefillData(entityManager, schemaName, objectMetadataMap); }); }; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-workflow-fields.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-workflow-fields.ts deleted file mode 100644 index d5ea0a7e1..000000000 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-workflow-fields.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { WORKFLOW_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'; - -export const viewWorkflowFields = ( - viewId: string, - objectMetadataMap: Record, -) => { - return [ - { - fieldMetadataId: - objectMetadataMap[STANDARD_OBJECT_IDS.workflow].fields[ - WORKFLOW_STANDARD_FIELD_IDS.name - ], - viewId: viewId, - position: 0, - isVisible: true, - size: 210, - }, - { - fieldMetadataId: - objectMetadataMap[STANDARD_OBJECT_IDS.workflow].fields[ - WORKFLOW_STANDARD_FIELD_IDS.publishedVersionId - ], - viewId: viewId, - position: 1, - isVisible: true, - size: 150, - }, - ]; -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts index b233e147e..2d157597f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts @@ -4,7 +4,6 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat import { viewCompanyFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-company-fields'; import { viewOpportunityFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-opportunity-fields'; import { viewPersonFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-person-fields'; -import { viewWorkflowFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-workflow-fields'; import { OPPORTUNITY_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'; @@ -65,15 +64,6 @@ export const viewPrefillData = async ( OPPORTUNITY_STANDARD_FIELD_IDS.stage ], }, - { - name: 'All Workflows', - objectMetadataId: objectMetadataMap[STANDARD_OBJECT_IDS.workflow].id, - type: 'table', - key: 'INDEX', - position: 0, - icon: 'IconSettingsAutomation', - kanbanFieldMetadataId: '', - }, ]) .returning('*') .execute(); @@ -102,7 +92,6 @@ export const viewPrefillData = async ( objectMetadataMap, ), ...viewOpportunityFields(viewIdMap['By Stage'], objectMetadataMap), - ...viewWorkflowFields(viewIdMap['All Workflows'], objectMetadataMap), ]) .execute(); }; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/workflow-version.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/workflow-version.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/workflow.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/workflow.ts deleted file mode 100644 index 7022dbd4a..000000000 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/workflow.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { EntityManager } from 'typeorm'; - -export const workflowPrefillData = async ( - entityManager: EntityManager, - schemaName: string, -) => { - await entityManager - .createQueryBuilder() - .insert() - .into(`${schemaName}.workflow`, ['name', 'publishedVersionId', 'position']) - .orIgnore() - .values([ - { - name: 'Update Subscription Status', - publishedVersionId: null, - position: 1, - }, - ]) - .returning('*') - .execute(); -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/index.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/index.ts index 958bf346c..db218ca73 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/index.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/index.ts @@ -1,6 +1,6 @@ import { StandardIndexFactory } from 'src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory'; -import { FeatureFlagFactory } from './feature-flags.factory'; +import { FeatureFlagFactory } from '../../../core-modules/feature-flag/services/feature-flags.factory'; import { StandardFieldFactory } from './standard-field.factory'; import { StandardObjectFactory } from './standard-object.factory'; import { StandardRelationFactory } from './standard-relation.factory'; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory.ts index 83e450cbe..17bd00215 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory.ts @@ -8,6 +8,7 @@ import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage'; +import { isGatedAndNotEnabled } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/is-gate-and-not-enabled.util'; @Injectable() export class StandardIndexFactory { @@ -31,7 +32,7 @@ export class StandardIndexFactory { target: typeof BaseWorkspaceEntity, context: WorkspaceSyncContext, originalObjectMetadataMap: Record, - _workspaceFeatureFlagsMap: FeatureFlagMap, + workspaceFeatureFlagsMap: FeatureFlagMap, ): Partial[] { const workspaceEntity = metadataArgsStorage.filterEntities(target); @@ -41,8 +42,18 @@ export class StandardIndexFactory { ); } - const workspaceIndexMetadataArgsCollection = - metadataArgsStorage.filterIndexes(target); + if (isGatedAndNotEnabled(workspaceEntity?.gate, workspaceFeatureFlagsMap)) { + return []; + } + + const workspaceIndexMetadataArgsCollection = metadataArgsStorage + .filterIndexes(target) + .filter((workspaceIndexMetadataArgs) => { + return !isGatedAndNotEnabled( + workspaceIndexMetadataArgs.gate, + workspaceFeatureFlagsMap, + ); + }); return workspaceIndexMetadataArgsCollection.map( (workspaceIndexMetadataArgs) => { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts index 245beac3e..4867e6331 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service.ts @@ -5,10 +5,10 @@ import { DataSource } from 'typeorm'; import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface'; +import { FeatureFlagFactory } from 'src/engine/core-modules/feature-flag/services/feature-flags.factory'; import { WorkspaceCacheVersionService } from 'src/engine/metadata-modules/workspace-cache-version/workspace-cache-version.service'; import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service'; -import { FeatureFlagFactory } from 'src/engine/workspace-manager/workspace-sync-metadata/factories/feature-flags.factory'; import { WorkspaceSyncFieldMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-field-metadata.service'; import { WorkspaceSyncIndexMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-index-metadata.service'; import { WorkspaceSyncObjectMetadataIdentifiersService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata-identifiers.service'; @@ -69,8 +69,9 @@ export class WorkspaceSyncMetadataService { ); // Retrieve feature flags - const workspaceFeatureFlagsMap = - await this.featureFlagFactory.create(context); + const workspaceFeatureFlagsMap = await this.featureFlagFactory.create( + context.workspaceId, + ); this.logger.log('Syncing standard objects and fields metadata'); 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 0a6361f09..ca621ca9f 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,10 +1,12 @@ 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 { 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'; import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator'; import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.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 { WorkspaceJoinColumn } from 'src/engine/twenty-orm/decorators/workspace-join-column.decorator'; @@ -96,10 +98,16 @@ export class ActivityTargetWorkspaceEntity extends BaseWorkspaceEntity { inverseSideTarget: () => WorkflowWorkspaceEntity, inverseSideFieldKey: 'activityTargets', }) + @WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + }) @WorkspaceIsNullable() workflow: Relation | null; @WorkspaceJoinColumn('workflow') + @WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + }) workflowId: string | null; @WorkspaceDynamicRelation({ 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 ed13383e4..15244b037 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,5 +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 { 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'; @@ -7,6 +8,7 @@ import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-en import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator'; 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 { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.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'; @@ -144,9 +146,15 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity { inverseSideFieldKey: 'attachments', }) @WorkspaceIsNullable() + @WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + }) workflow: Relation | null; @WorkspaceJoinColumn('workflow') + @WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + }) workflowId: string | null; @WorkspaceDynamicRelation({ 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 92988bbcd..50cdaa708 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,5 +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 { 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'; @@ -7,6 +8,7 @@ import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-en import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator'; 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 { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.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'; @@ -110,10 +112,16 @@ export class FavoriteWorkspaceEntity extends BaseWorkspaceEntity { inverseSideTarget: () => WorkflowWorkspaceEntity, inverseSideFieldKey: 'favorites', }) + @WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + }) @WorkspaceIsNullable() workflow: Relation | null; @WorkspaceJoinColumn('workflow') + @WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + }) workflowId: string; @WorkspaceDynamicRelation({ 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 75628b17b..9022c0d99 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,5 +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 { 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'; @@ -7,6 +8,7 @@ import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-en import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator'; 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 { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.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'; @@ -160,10 +162,16 @@ export class TimelineActivityWorkspaceEntity extends BaseWorkspaceEntity { inverseSideTarget: () => WorkflowWorkspaceEntity, inverseSideFieldKey: 'timelineActivities', }) + @WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + }) @WorkspaceIsNullable() workflow: Relation | null; @WorkspaceJoinColumn('workflow') + @WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, + }) workflowId: string | null; @WorkspaceDynamicRelation({ 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 15f150614..7c09304f3 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 @@ -15,9 +15,6 @@ import { WORKFLOW_VERSION_STANDARD_FIELD_IDS } from 'src/engine/workspace-manage import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; import { WorkflowWorkspaceEntity } from 'src/modules/workflow/standard-objects/workflow.workspace-entity'; -@WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, -}) @WorkspaceEntity({ standardId: STANDARD_OBJECT_IDS.workflowVersion, namePlural: 'workflowVersions', @@ -27,6 +24,9 @@ import { WorkflowWorkspaceEntity } from 'src/modules/workflow/standard-objects/w icon: 'IconVersions', labelIdentifierStandardId: WORKFLOW_VERSION_STANDARD_FIELD_IDS.name, }) +@WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, +}) @WorkspaceIsSystem() export class WorkflowVersionWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceField({ 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 6d986e2f0..37f35a15f 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 @@ -21,9 +21,6 @@ import { FavoriteWorkspaceEntity } from 'src/modules/favorite/standard-objects/f import { TimelineActivityWorkspaceEntity } from 'src/modules/timeline/standard-objects/timeline-activity.workspace-entity'; import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/standard-objects/workflow-version.workspace-entity'; -@WorkspaceGate({ - featureFlag: FeatureFlagKeys.IsWorkflowEnabled, -}) @WorkspaceEntity({ standardId: STANDARD_OBJECT_IDS.workflow, namePlural: 'workflows', @@ -33,6 +30,9 @@ import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/standard-ob icon: 'IconSettingsAutomation', labelIdentifierStandardId: WORKFLOW_STANDARD_FIELD_IDS.name, }) +@WorkspaceGate({ + featureFlag: FeatureFlagKeys.IsWorkflowEnabled, +}) export class WorkflowWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceField({ standardId: WORKFLOW_STANDARD_FIELD_IDS.name,