diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql index 2042fb39f0..afd1d291da 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql +++ b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql @@ -930,6 +930,7 @@ enum WorkspaceDiscoverability { enum WorkspaceActivationStatus { ONGOING_CREATION PENDING_CREATION + CREATED ACTIVE INACTIVE SUSPENDED diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.ts b/packages/twenty-client-sdk/src/metadata/generated/schema.ts index ca97b67a59..0607c1b170 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/schema.ts +++ b/packages/twenty-client-sdk/src/metadata/generated/schema.ts @@ -669,7 +669,7 @@ export interface Workspace { export type WorkspaceDiscoverability = 'PUBLIC' | 'MEMBERS_AND_INVITEES' | 'HIDDEN' -export type WorkspaceActivationStatus = 'ONGOING_CREATION' | 'PENDING_CREATION' | 'ACTIVE' | 'INACTIVE' | 'SUSPENDED' +export type WorkspaceActivationStatus = 'ONGOING_CREATION' | 'PENDING_CREATION' | 'CREATED' | 'ACTIVE' | 'INACTIVE' | 'SUSPENDED' export interface User { id: Scalars['UUID'] @@ -8962,6 +8962,7 @@ export const enumWorkspaceDiscoverability = { export const enumWorkspaceActivationStatus = { ONGOING_CREATION: 'ONGOING_CREATION' as const, PENDING_CREATION: 'PENDING_CREATION' as const, + CREATED: 'CREATED' as const, ACTIVE: 'ACTIVE' as const, INACTIVE: 'INACTIVE' as const, SUSPENDED: 'SUSPENDED' as const diff --git a/packages/twenty-front/src/generated-admin/graphql.ts b/packages/twenty-front/src/generated-admin/graphql.ts index 8f8bd6011c..0e7a946f4a 100644 --- a/packages/twenty-front/src/generated-admin/graphql.ts +++ b/packages/twenty-front/src/generated-admin/graphql.ts @@ -925,6 +925,7 @@ export type WorkerQueueMetrics = { export enum WorkspaceActivationStatus { ACTIVE = 'ACTIVE', + CREATED = 'CREATED', INACTIVE = 'INACTIVE', ONGOING_CREATION = 'ONGOING_CREATION', PENDING_CREATION = 'PENDING_CREATION', diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index cb89939e58..90b4cea3c3 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -6283,6 +6283,7 @@ export type Workspace = { export enum WorkspaceActivationStatus { ACTIVE = 'ACTIVE', + CREATED = 'CREATED', INACTIVE = 'INACTIVE', ONGOING_CREATION = 'ONGOING_CREATION', PENDING_CREATION = 'PENDING_CREATION', diff --git a/packages/twenty-front/src/modules/metadata-store/effect-components/IsMinimalMetadataReadyEffect.tsx b/packages/twenty-front/src/modules/metadata-store/effect-components/IsMinimalMetadataReadyEffect.tsx index 35275a8bb1..04a0506e34 100644 --- a/packages/twenty-front/src/modules/metadata-store/effect-components/IsMinimalMetadataReadyEffect.tsx +++ b/packages/twenty-front/src/modules/metadata-store/effect-components/IsMinimalMetadataReadyEffect.tsx @@ -8,7 +8,7 @@ import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomState import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; import { useEffect } from 'react'; import { isDefined } from 'twenty-shared/utils'; -import { isWorkspaceActiveOrSuspended } from 'twenty-shared/workspace'; +import { isWorkspaceProvisioned } from 'twenty-shared/workspace'; export const IsMinimalMetadataReadyEffect = () => { const hasAccessTokenPair = useHasAccessTokenPair(); @@ -40,7 +40,7 @@ export const IsMinimalMetadataReadyEffect = () => { return; } - const hasActiveWorkspace = isWorkspaceActiveOrSuspended(currentWorkspace); + const hasProvisionedWorkspace = isWorkspaceProvisioned(currentWorkspace); const areObjectsLoaded = metadataStoreObjectMetadataItems.status === 'up-to-date' && @@ -55,7 +55,7 @@ export const IsMinimalMetadataReadyEffect = () => { } const isReady = - isDefined(currentUser) && (!hasActiveWorkspace || areViewsLoaded); + isDefined(currentUser) && (!hasProvisionedWorkspace || areViewsLoaded); if (isReady) { setIsMinimalMetadataReady(true); diff --git a/packages/twenty-front/src/modules/metadata-store/effect-components/MinimalMetadataLoadEffect.tsx b/packages/twenty-front/src/modules/metadata-store/effect-components/MinimalMetadataLoadEffect.tsx index 04b7d188ea..8aa9e265f1 100644 --- a/packages/twenty-front/src/modules/metadata-store/effect-components/MinimalMetadataLoadEffect.tsx +++ b/packages/twenty-front/src/modules/metadata-store/effect-components/MinimalMetadataLoadEffect.tsx @@ -9,7 +9,7 @@ import { metadataLoadedVersionState } from '@/metadata-store/states/metadataLoad import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; import { useEffect, useState } from 'react'; import { isDefined } from 'twenty-shared/utils'; -import { isWorkspaceActiveOrSuspended } from 'twenty-shared/workspace'; +import { isWorkspaceProvisioned } from 'twenty-shared/workspace'; export const MinimalMetadataLoadEffect = () => { const hasAccessTokenPair = useHasAccessTokenPair(); @@ -24,9 +24,9 @@ export const MinimalMetadataLoadEffect = () => { const isOnAuthOrOnboardingPage = useIsOnAuthOrOnboardingPage(); - const isActiveWorkspace = isWorkspaceActiveOrSuspended(currentWorkspace); + const isProvisionedWorkspace = isWorkspaceProvisioned(currentWorkspace); const shouldLoadRealMetadata = - hasAccessTokenPair && isActiveWorkspace && !isOnAuthOrOnboardingPage; + hasAccessTokenPair && isProvisionedWorkspace && !isOnAuthOrOnboardingPage; useEffect(() => { if (!isCurrentUserLoaded && !isDefined(currentUser)) { diff --git a/packages/twenty-server/src/database/commands/command-runners/active-or-suspended-workspace.command-runner.ts b/packages/twenty-server/src/database/commands/command-runners/active-or-suspended-workspace.command-runner.ts deleted file mode 100644 index 2d8d833d86..0000000000 --- a/packages/twenty-server/src/database/commands/command-runners/active-or-suspended-workspace.command-runner.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; - -import { - WorkspaceCommandRunner, - type WorkspaceCommandOptions, -} from 'src/database/commands/command-runners/workspace.command-runner'; -import { type WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; - -export type ActiveOrSuspendedWorkspaceCommandOptions = WorkspaceCommandOptions; - -export abstract class ActiveOrSuspendedWorkspaceCommandRunner< - Options extends ActiveOrSuspendedWorkspaceCommandOptions = - ActiveOrSuspendedWorkspaceCommandOptions, -> extends WorkspaceCommandRunner { - constructor( - protected readonly workspaceIteratorService: WorkspaceIteratorService, - ) { - super(workspaceIteratorService, [ - WorkspaceActivationStatus.ACTIVE, - WorkspaceActivationStatus.SUSPENDED, - ]); - } -} diff --git a/packages/twenty-server/src/database/commands/command-runners/provisioned-workspace.command-runner.ts b/packages/twenty-server/src/database/commands/command-runners/provisioned-workspace.command-runner.ts new file mode 100644 index 0000000000..aafee2a6e3 --- /dev/null +++ b/packages/twenty-server/src/database/commands/command-runners/provisioned-workspace.command-runner.ts @@ -0,0 +1,20 @@ +import { PROVISIONED_WORKSPACE_ACTIVATION_STATUSES } from 'twenty-shared/workspace'; + +import { + WorkspaceCommandRunner, + type WorkspaceCommandOptions, +} from 'src/database/commands/command-runners/workspace.command-runner'; +import { type WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; + +export type ProvisionedWorkspaceCommandOptions = WorkspaceCommandOptions; + +export abstract class ProvisionedWorkspaceCommandRunner< + Options extends ProvisionedWorkspaceCommandOptions = + ProvisionedWorkspaceCommandOptions, +> extends WorkspaceCommandRunner { + constructor( + protected readonly workspaceIteratorService: WorkspaceIteratorService, + ) { + super(workspaceIteratorService, PROVISIONED_WORKSPACE_ACTIVATION_STATUSES); + } +} diff --git a/packages/twenty-server/src/database/commands/command-runners/workspace-iterator.service.ts b/packages/twenty-server/src/database/commands/command-runners/workspace-iterator.service.ts index 5f761d9725..afd0f92b46 100644 --- a/packages/twenty-server/src/database/commands/command-runners/workspace-iterator.service.ts +++ b/packages/twenty-server/src/database/commands/command-runners/workspace-iterator.service.ts @@ -3,10 +3,14 @@ import { InjectRepository } from '@nestjs/typeorm'; import chalk from 'chalk'; import { isNonEmptyString } from '@sniptt/guards'; -import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; +import { + PROVISIONED_WORKSPACE_ACTIVATION_STATUSES, + WorkspaceActivationStatus, +} from 'twenty-shared/workspace'; import { isDefined } from 'twenty-shared/utils'; -import { In, MoreThanOrEqual, Repository } from 'typeorm'; +import { MoreThanOrEqual, Repository } from 'typeorm'; +import { activationStatusIn } from 'src/engine/core-modules/workspace/utils/activation-status-in.util'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { GlobalWorkspaceDataSource } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-datasource'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; @@ -39,10 +43,7 @@ export type WorkspaceIteratorReport = { }[]; }; -const DEFAULT_ACTIVATION_STATUSES = [ - WorkspaceActivationStatus.ACTIVE, - WorkspaceActivationStatus.SUSPENDED, -]; +const DEFAULT_ACTIVATION_STATUSES = PROVISIONED_WORKSPACE_ACTIVATION_STATUSES; @Injectable() export class WorkspaceIteratorService { @@ -154,7 +155,7 @@ export class WorkspaceIteratorService { const workspaces = await this.workspaceRepository.find({ select: ['id'], where: { - activationStatus: In(activationStatuses), + activationStatus: activationStatusIn(activationStatuses), ...(options.startFromWorkspaceId ? { id: MoreThanOrEqual(options.startFromWorkspaceId) } : {}), diff --git a/packages/twenty-server/src/database/commands/install-pre-installed-apps.command.ts b/packages/twenty-server/src/database/commands/install-pre-installed-apps.command.ts index 7daa9ae831..92f8daa667 100644 --- a/packages/twenty-server/src/database/commands/install-pre-installed-apps.command.ts +++ b/packages/twenty-server/src/database/commands/install-pre-installed-apps.command.ts @@ -1,6 +1,6 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { PreInstalledAppsService } from 'src/engine/core-modules/application/pre-installed-apps/pre-installed-apps.service'; @@ -10,9 +10,9 @@ import { PreInstalledAppsService } from 'src/engine/core-modules/application/pre @Command({ name: 'install-pre-installed-apps', description: - 'Install every application registration flagged `isPreInstalled` on every active and suspended workspace. Idempotent.', + 'Install every application registration flagged `isPreInstalled` on every provisioned workspace. Idempotent.', }) -export class InstallPreInstalledAppsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class InstallPreInstalledAppsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly preInstalledAppsService: PreInstalledAppsService, diff --git a/packages/twenty-server/src/database/commands/rebuild-application-default-deps.command.ts b/packages/twenty-server/src/database/commands/rebuild-application-default-deps.command.ts index 10aee054d8..5e54b52ea6 100644 --- a/packages/twenty-server/src/database/commands/rebuild-application-default-deps.command.ts +++ b/packages/twenty-server/src/database/commands/rebuild-application-default-deps.command.ts @@ -35,7 +35,7 @@ export class RebuildApplicationDefaultDepsCommand extends CommandRunner { @Option({ flags: '-w, --workspace-id [workspace_id]', description: - 'workspace id. Command runs on all active/suspended workspaces if not provided.', + 'workspace id. Command runs on all provisioned workspaces if not provided.', required: false, }) parseWorkspaceId(val: string, previous?: Set): Set { diff --git a/packages/twenty-server/src/database/commands/run-instance-commands.command.ts b/packages/twenty-server/src/database/commands/run-instance-commands.command.ts index 1a5a44b265..aff23e0778 100644 --- a/packages/twenty-server/src/database/commands/run-instance-commands.command.ts +++ b/packages/twenty-server/src/database/commands/run-instance-commands.command.ts @@ -67,7 +67,7 @@ export class RunInstanceCommandsCommand extends CommandRunner { await this.runLegacyPendingTypeOrmMigrations(); const activeOrSuspendedWorkspaceIds = - await this.workspaceVersionService.getActiveOrSuspendedWorkspaceIds(); + await this.workspaceVersionService.getProvisionedWorkspaceIds(); const sequence = this.upgradeSequenceReaderService.getUpgradeSequence(); @@ -133,7 +133,7 @@ export class RunInstanceCommandsCommand extends CommandRunner { } const activeOrSuspendedWorkspaceIds = - await this.workspaceVersionService.getActiveOrSuspendedWorkspaceIds(); + await this.workspaceVersionService.getProvisionedWorkspaceIds(); if (activeOrSuspendedWorkspaceIds.length === 0) { return; diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500001000-add-compose-email-command-menu-item.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500001000-add-compose-email-command-menu-item.command.ts index 021a6ecfd6..9a6b0008eb 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500001000-add-compose-email-command-menu-item.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500001000-add-compose-email-command-menu-item.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -19,7 +19,7 @@ const COMPOSE_EMAIL_UNIVERSAL_IDENTIFIER = name: 'upgrade:1-21:add-compose-email-command-menu-item', description: 'Add the Compose Email command menu item to existing workspaces', }) -export class AddComposeEmailCommandMenuItemCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddComposeEmailCommandMenuItemCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500002000-add-global-key-value-pair-unique-index.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500002000-add-global-key-value-pair-unique-index.command.ts index dd920188b0..0f561b200f 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500002000-add-global-key-value-pair-unique-index.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500002000-add-global-key-value-pair-unique-index.command.ts @@ -3,7 +3,7 @@ import { InjectDataSource } from '@nestjs/typeorm'; import { Command } from 'nest-commander'; import { DataSource } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -15,7 +15,7 @@ import { addGlobalKeyValuePairUniqueIndexQueries } from 'src/database/typeorm/co description: 'Deduplicate global keyValuePair rows and add the null/null unique index', }) -export class AddGlobalKeyValuePairUniqueIndexCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddGlobalKeyValuePairUniqueIndexCommand extends ProvisionedWorkspaceCommandRunner { private hasRunOnce = false; private async deduplicateGlobalKeyValuePairs( diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500003000-backfill-datasource-to-workspace.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500003000-backfill-datasource-to-workspace.command.ts index 62d0e50b2a..7005a46f13 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500003000-backfill-datasource-to-workspace.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500003000-backfill-datasource-to-workspace.command.ts @@ -5,7 +5,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -18,7 +18,7 @@ import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-s description: 'Backfill workspace.databaseSchema from the dataSource entity for workspaces that have not been migrated yet', }) -export class BackfillDatasourceToWorkspaceCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillDatasourceToWorkspaceCommand extends ProvisionedWorkspaceCommandRunner { constructor( @InjectRepository(WorkspaceEntity) private readonly workspaceRepository: Repository, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500004000-backfill-message-thread-subject.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500004000-backfill-message-thread-subject.command.ts index 5346f1d69e..995e0f304b 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500004000-backfill-message-thread-subject.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500004000-backfill-message-thread-subject.command.ts @@ -3,7 +3,7 @@ import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -24,7 +24,7 @@ import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/wo description: 'Create the messageThread.subject standard field if missing and backfill it from the most recently received message in each thread', }) -export class BackfillMessageThreadSubjectCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillMessageThreadSubjectCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500006000-deduplicate-engine-commands.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500006000-deduplicate-engine-commands.command.ts index 0d32c5263c..f84f1d3f3f 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500006000-deduplicate-engine-commands.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500006000-deduplicate-engine-commands.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -36,7 +36,7 @@ const NEW_UNIVERSAL_IDENTIFIERS = new Set([ description: 'Merge single/multiple record engine command menu items into unified commands (delete, restore, destroy, export)', }) -export class DeduplicateEngineCommandsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class DeduplicateEngineCommandsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500007000-fix-select-all-command-menu-items.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500007000-fix-select-all-command-menu-items.command.ts index c35949c8e2..6161c54c96 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500007000-fix-select-all-command-menu-items.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500007000-fix-select-all-command-menu-items.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -23,7 +23,7 @@ const UNIVERSAL_IDENTIFIERS_TO_FIX = new Set([ description: 'Fix delete/restore/destroy command menu items to work in select-all (exclusion) mode', }) -export class FixSelectAllCommandMenuItemsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class FixSelectAllCommandMenuItemsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500008000-migrate-ai-agent-text-to-json-response-format.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500008000-migrate-ai-agent-text-to-json-response-format.command.ts index abe6ce83df..5a131f3ec8 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500008000-migrate-ai-agent-text-to-json-response-format.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500008000-migrate-ai-agent-text-to-json-response-format.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -43,7 +43,7 @@ const TEXT_AGENT_DEFAULT_OUTPUT_SCHEMA = { description: 'Migrate AI agents with text response format to JSON with a default response field', }) -export class MigrateAiAgentTextToJsonResponseFormatCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class MigrateAiAgentTextToJsonResponseFormatCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500009000-update-edit-layout-command-menu-item-label.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500009000-update-edit-layout-command-menu-item-label.command.ts index 7d2d48866b..153fde85d8 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500009000-update-edit-layout-command-menu-item-label.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500009000-update-edit-layout-command-menu-item-label.command.ts @@ -3,7 +3,7 @@ import { InjectDataSource } from '@nestjs/typeorm'; import { Command } from 'nest-commander'; import { DataSource } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -16,7 +16,7 @@ const EDIT_RECORD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER = name: 'upgrade:1-21:update-edit-layout-command-menu-item-label', description: 'Update Edit Page Layout command menu item label to Edit Layout', }) -export class UpdateEditLayoutCommandMenuItemLabelCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class UpdateEditLayoutCommandMenuItemLabelCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, @InjectDataSource() diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500010000-drop-workspace-messaging-fks.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500010000-drop-workspace-messaging-fks.command.ts index 7cb588d550..eb47e91d3a 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500010000-drop-workspace-messaging-fks.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500010000-drop-workspace-messaging-fks.command.ts @@ -1,6 +1,6 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -29,7 +29,7 @@ const FK_COLUMNS_TO_DROP = [ description: 'Drop FK constraints from workspace messaging/calendar tables that now reference core schema entities', }) -export class DropWorkspaceMessagingFksCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class DropWorkspaceMessagingFksCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceSchemaManagerService: WorkspaceSchemaManagerService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500011000-migrate-message-folder-parent-id-to-external-id.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500011000-migrate-message-folder-parent-id-to-external-id.command.ts index f32a6c1904..f41630db5e 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500011000-migrate-message-folder-parent-id-to-external-id.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500011000-migrate-message-folder-parent-id-to-external-id.command.ts @@ -3,7 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Command } from 'nest-commander'; import { Repository } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -18,7 +18,7 @@ const UUID_REGEX = description: 'Migrate messageFolder parentFolderId from internal UUID references to external IDs', }) -export class MigrateMessageFolderParentIdToExternalIdCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class MigrateMessageFolderParentIdToExternalIdCommand extends ProvisionedWorkspaceCommandRunner { constructor( @InjectRepository(MessageFolderEntity) private readonly messageFolderRepository: Repository, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500012000-migrate-messaging-infrastructure-to-metadata.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500012000-migrate-messaging-infrastructure-to-metadata.command.ts index 4c5a845ae8..d3277e085e 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500012000-migrate-messaging-infrastructure-to-metadata.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500012000-migrate-messaging-infrastructure-to-metadata.command.ts @@ -5,7 +5,7 @@ import { Command } from 'nest-commander'; import { type FeatureFlagKey } from 'twenty-shared/types'; import { type DeepPartial, Repository } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; @@ -41,7 +41,7 @@ type LegacyConnectedAccountWorkspaceEntity = { description: 'Backfill connectedAccount, messageChannel, calendarChannel, and messageFolder to core metadata schema', }) -export class MigrateMessagingInfrastructureToMetadataCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class MigrateMessagingInfrastructureToMetadataCommand extends ProvisionedWorkspaceCommandRunner { constructor( private readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, @InjectRepository(ConnectedAccountEntity) diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500013000-refactor-navigation-commands.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500013000-refactor-navigation-commands.command.ts index 7548306c24..c1938c224f 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500013000-refactor-navigation-commands.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500013000-refactor-navigation-commands.command.ts @@ -5,7 +5,7 @@ import { isDefined } from 'twenty-shared/utils'; import { DataSource } from 'typeorm'; import { v4, v5 } from 'uuid'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs, @@ -68,7 +68,7 @@ const SETTINGS_NAVIGATION_ITEM_KEYS = [ description: 'Replace GO_TO_* command menu items with unified NAVIGATION engine key and payload', }) -export class RefactorNavigationCommandsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class RefactorNavigationCommandsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, @InjectDataSource() diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500014000-fix-message-thread-view-and-label-identifier.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500014000-fix-message-thread-view-and-label-identifier.command.ts index 7f97543b2d..e502d71143 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500014000-fix-message-thread-view-and-label-identifier.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500014000-fix-message-thread-view-and-label-identifier.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -51,7 +51,7 @@ const filterViewFieldsByViewUniversalIdentifier = ({ description: 'Sync the allMessageThreads standard view fields with the current standard definition (adds subject and updatedAt columns) and repoint messageThread.labelIdentifierFieldMetadataId to the subject field. Fixes workspaces upgraded from <1.21 where PR #19351 changes were not applied because the twenty-standard application is not re-synced on existing workspaces.', }) -export class FixMessageThreadViewAndLabelIdentifierCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class FixMessageThreadViewAndLabelIdentifierCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500015000-update-search-command-menu-item-labels.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500015000-update-search-command-menu-item-labels.command.ts index 610f4a6c45..b94ff3f718 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500015000-update-search-command-menu-item-labels.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-21/1-21-workspace-command-1775500015000-update-search-command-menu-item-labels.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -22,7 +22,7 @@ const UNIVERSAL_IDENTIFIERS_TO_FIX = new Set([ description: 'Update search command menu item labels to remove objectMetadata name', }) -export class UpdateSearchCommandMenuItemLabelsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class UpdateSearchCommandMenuItemLabelsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1775500016000-add-send-email-record-selection-command-menu-items.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1775500016000-add-send-email-record-selection-command-menu-items.command.ts index b95535e837..b727a1aa39 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1775500016000-add-send-email-record-selection-command-menu-items.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1775500016000-add-send-email-record-selection-command-menu-items.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -23,7 +23,7 @@ const SEND_EMAIL_RECORD_SELECTION_UNIVERSAL_IDENTIFIERS = [ description: 'Add the per-object Send Email command menu items (Person, Company, Opportunity) to existing workspaces', }) -export class AddSendEmailRecordSelectionCommandMenuItemsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddSendEmailRecordSelectionCommandMenuItemsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1780000002000-backfill-standard-skills.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1780000002000-backfill-standard-skills.command.ts index 4f55f9aad1..0f27ac1b51 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1780000002000-backfill-standard-skills.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1780000002000-backfill-standard-skills.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -16,7 +16,7 @@ import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspa description: 'Backfill standard skills for existing workspaces that were created before skills were added', }) -export class BackfillStandardSkillsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillStandardSkillsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1780000003000-fix-merge-command-select-all.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1780000003000-fix-merge-command-select-all.command.ts index 51555869fb..c0607fc9d9 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1780000003000-fix-merge-command-select-all.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-22/1-22-workspace-command-1780000003000-fix-merge-command-select-all.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -21,7 +21,7 @@ const UNIVERSAL_IDENTIFIERS_TO_FIX = new Set([ description: 'Fix merge command menu item to not appear in select-all (exclusion) mode', }) -export class FixMergeCommandSelectAllCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class FixMergeCommandSelectAllCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-23/1-23-workspace-command-1780000001500-backfill-record-page-layouts.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-23/1-23-workspace-command-1780000001500-backfill-record-page-layouts.command.ts index 82981743da..7311f83cf1 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-23/1-23-workspace-command-1780000001500-backfill-record-page-layouts.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-23/1-23-workspace-command-1780000001500-backfill-record-page-layouts.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { type FeatureFlagKey, ViewType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -29,7 +29,7 @@ import { type UniversalFlatView } from 'src/engine/workspace-manager/workspace-m description: 'Delete and recreate all record page layouts from standard config, backfill custom objects, and enable IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED', }) -export class BackfillRecordPageLayoutsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillRecordPageLayoutsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-23/1-23-workspace-command-1780000005000-update-global-object-context-command-menu-items.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-23/1-23-workspace-command-1780000005000-update-global-object-context-command-menu-items.command.ts index 1d5316df7c..0cea8df829 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-23/1-23-workspace-command-1780000005000-update-global-object-context-command-menu-items.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-23/1-23-workspace-command-1780000005000-update-global-object-context-command-menu-items.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -26,7 +26,7 @@ const UNIVERSAL_IDENTIFIERS_TO_FIX = new Set([ description: 'Update command menu items that require object context from GLOBAL to GLOBAL_OBJECT_CONTEXT', }) -export class UpdateGlobalObjectContextCommandMenuItemsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class UpdateGlobalObjectContextCommandMenuItemsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-1/2-1-workspace-command-1790000000000-gate-export-import-command-menu-items-by-permission-flag.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-1/2-1-workspace-command-1790000000000-gate-export-import-command-menu-items-by-permission-flag.command.ts index fd3ce3884d..6655d9d5a1 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-1/2-1-workspace-command-1790000000000-gate-export-import-command-menu-items-by-permission-flag.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-1/2-1-workspace-command-1790000000000-gate-export-import-command-menu-items-by-permission-flag.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -23,7 +23,7 @@ const UNIVERSAL_IDENTIFIERS_TO_FIX = new Set([ description: 'Gate export/import command menu items (exportRecords, exportView, importRecords) behind EXPORT_CSV / IMPORT_CSV permission flags', }) -export class GateExportImportCommandMenuItemsByPermissionFlagCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class GateExportImportCommandMenuItemsByPermissionFlagCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-1/2-1-workspace-command-1795000001000-add-layout-customization-guard-to-edit-commands.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-1/2-1-workspace-command-1795000001000-add-layout-customization-guard-to-edit-commands.command.ts index ff8ed220f0..939c745400 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-1/2-1-workspace-command-1795000001000-add-layout-customization-guard-to-edit-commands.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-1/2-1-workspace-command-1795000001000-add-layout-customization-guard-to-edit-commands.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -26,7 +26,7 @@ const UNIVERSAL_IDENTIFIERS_TO_UPDATE = new Set([ description: 'Guard layout edit commands and migrate legacy page edit-mode expressions', }) -export class AddLayoutCustomizationGuardToEditCommandsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddLayoutCustomizationGuardToEditCommandsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000040000-move-demoted-standard-fields-to-custom-application.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000040000-move-demoted-standard-fields-to-custom-application.command.ts index b65dd956b3..e6b3154ac8 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000040000-move-demoted-standard-fields-to-custom-application.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000040000-move-demoted-standard-fields-to-custom-application.command.ts @@ -5,7 +5,7 @@ import { isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; import { v4 as uuidv4 } from 'uuid'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -55,7 +55,7 @@ const DEMOTED_STANDARD_FIELDS: { description: 'Re-own the demoted Company ARR / ICP / Employees, Company/Person X (Twitter) and Person City standard fields to the workspace custom application, preserving their data and keeping them active', }) -export class MoveDemotedStandardFieldsToCustomApplicationCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class MoveDemotedStandardFieldsToCustomApplicationCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000045000-rename-conflicting-custom-fields.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000045000-rename-conflicting-custom-fields.command.ts index bd339f0ee1..803f731615 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000045000-rename-conflicting-custom-fields.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000045000-rename-conflicting-custom-fields.command.ts @@ -3,7 +3,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -42,7 +42,7 @@ const computeAvailableFieldName = ( description: 'Rename a pre-existing custom field whose name collides with the new generic standard field (Company annualRevenue), preserving its data, so the standard field can be added', }) -export class RenameConflictingCustomFieldsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class RenameConflictingCustomFieldsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000050000-add-inactive-generic-standard-fields.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000050000-add-inactive-generic-standard-fields.command.ts index f7b2534875..3d7bc1c401 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000050000-add-inactive-generic-standard-fields.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000050000-add-inactive-generic-standard-fields.command.ts @@ -3,7 +3,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -25,7 +25,7 @@ const NEW_STANDARD_FIELD_UNIVERSAL_IDENTIFIERS = [ description: 'Create the new generic standard field (Company annualRevenue) on existing workspaces as inactive (opt-in), with its column ready for activation', }) -export class AddInactiveGenericStandardFieldsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddInactiveGenericStandardFieldsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000055000-sync-call-recording-standard-objects.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000055000-sync-call-recording-standard-objects.command.ts index 03e7625d93..ab3a1ccb90 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000055000-sync-call-recording-standard-objects.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-10/2-10-workspace-command-1799000055000-sync-call-recording-standard-objects.command.ts @@ -8,7 +8,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { v4 as uuidv4 } from 'uuid'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { buildNavigationCommandMenuItemOperationsOrThrow } from 'src/database/commands/upgrade-version-command/2-10/utils/build-navigation-command-menu-item-operations-or-throw.util'; @@ -191,7 +191,7 @@ const buildLegacyCalendarEventRecordingPreferenceFieldMetadata = ({ description: 'Create the CallRecording standard metadata in existing workspaces', }) -export class SyncCallRecordingStandardObjectsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class SyncCallRecordingStandardObjectsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-13/2-13-workspace-command-1781277460000-sync-standard-ui-capability-flags.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-13/2-13-workspace-command-1781277460000-sync-standard-ui-capability-flags.command.ts index 65a2c49819..902334323a 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-13/2-13-workspace-command-1781277460000-sync-standard-ui-capability-flags.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-13/2-13-workspace-command-1781277460000-sync-standard-ui-capability-flags.command.ts @@ -4,7 +4,7 @@ import { Command } from 'nest-commander'; import { DataSource } from 'typeorm'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -28,7 +28,7 @@ import { computeTwentyStandardApplicationAllFlatEntityMaps } from 'src/engine/wo description: 'Re-sync isUICreatable and isUIEditable on standard objects and isUIEditable on standard fields from the standard-application definitions', }) -export class SyncStandardUiCapabilityFlagsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class SyncStandardUiCapabilityFlagsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-13/2-13-workspace-command-1781277470000-sync-create-record-command-availability-expression.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-13/2-13-workspace-command-1781277470000-sync-create-record-command-availability-expression.command.ts index 869f84ed78..5ad45115e6 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-13/2-13-workspace-command-1781277470000-sync-create-record-command-availability-expression.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-13/2-13-workspace-command-1781277470000-sync-create-record-command-availability-expression.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -16,7 +16,7 @@ import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspa description: 'Re-sync conditionalAvailabilityExpression on standard command menu items in existing workspaces (the create-record command is now gated on objectMetadataItem.isUICreatable and isUIEditable)', }) -export class SyncCreateRecordCommandAvailabilityExpressionCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class SyncCreateRecordCommandAvailabilityExpressionCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000040000-fix-standard-relation-field-labels-icons.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000040000-fix-standard-relation-field-labels-icons.command.ts index 8d42e63592..26ac87bbf4 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000040000-fix-standard-relation-field-labels-icons.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000040000-fix-standard-relation-field-labels-icons.command.ts @@ -5,7 +5,7 @@ import { } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -32,7 +32,7 @@ const DEFAULT_RELATION_TARGET_UNIVERSAL_IDENTIFIERS = new Set( description: "Re-sync standard objects' default relation field labels/icons (note/task/attachment/timeline) against the source of truth, healing drift such as the Company timelineActivities IconIconTimelineEvent typo.", }) -export class FixStandardRelationFieldLabelsIconsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class FixStandardRelationFieldLabelsIconsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000065000-sync-call-recording-request-status.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000065000-sync-call-recording-request-status.command.ts index 5593e52f11..1fef008be2 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000065000-sync-call-recording-request-status.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000065000-sync-call-recording-request-status.command.ts @@ -3,7 +3,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { getStandardFlatEntitiesToCreateOrThrow } from 'src/database/commands/upgrade-version-command/2-10/utils/get-standard-flat-entities-to-create-or-throw.util'; @@ -35,7 +35,7 @@ const CALL_RECORDING_REQUEST_STATUS_FIELD_NAME = 'recordingRequestStatus'; description: 'Create the CallRecording recordingRequestStatus metadata in existing workspaces', }) -export class SyncCallRecordingRequestStatusCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class SyncCallRecordingRequestStatusCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000066000-drop-calendar-event-recording-preference.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000066000-drop-calendar-event-recording-preference.command.ts index ee376d52ec..d1a949cf1b 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000066000-drop-calendar-event-recording-preference.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-14/2-14-workspace-command-1799000066000-drop-calendar-event-recording-preference.command.ts @@ -1,6 +1,6 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -18,7 +18,7 @@ const CALENDAR_EVENT_RECORDING_PREFERENCE_FIELD_UNIVERSAL_IDENTIFIER = name: 'upgrade:2-14:drop-calendar-event-recording-preference', description: 'Drop the CalendarEvent recordingPreference field metadata', }) -export class DropCalendarEventRecordingPreferenceCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class DropCalendarEventRecordingPreferenceCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-15/2-15-workspace-command-1800000001000-migrate-manual-trigger-variables-to-payload.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-15/2-15-workspace-command-1800000001000-migrate-manual-trigger-variables-to-payload.command.ts index cc66b2a5b7..c02d974aad 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-15/2-15-workspace-command-1800000001000-migrate-manual-trigger-variables-to-payload.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-15/2-15-workspace-command-1800000001000-migrate-manual-trigger-variables-to-payload.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { rewriteTriggerVariablesToPayload } from 'src/database/commands/upgrade-version-command/2-15/utils/rewrite-trigger-variables-to-payload.util'; @@ -20,7 +20,7 @@ import { WorkflowTriggerType } from 'src/modules/workflow/workflow-trigger/types description: 'Rewrite saved {{trigger.}} references to {{trigger.payload.}} for manual record triggers', }) -export class MigrateManualTriggerVariablesToPayloadCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class MigrateManualTriggerVariablesToPayloadCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-15/2-15-workspace-command-1800000002000-sync-calendar-event-record-page.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-15/2-15-workspace-command-1800000002000-sync-calendar-event-record-page.command.ts index ac0d31e261..0398ef5b3d 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-15/2-15-workspace-command-1800000002000-sync-calendar-event-record-page.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-15/2-15-workspace-command-1800000002000-sync-calendar-event-record-page.command.ts @@ -6,7 +6,7 @@ import { } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { getStandardFlatEntitiesToCreateOrThrow } from 'src/database/commands/upgrade-version-command/2-10/utils/get-standard-flat-entities-to-create-or-throw.util'; @@ -78,7 +78,7 @@ const CALENDAR_EVENT_CALL_RECORDINGS_FIELD_UNIVERSAL_IDENTIFIER = description: 'Create the CalendarEvent record page layout and fields view in existing workspaces', }) -export class SyncCalendarEventRecordPageCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class SyncCalendarEventRecordPageCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/2-16-workspace-command-1799100000000-backfill-search-field-metadata.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/2-16-workspace-command-1799100000000-backfill-search-field-metadata.command.ts index 48b88daf5f..e414063e7b 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/2-16-workspace-command-1799100000000-backfill-search-field-metadata.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/2-16-workspace-command-1799100000000-backfill-search-field-metadata.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { buildSearchFieldMetadataBackfillOperations } from 'src/database/commands/upgrade-version-command/2-16/utils/build-search-field-metadata-backfill-operations.util'; @@ -17,7 +17,7 @@ import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspa description: 'Backfill searchFieldMetadata rows for every object whose searchVector indexes a meaningful field (not only the globally searchable ones). Standard objects mirror their SEARCH_FIELDS_FOR_* set; custom objects get their label-identifier field. Idempotent: existing rows are skipped.', }) -export class BackfillSearchFieldMetadataCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillSearchFieldMetadataCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/2-16-workspace-command-1799100001000-sync-call-recording-status.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/2-16-workspace-command-1799100001000-sync-call-recording-status.command.ts index 24e4b38d61..5490b82cac 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/2-16-workspace-command-1799100001000-sync-call-recording-status.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-16/2-16-workspace-command-1799100001000-sync-call-recording-status.command.ts @@ -4,7 +4,7 @@ import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -26,7 +26,7 @@ const FAILED_STATUS = 'FAILED'; description: 'Sync CallRecording status metadata from FAILED_UNKNOWN to FAILED in existing workspaces', }) -export class SyncCallRecordingStatusCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class SyncCallRecordingStatusCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000000000-sync-call-recording-navigation-command-menu-item-availability-expression.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000000000-sync-call-recording-navigation-command-menu-item-availability-expression.command.ts index 81a16dbcc3..8984ded60a 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000000000-sync-call-recording-navigation-command-menu-item-availability-expression.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000000000-sync-call-recording-navigation-command-menu-item-availability-expression.command.ts @@ -1,6 +1,6 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { buildCallRecordingNavigationCommandMenuItemAvailabilityExpressionSyncOperations } from 'src/database/commands/upgrade-version-command/2-17/utils/build-call-recording-navigation-command-menu-item-availability-expression-sync-operations.util'; @@ -15,7 +15,7 @@ import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspa description: 'Remove the retired call recording feature-flag gate from existing CallRecording navigation command menu items', }) -export class SyncCallRecordingNavigationCommandMenuItemAvailabilityExpressionCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class SyncCallRecordingNavigationCommandMenuItemAvailabilityExpressionCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000001000-add-reply-to-message-participant-role-option.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000001000-add-reply-to-message-participant-role-option.command.ts index 4436108fa1..532ce3a275 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000001000-add-reply-to-message-participant-role-option.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000001000-add-reply-to-message-participant-role-option.command.ts @@ -1,6 +1,6 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { buildReplyToMessageParticipantRoleOptionSyncOperations } from 'src/database/commands/upgrade-version-command/2-17/utils/build-reply-to-message-participant-role-option-sync-operations.util'; @@ -15,7 +15,7 @@ import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspa description: 'Add the Reply To option to the messageParticipant role field in existing workspaces', }) -export class AddReplyToMessageParticipantRoleOptionCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddReplyToMessageParticipantRoleOptionCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000010000-add-workspace-member-job-title-field.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000010000-add-workspace-member-job-title-field.command.ts index 11fcf712c6..cb9e17d182 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000010000-add-workspace-member-job-title-field.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-17/2-17-workspace-command-1801000010000-add-workspace-member-job-title-field.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -26,7 +26,7 @@ const JOB_TITLE_FIELD_UNIVERSAL_IDENTIFIER = description: 'Add jobTitle text field to the workspaceMember standard object for existing workspaces. Captured during onboarding to describe how a member appears to teammates and agents.', }) -export class AddWorkspaceMemberJobTitleFieldCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddWorkspaceMemberJobTitleFieldCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1799200000000-normalize-legacy-index-names.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1799200000000-normalize-legacy-index-names.command.ts index 5441fdcaa5..389d92bd4d 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1799200000000-normalize-legacy-index-names.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1799200000000-normalize-legacy-index-names.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; import { type QueryRunner } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { areIndexDefinitionsEquivalent } from 'src/database/commands/upgrade-version-command/2-18/utils/are-index-definitions-equivalent.util'; @@ -33,7 +33,7 @@ import { description: 'Rename indexes whose stored name predates the v2 deterministic naming convention to their recomputed name, and drop redundant duplicates.', }) -export class NormalizeLegacyIndexNamesCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class NormalizeLegacyIndexNamesCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1799200001000-recompute-search-vectors.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1799200001000-recompute-search-vectors.command.ts index 3099400d74..a230a2301e 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1799200001000-recompute-search-vectors.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1799200001000-recompute-search-vectors.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -18,7 +18,7 @@ import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/wo description: 'Recompute every TS_VECTOR (searchVector) column from its searchFieldMetadata rows, recreate its GIN index, and clear the deprecated cached TS_VECTOR settings. Idempotent.', }) -export class RecomputeSearchVectorsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class RecomputeSearchVectorsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1810000005000-add-message-is-draft-field.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1810000005000-add-message-is-draft-field.command.ts index a90a29b296..561b30bbd7 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1810000005000-add-message-is-draft-field.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-18/2-18-workspace-command-1810000005000-add-message-is-draft-field.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -24,7 +24,7 @@ const MESSAGE_IS_DRAFT_FIELD_UNIVERSAL_IDENTIFIER = description: 'Add the Message isDraft field metadata and column to existing workspaces', }) -export class AddMessageIsDraftFieldCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddMessageIsDraftFieldCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1782853718000-backfill-workspace-custom-application-registration.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1782853718000-backfill-workspace-custom-application-registration.command.ts index 9b186cca68..01b73e8d36 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1782853718000-backfill-workspace-custom-application-registration.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1782853718000-backfill-workspace-custom-application-registration.command.ts @@ -4,7 +4,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; @@ -18,7 +18,7 @@ import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/deco description: 'Create a workspace-scoped application registration for each existing workspace Custom application so custom object/field labels become translatable.', }) -export class BackfillWorkspaceCustomApplicationRegistrationCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillWorkspaceCustomApplicationRegistrationCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, @InjectRepository(WorkspaceEntity) diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1783093620000-backfill-system-unique-index-universal-identifier.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1783093620000-backfill-system-unique-index-universal-identifier.command.ts index f4c18d6f34..72e6d7227c 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1783093620000-backfill-system-unique-index-universal-identifier.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1783093620000-backfill-system-unique-index-universal-identifier.command.ts @@ -5,7 +5,7 @@ import { getIndexUniversalIdentifier } from 'twenty-shared/application'; import { isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -26,7 +26,7 @@ import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/works description: 'Backfill the deterministic universal identifier of system unique indexes (the index backing a unique scalar field) so the metadata side-effect engine can own their lifecycle.', }) -export class BackfillSystemUniqueIndexUniversalIdentifierCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillSystemUniqueIndexUniversalIdentifierCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1783100000000-backfill-deterministic-field-universal-identifiers.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1783100000000-backfill-deterministic-field-universal-identifiers.command.ts index 9280939397..7b54af3a10 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1783100000000-backfill-deterministic-field-universal-identifiers.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-19/2-19-workspace-command-1783100000000-backfill-deterministic-field-universal-identifiers.command.ts @@ -8,7 +8,7 @@ import { capitalize, isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; import { v5 } from 'uuid'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; @@ -93,7 +93,7 @@ const isMorphOrRelationFieldMetadataType = (type: FieldMetadataType) => description: 'Recompute the universal identifier of auto-provisioned field metadata (system fields and default relation fields) to the deterministic getFieldUniversalIdentifier derivation.', }) -export class BackfillDeterministicFieldUniversalIdentifiersCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillDeterministicFieldUniversalIdentifiersCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-2/2-2-workspace-command-1786000000000-set-calendar-event-description-displayed-max-rows.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-2/2-2-workspace-command-1786000000000-set-calendar-event-description-displayed-max-rows.command.ts index 706dbc563e..1b42cc6232 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-2/2-2-workspace-command-1786000000000-set-calendar-event-description-displayed-max-rows.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-2/2-2-workspace-command-1786000000000-set-calendar-event-description-displayed-max-rows.command.ts @@ -5,7 +5,7 @@ import { type FieldMetadataSettings, } from 'twenty-shared/types'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -23,7 +23,7 @@ const DISPLAYED_MAX_ROWS = 99; description: 'Set displayedMaxRows setting on calendarEvent.description field', }) -export class SetCalendarEventDescriptionDisplayedMaxRowsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class SetCalendarEventDescriptionDisplayedMaxRowsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783499671542-backfill-actor-source-enum-values.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783499671542-backfill-actor-source-enum-values.command.ts index 936ff17a87..c57227dc93 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783499671542-backfill-actor-source-enum-values.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783499671542-backfill-actor-source-enum-values.command.ts @@ -6,7 +6,7 @@ import { import { isDefined } from 'twenty-shared/utils'; import { type QueryRunner } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -102,7 +102,7 @@ export const buildActorSourceEnumBackfillTargets = ({ description: 'Backfill missing AGENT FieldActorSource values into the Postgres enums backing ACTOR fields (createdBy/updatedBy) of existing workspaces.', }) -export class BackfillActorSourceEnumValuesCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillActorSourceEnumValuesCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783525261000-add-message-campaign-stat-fields.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783525261000-add-message-campaign-stat-fields.command.ts index 86395b0fc2..5e6e8830df 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783525261000-add-message-campaign-stat-fields.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783525261000-add-message-campaign-stat-fields.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -43,7 +43,7 @@ const CAMPAIGN_VIEW_FIELD_UNIVERSAL_IDENTIFIERS = Object.values( description: 'Add the MessageCampaign delivery-stat fields (sent/failed/bounced/complained) and their view columns on existing workspaces', }) -export class AddMessageCampaignStatFieldsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddMessageCampaignStatFieldsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783525261001-create-message-list-view.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783525261001-create-message-list-view.command.ts index 9d1622f360..1ec437b5cb 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783525261001-create-message-list-view.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783525261001-create-message-list-view.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -32,7 +32,7 @@ const LIST_VIEW_FIELD_UNIVERSAL_IDENTIFIERS = Object.values( description: 'Create the MessageList standard view and its columns on existing workspaces', }) -export class CreateMessageListViewCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class CreateMessageListViewCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783526282685-backfill-workflow-version-to-core.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783526282685-backfill-workflow-version-to-core.command.ts index d2ddf51fb0..512e0915a8 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783526282685-backfill-workflow-version-to-core.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783526282685-backfill-workflow-version-to-core.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { EntityMetadataNotFoundError } from 'typeorm/error/EntityMetadataNotFoundError'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -16,7 +16,7 @@ import { type WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/common description: 'Copy each workspace workflowVersion (trigger, steps, status, workflowId) into the core workflowVersion table, preserving ids', }) -export class BackfillWorkflowVersionToCoreCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillWorkflowVersionToCoreCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458169-reconcile-search-vector-gin-index-universal-identifier.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458169-reconcile-search-vector-gin-index-universal-identifier.command.ts index 2e907e4af1..67ecd66a8a 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458169-reconcile-search-vector-gin-index-universal-identifier.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458169-reconcile-search-vector-gin-index-universal-identifier.command.ts @@ -4,7 +4,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { buildSearchVectorGinIndexBackfillOperations } from 'src/database/commands/upgrade-version-command/2-20/utils/build-search-vector-gin-index-backfill-operations.util'; @@ -37,7 +37,7 @@ type SearchVectorGinIndexReconciliationOperations = { description: 'Converge every searchVector GIN index universal identifier to its deterministic derivation (re-own, all applications) and create the missing GIN index for installed-app objects (backfill). Idempotent, re-own runs before backfill.', }) -export class ReconcileSearchVectorGinIndexUniversalIdentifierCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class ReconcileSearchVectorGinIndexUniversalIdentifierCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458170-reconcile-search-field-metadata.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458170-reconcile-search-field-metadata.command.ts index f043bf2cbf..feb0f47cd5 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458170-reconcile-search-field-metadata.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458170-reconcile-search-field-metadata.command.ts @@ -4,7 +4,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { buildSearchFieldMetadataBackfillOperations } from 'src/database/commands/upgrade-version-command/2-20/utils/build-search-field-metadata-backfill-operations.util'; @@ -37,7 +37,7 @@ type SearchFieldMetadataReconciliationOperations = { description: 'Converge every searchFieldMetadata universal identifier to its deterministic derivation (re-own, all applications) and create the missing searchFieldMetadata row for installed-app searchable objects (backfill). Idempotent, re-own runs before backfill to avoid a unique-identifier collision.', }) -export class ReconcileSearchFieldMetadataCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class ReconcileSearchFieldMetadataCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458171-rebuild-installed-app-search-vectors.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458171-rebuild-installed-app-search-vectors.command.ts index e9b74a5aea..eb0e43be59 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458171-rebuild-installed-app-search-vectors.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-20/2-20-workspace-command-1783529458171-rebuild-installed-app-search-vectors.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -19,7 +19,7 @@ import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/wo description: 'Rebuild the searchVector column of every installed-app TS_VECTOR field from its searchFieldMetadata rows, now that the GIN index and searchFieldMetadata rows exist (commands 1 and 2). Idempotent.', }) -export class RebuildInstalledAppSearchVectorsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class RebuildInstalledAppSearchVectorsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-21/2-21-workspace-command-1783925862946-backfill-system-field-is-system-side-effect.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-21/2-21-workspace-command-1783925862946-backfill-system-field-is-system-side-effect.command.ts index 73b1db68d5..581d710b8e 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-21/2-21-workspace-command-1783925862946-backfill-system-field-is-system-side-effect.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-21/2-21-workspace-command-1783925862946-backfill-system-field-is-system-side-effect.command.ts @@ -5,7 +5,7 @@ import { getFieldUniversalIdentifier } from 'twenty-shared/application'; import { isDefined } from 'twenty-shared/utils'; import { In, Repository } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; @@ -34,7 +34,7 @@ const SYSTEM_FIELD_NAMES = new Set([ description: 'Flag existing system fields (id, createdAt, updatedAt, deletedAt, createdBy, updatedBy, position, searchVector) as isSystemSideEffect: true so manifest sync deletion inference excludes them.', }) -export class BackfillSystemFieldIsSystemSideEffectCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillSystemFieldIsSystemSideEffectCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-instance-command-slow-1784106205000-add-created-workspace-activation-status.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-instance-command-slow-1784106205000-add-created-workspace-activation-status.ts new file mode 100644 index 0000000000..eed1561556 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-instance-command-slow-1784106205000-add-created-workspace-activation-status.ts @@ -0,0 +1,76 @@ +import { DataSource, QueryRunner } from 'typeorm'; + +import { RegisteredInstanceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-instance-command.decorator'; +import { SlowInstanceCommand } from 'src/engine/core-modules/upgrade/interfaces/slow-instance-command.interface'; + +@RegisteredInstanceCommand('2.22.0', 1784106205000, { type: 'slow' }) +export class AddCreatedWorkspaceActivationStatusSlowInstanceCommand + implements SlowInstanceCommand +{ + async runDataMigration(_dataSource: DataSource): Promise { + } + + public async up(queryRunner: QueryRunner): Promise { + await this.swapActivationStatusEnum(queryRunner, { + enumValues: + "'ONGOING_CREATION', 'PENDING_CREATION', 'CREATED', 'ACTIVE', 'INACTIVE', 'SUSPENDED'", + castExpression: '"activationStatus"::"text"', + }); + } + + public async down(queryRunner: QueryRunner): Promise { + await this.swapActivationStatusEnum(queryRunner, { + enumValues: + "'ONGOING_CREATION', 'PENDING_CREATION', 'ACTIVE', 'INACTIVE', 'SUSPENDED'", + castExpression: `CASE WHEN "activationStatus"::"text" = 'CREATED' THEN 'ACTIVE' ELSE "activationStatus"::"text" END`, + }); + } + + private async swapActivationStatusEnum( + queryRunner: QueryRunner, + { + enumValues, + castExpression, + }: { enumValues: string; castExpression: string }, + ): Promise { + const checkConstraints: { conname: string; definition: string }[] = + await queryRunner.query( + `SELECT conname, pg_get_constraintdef(oid) AS definition + FROM pg_constraint + WHERE conrelid = 'core.workspace'::regclass + AND contype = 'c' + AND pg_get_constraintdef(oid) ILIKE '%activationStatus%'`, + ); + + for (const { conname } of checkConstraints) { + await queryRunner.query( + `ALTER TABLE "core"."workspace" DROP CONSTRAINT "${conname}"`, + ); + } + + await queryRunner.query( + `ALTER TYPE "core"."workspace_activationStatus_enum" RENAME TO "workspace_activationStatus_enum_old"`, + ); + await queryRunner.query( + `CREATE TYPE "core"."workspace_activationStatus_enum" AS ENUM(${enumValues})`, + ); + await queryRunner.query( + `ALTER TABLE "core"."workspace" ALTER COLUMN "activationStatus" DROP DEFAULT`, + ); + await queryRunner.query( + `ALTER TABLE "core"."workspace" ALTER COLUMN "activationStatus" TYPE "core"."workspace_activationStatus_enum" USING (${castExpression})::"core"."workspace_activationStatus_enum"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."workspace" ALTER COLUMN "activationStatus" SET DEFAULT 'INACTIVE'`, + ); + await queryRunner.query( + `DROP TYPE "core"."workspace_activationStatus_enum_old"`, + ); + + for (const { conname, definition } of checkConstraints) { + await queryRunner.query( + `ALTER TABLE "core"."workspace" ADD CONSTRAINT "${conname}" ${definition}`, + ); + } + } +} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-workspace-command-1783959648000-backfill-company-person-image-identifier-field-metadata-id.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-workspace-command-1783959648000-backfill-company-person-image-identifier-field-metadata-id.command.ts index f67e291738..da08a04c62 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-workspace-command-1783959648000-backfill-company-person-image-identifier-field-metadata-id.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-workspace-command-1783959648000-backfill-company-person-image-identifier-field-metadata-id.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -39,7 +39,7 @@ const IMAGE_IDENTIFIER_BACKFILL_TARGETS = [ description: 'Backfill imageIdentifierFieldMetadataId on company (domainName) and person (avatarFile) for existing workspaces.', }) -export class BackfillCompanyPersonImageIdentifierFieldMetadataIdCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillCompanyPersonImageIdentifierFieldMetadataIdCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-workspace-command-1783960128000-migrate-person-avatar-url-to-avatar-file.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-workspace-command-1783960128000-migrate-person-avatar-url-to-avatar-file.command.ts index 4bc2de4e24..6ba12cd5a4 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-workspace-command-1783960128000-migrate-person-avatar-url-to-avatar-file.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-22/2-22-workspace-command-1783960128000-migrate-person-avatar-url-to-avatar-file.command.ts @@ -4,7 +4,7 @@ import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined, isNonEmptyArray } from 'twenty-shared/utils'; import { IsNull, MoreThan, Not } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { type FileWithSignedUrlDTO } from 'src/engine/core-modules/file/dtos/file-with-sign-url.dto'; @@ -28,7 +28,7 @@ const MIN_UUID = '00000000-0000-0000-0000-000000000000'; description: 'Migrate legacy person.avatarUrl (external image URL) into the avatarFile FILES field for existing workspaces.', }) -export class MigratePersonAvatarUrlToAvatarFileCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class MigratePersonAvatarUrlToAvatarFileCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777400000000-drop-message-direction-field.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777400000000-drop-message-direction-field.command.ts index f43ed0075c..76db57885b 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777400000000-drop-message-direction-field.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777400000000-drop-message-direction-field.command.ts @@ -1,6 +1,6 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -19,7 +19,7 @@ const MESSAGE_DIRECTION_FIELD_UNIVERSAL_IDENTIFIER = description: 'Drop the leftover message.direction field metadata and its workspace column', }) -export class DropMessageDirectionFieldCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class DropMessageDirectionFieldCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777920000000-backfill-image-identifier-field-metadata-id.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777920000000-backfill-image-identifier-field-metadata-id.command.ts index c739b6e914..a39a6f7273 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777920000000-backfill-image-identifier-field-metadata-id.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1777920000000-backfill-image-identifier-field-metadata-id.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -25,7 +25,7 @@ const AVATAR_URL_FIELD_UNIVERSAL_IDENTIFIER = description: 'Backfill imageIdentifierFieldMetadataId on workspaceMember for workspaces where it was never set.', }) -export class BackfillImageIdentifierFieldMetadataIdCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillImageIdentifierFieldMetadataIdCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1798000000000-delete-gauge-widgets.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1798000000000-delete-gauge-widgets.command.ts index 1d1923196d..a08795777c 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1798000000000-delete-gauge-widgets.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-3/2-3-workspace-command-1798000000000-delete-gauge-widgets.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -15,7 +15,7 @@ import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspa description: 'Delete all GAUGE_CHART page layout widgets — gauge support has been removed', }) -export class DeleteGaugeWidgetsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class DeleteGaugeWidgetsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-4/2-4-workspace-command-1797000001000-migrate-to-billing-v2.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-4/2-4-workspace-command-1797000001000-migrate-to-billing-v2.command.ts index 1092cc2909..df3558198e 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-4/2-4-workspace-command-1797000001000-migrate-to-billing-v2.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-4/2-4-workspace-command-1797000001000-migrate-to-billing-v2.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -13,7 +13,7 @@ import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/deco description: 'No-op: all workspaces are now on the resource-credit billing model', }) -export class MigrateToBillingV2Command extends ActiveOrSuspendedWorkspaceCommandRunner { +export class MigrateToBillingV2Command extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, ) { diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-5/2-5-workspace-command-1778000000000-rebuild-unique-phone-indexes.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-5/2-5-workspace-command-1778000000000-rebuild-unique-phone-indexes.command.ts index c0ad1778e7..78acc626a8 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-5/2-5-workspace-command-1778000000000-rebuild-unique-phone-indexes.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-5/2-5-workspace-command-1778000000000-rebuild-unique-phone-indexes.command.ts @@ -3,7 +3,7 @@ import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { isNonEmptyString } from '@sniptt/guards'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -28,7 +28,7 @@ const LEGACY_NON_EMPTY_PARTIAL_INDEX_PATTERN = /^"[a-zA-Z][a-zA-Z0-9]*" != ''$/; description: 'Rebuild unique phone field indexes to include the phone calling code column.', }) -export class RebuildUniquePhoneIndexesCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class RebuildUniquePhoneIndexesCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-5/2-5-workspace-command-1778000001000-normalize-composite-field-defaults.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-5/2-5-workspace-command-1778000001000-normalize-composite-field-defaults.command.ts index 374816bea7..43b330c74f 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-5/2-5-workspace-command-1778000001000-normalize-composite-field-defaults.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-5/2-5-workspace-command-1778000001000-normalize-composite-field-defaults.command.ts @@ -5,7 +5,7 @@ import { } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -25,7 +25,7 @@ import { CompositeFieldMetadataType } from 'src/engine/metadata-modules/field-me description: 'Normalize composite field default values: remove empty-string values from metadata and backfill workspace data with NULL.', }) -export class NormalizeCompositeFieldDefaultsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class NormalizeCompositeFieldDefaultsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000020000-sync-command-menu-item-availability-expressions.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000020000-sync-command-menu-item-availability-expressions.command.ts index a2e9209731..f52b1d4068 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000020000-sync-command-menu-item-availability-expressions.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000020000-sync-command-menu-item-availability-expressions.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -16,7 +16,7 @@ import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspa description: 'Re-sync conditionalAvailabilityExpression on all standard command menu items in existing workspaces (heals drift between source-of-truth constant and workspace DB)', }) -export class SyncCommandMenuItemAvailabilityExpressionsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class SyncCommandMenuItemAvailabilityExpressionsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000030000-drop-favorite-objects.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000030000-drop-favorite-objects.command.ts index fa5ef5c081..2fd3cd4540 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000030000-drop-favorite-objects.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000030000-drop-favorite-objects.command.ts @@ -2,7 +2,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -41,7 +41,7 @@ const LEGACY_FAVORITE_OBJECTS: Array<{ description: 'Drop leftover favorite and favoriteFolder object metadata and workspace tables (data was migrated to navigationMenuItem in 1.17/1.18)', }) -export class DropFavoriteObjectsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class DropFavoriteObjectsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000040000-drop-connected-account-standard-object.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000040000-drop-connected-account-standard-object.command.ts index 6450bfa6fe..53636076fc 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000040000-drop-connected-account-standard-object.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-7/2-7-workspace-command-1798000040000-drop-connected-account-standard-object.command.ts @@ -1,6 +1,6 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -29,7 +29,7 @@ const CALENDAR_CHANNEL_CONNECTED_ACCOUNT_FIELD_UNIVERSAL_IDENTIFIER = description: 'Drop the connectedAccount standard object from workspace schemas (moved to core metadata)', }) -export class DropConnectedAccountStandardObjectCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class DropConnectedAccountStandardObjectCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798000050000-drop-channel-standard-objects.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798000050000-drop-channel-standard-objects.command.ts index 26f0cd4a62..b70c1eeb51 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798000050000-drop-channel-standard-objects.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798000050000-drop-channel-standard-objects.command.ts @@ -1,6 +1,6 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -31,7 +31,7 @@ const OBJECT_UNIVERSAL_IDENTIFIERS = [ description: 'Drop calendarChannel, messageChannel, messageFolder standard objects from workspace schemas (moved to core metadata)', }) -export class DropChannelStandardObjectsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class DropChannelStandardObjectsCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100000000-backfill-relation-join-column-indexes.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100000000-backfill-relation-join-column-indexes.command.ts index c95ea75740..41f9ad1c72 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100000000-backfill-relation-join-column-indexes.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100000000-backfill-relation-join-column-indexes.command.ts @@ -3,7 +3,7 @@ import { DEFAULT_RELATIONS_OBJECTS_STANDARD_IDS } from 'twenty-shared/metadata'; import { RelationType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -28,7 +28,7 @@ const POLYMORPHIC_STANDARD_OBJECT_NAMES_SINGULAR: ReadonlySet = new Set( description: 'Backfill missing BTREE indexes on targetId join columns added to polymorphic standard objects (timelineActivity, attachment, noteTarget, taskTarget) when custom objects were created before the auto-index fix. Indexes are created with CONCURRENTLY so writes are not blocked.', }) -export class BackfillRelationJoinColumnIndexesCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillRelationJoinColumnIndexesCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100010000-gate-default-command-menu-items-by-permission-flag.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100010000-gate-default-command-menu-items-by-permission-flag.command.ts index 6b5e9f4a92..d13b90ad42 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100010000-gate-default-command-menu-items-by-permission-flag.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100010000-gate-default-command-menu-items-by-permission-flag.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -41,7 +41,7 @@ const UNIVERSAL_IDENTIFIERS_TO_FIX = new Set([ description: 'Gate default command menu items (Ask AI, settings navigation, compose email) behind their relevant permission flags so members without permission no longer see them', }) -export class GateDefaultCommandMenuItemsByPermissionFlagCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class GateDefaultCommandMenuItemsByPermissionFlagCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100020000-restore-channel-association-scalar-field-metadata.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100020000-restore-channel-association-scalar-field-metadata.command.ts index bd4f9cf845..9d0a59af7b 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100020000-restore-channel-association-scalar-field-metadata.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-8/2-8-workspace-command-1798100020000-restore-channel-association-scalar-field-metadata.command.ts @@ -7,7 +7,7 @@ import { Repository } from 'typeorm'; import { type QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity'; import { v4 as uuidv4 } from 'uuid'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -76,7 +76,7 @@ const SCALAR_FIELDS_TO_RESTORE: ScalarFieldToRestore[] = [ description: 'Re-register the calendarChannelId/messageChannelId/messageFolderId scalar field metadata on the surviving association objects, over their already-existing physical columns, for workspaces where 2-8 drop-channel-standard-objects cascade-removed them', }) -export class RestoreChannelAssociationScalarFieldMetadataCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class RestoreChannelAssociationScalarFieldMetadataCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000000000-migrate-ai-model-preferences.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000000000-migrate-ai-model-preferences.command.ts index deb106e013..c05361d39f 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000000000-migrate-ai-model-preferences.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000000000-migrate-ai-model-preferences.command.ts @@ -4,7 +4,7 @@ import { Command } from 'nest-commander'; import { IsNull, Repository } from 'typeorm'; import { isArray, isDefined } from 'class-validator'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { @@ -34,7 +34,7 @@ const PREFERENCE_KEY_MAP = { description: 'Migrate AI_MODEL_PREFERENCES config var to the four individual AI_MODELS_DEFAULT_* vars, per workspace', }) -export class MigrateAiModelPreferencesCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class MigrateAiModelPreferencesCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, @InjectRepository(KeyValuePairEntity) diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000030000-backfill-fields-widget-new-field-default-visibility.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000030000-backfill-fields-widget-new-field-default-visibility.command.ts index c92217cd97..96639d2ab6 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000030000-backfill-fields-widget-new-field-default-visibility.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000030000-backfill-fields-widget-new-field-default-visibility.command.ts @@ -1,7 +1,7 @@ import { Command } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { RegisteredWorkspaceCommand } from 'src/engine/core-modules/upgrade/decorators/registered-workspace-command.decorator'; @@ -17,7 +17,7 @@ import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspa description: 'Backfill newFieldDefaultVisibility to true on FIELDS page layout widgets where it is null', }) -export class BackfillFieldsWidgetNewFieldDefaultVisibilityCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BackfillFieldsWidgetNewFieldDefaultVisibilityCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly workspaceCacheService: WorkspaceCacheService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000035000-add-workflow-run-step-logs-field.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000035000-add-workflow-run-step-logs-field.command.ts index b1c8d0011a..841d73908b 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000035000-add-workflow-run-step-logs-field.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/2-9/2-9-workspace-command-1799000035000-add-workflow-run-step-logs-field.command.ts @@ -3,7 +3,7 @@ import { STANDARD_OBJECTS } from 'twenty-shared/metadata'; import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { ApplicationService } from 'src/engine/core-modules/application/application.service'; @@ -27,7 +27,7 @@ const STEP_LOGS_FIELD_UNIVERSAL_IDENTIFIER = description: 'Add stepLogs JSONB field to the workflowRun standard object for existing workspaces. Per-step observability payload (token usage, tool calls, log entries) is written here.', }) -export class AddWorkflowRunStepLogsFieldCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class AddWorkflowRunStepLogsFieldCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly applicationService: ApplicationService, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/instance-commands.constant.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/instance-commands.constant.ts index 46d0e5547f..2b57c1fe8a 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/instance-commands.constant.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/instance-commands.constant.ts @@ -111,6 +111,7 @@ import { AddWorkflowVersionSyncableColumnsFastInstanceCommand } from './2-20/2-2 import { BackfillWorkspaceDatabaseSchemaSlowInstanceCommand } from './2-21/2-21-instance-command-slow-1783934147089-backfill-workspace-database-schema'; import { AddLogoFileIdToApplicationRegistrationFastInstanceCommand } from './2-21/2-21-instance-command-fast-1783945979243-add-logo-file-id-to-application-registration'; import { AddCalendarEndFieldMetadataIdToViewFastInstanceCommand } from 'src/database/commands/upgrade-version-command/2-22/2-22-instance-command-fast-1783956795000-add-calendar-end-field-metadata-id-to-view'; +import { AddCreatedWorkspaceActivationStatusSlowInstanceCommand } from './2-22/2-22-instance-command-slow-1784106205000-add-created-workspace-activation-status'; export const INSTANCE_COMMANDS = [ AddViewFieldGroupIdIndexOnViewFieldFastInstanceCommand, @@ -224,4 +225,5 @@ export const INSTANCE_COMMANDS = [ BackfillWorkspaceDatabaseSchemaSlowInstanceCommand, AddLogoFileIdToApplicationRegistrationFastInstanceCommand, AddCalendarEndFieldMetadataIdToViewFastInstanceCommand, + AddCreatedWorkspaceActivationStatusSlowInstanceCommand, ]; diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts index 3afcd97cec..99734e82a2 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts @@ -63,7 +63,7 @@ export class UpgradeCommand extends CommandRunner { @Option({ flags: '-w, --workspace-id [workspace_id]', description: - 'workspace id. Command runs on all active/suspended workspaces if not provided.', + 'workspace id. Command runs on all provisioned workspaces if not provided.', required: false, }) parseWorkspaceId(val: string, previous?: Set): Set { diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/sign-in-up.service.ts b/packages/twenty-server/src/engine/core-modules/auth/services/sign-in-up.service.ts index 85028e7673..bb1af8024f 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/sign-in-up.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/sign-in-up.service.ts @@ -273,7 +273,12 @@ export class SignInUpService { workspace: WorkspaceEntity, user: ExistingUserOrPartialUserWithPicture, ) { - if (workspace.activationStatus === WorkspaceActivationStatus.ACTIVE) return; + if ( + workspace.activationStatus === WorkspaceActivationStatus.ACTIVE || + workspace.activationStatus === WorkspaceActivationStatus.CREATED + ) { + return; + } if (user.userData.type !== 'existingUser') { throw new AuthException( diff --git a/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.ts b/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.ts index 857e46d6da..e1b1b222fd 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.ts @@ -6,7 +6,7 @@ import { addMilliseconds } from 'date-fns'; import { type Request } from 'express'; import ms from 'ms'; import { assertIsDefinedOrThrow } from 'twenty-shared/utils'; -import { isWorkspaceActiveOrSuspended } from 'twenty-shared/workspace'; +import { isWorkspaceProvisioned } from 'twenty-shared/workspace'; import { Repository } from 'typeorm'; import { @@ -72,7 +72,7 @@ export class AccessTokenService { let workspaceMemberId: string | undefined; - if (isWorkspaceActiveOrSuspended(workspace)) { + if (isWorkspaceProvisioned(workspace)) { const authContext = buildSystemAuthContext(workspaceId); workspaceMemberId = diff --git a/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-subscription.service.ts b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-subscription.service.ts index d520dc962e..26178daabf 100644 --- a/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-subscription.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing-webhook/services/billing-webhook-subscription.service.ts @@ -21,6 +21,7 @@ import { import { BillingCustomerEntity } from 'src/engine/core-modules/billing/entities/billing-customer.entity'; import { BillingSubscriptionItemEntity } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; import { BillingSubscriptionEntity } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; +import { WORKSPACE_ACTIVATING_SUBSCRIPTION_STATUSES } from 'src/engine/core-modules/billing/constants/workspace-activating-subscription-statuses.constant'; import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billing-subscription-status.enum'; import { BillingWebhookEvent } from 'src/engine/core-modules/billing/enums/billing-webhook-events.enum'; import { BillingUsageCacheService } from 'src/engine/core-modules/billing/services/billing-usage-cache.service'; @@ -161,7 +162,8 @@ export class BillingWebhookSubscriptionService { } } else if ( this.shouldReactivateWorkspace(data) && - workspace.activationStatus === WorkspaceActivationStatus.SUSPENDED + (workspace.activationStatus === WorkspaceActivationStatus.SUSPENDED || + workspace.activationStatus === WorkspaceActivationStatus.CREATED) ) { await this.workspaceService.reactivateWorkspace(workspaceId); @@ -223,12 +225,7 @@ export class BillingWebhookSubscriptionService { ): boolean { const status = data.object.status as SubscriptionStatus; - const activeStatuses = [ - SubscriptionStatus.Active, - SubscriptionStatus.Trialing, - ]; - - return activeStatuses.includes(status); + return WORKSPACE_ACTIVATING_SUBSCRIPTION_STATUSES.includes(status); } async updateBillingSubscriptionItems( diff --git a/packages/twenty-server/src/engine/core-modules/billing/commands/billing-sync-customer-data.command.ts b/packages/twenty-server/src/engine/core-modules/billing/commands/billing-sync-customer-data.command.ts index 66147cf3bd..4772dea2c2 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/commands/billing-sync-customer-data.command.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/commands/billing-sync-customer-data.command.ts @@ -3,9 +3,13 @@ import chalk from 'chalk'; import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; + import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; -import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; +import { + type RunOnWorkspaceArgs, + WorkspaceCommandRunner, +} from 'src/database/commands/command-runners/workspace.command-runner'; import { BillingCustomerEntity } from 'src/engine/core-modules/billing/entities/billing-customer.entity'; import { StripeSubscriptionService } from 'src/engine/core-modules/billing/stripe/services/stripe-subscription.service'; import { InjectWorkspaceScopedRepository } from 'src/engine/twenty-orm/workspace-scoped-repository/inject-workspace-scoped-repository.decorator'; @@ -14,14 +18,17 @@ import { WorkspaceScopedRepository } from 'src/engine/twenty-orm/workspace-scope name: 'billing:sync-customer-data', description: 'Sync customer data from Stripe for all active workspaces', }) -export class BillingSyncCustomerDataCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BillingSyncCustomerDataCommand extends WorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly stripeSubscriptionService: StripeSubscriptionService, @InjectWorkspaceScopedRepository(BillingCustomerEntity) protected readonly billingCustomerRepository: WorkspaceScopedRepository, ) { - super(workspaceIteratorService); + super(workspaceIteratorService, [ + WorkspaceActivationStatus.ACTIVE, + WorkspaceActivationStatus.SUSPENDED, + ]); } override async runOnWorkspace({ diff --git a/packages/twenty-server/src/engine/core-modules/billing/commands/billing-update-subscription-price.command.ts b/packages/twenty-server/src/engine/core-modules/billing/commands/billing-update-subscription-price.command.ts index 4399734515..c5d6cafa3c 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/commands/billing-update-subscription-price.command.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/commands/billing-update-subscription-price.command.ts @@ -3,9 +3,13 @@ import { Command, Option } from 'nest-commander'; import { isDefined } from 'twenty-shared/utils'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; + import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; -import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; +import { + type RunOnWorkspaceArgs, + WorkspaceCommandRunner, +} from 'src/database/commands/command-runners/workspace.command-runner'; import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service'; import { StripeSubscriptionItemService } from 'src/engine/core-modules/billing/stripe/services/stripe-subscription-item.service'; @@ -13,7 +17,7 @@ import { StripeSubscriptionItemService } from 'src/engine/core-modules/billing/s name: 'billing:update-subscription-price', description: 'Update subscription price', }) -export class BillingUpdateSubscriptionPriceCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class BillingUpdateSubscriptionPriceCommand extends WorkspaceCommandRunner { private stripePriceIdToUpdate: string; private newStripePriceId: string; private clearUsage = false; @@ -23,7 +27,10 @@ export class BillingUpdateSubscriptionPriceCommand extends ActiveOrSuspendedWork private readonly billingSubscriptionService: BillingSubscriptionService, private readonly stripeSubscriptionItemService: StripeSubscriptionItemService, ) { - super(workspaceIteratorService); + super(workspaceIteratorService, [ + WorkspaceActivationStatus.ACTIVE, + WorkspaceActivationStatus.SUSPENDED, + ]); } @Option({ diff --git a/packages/twenty-server/src/engine/core-modules/billing/constants/workspace-activating-subscription-statuses.constant.ts b/packages/twenty-server/src/engine/core-modules/billing/constants/workspace-activating-subscription-statuses.constant.ts new file mode 100644 index 0000000000..2492af9568 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/billing/constants/workspace-activating-subscription-statuses.constant.ts @@ -0,0 +1,6 @@ +/* @license Enterprise */ + +import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billing-subscription-status.enum'; + +export const WORKSPACE_ACTIVATING_SUBSCRIPTION_STATUSES: SubscriptionStatus[] = + [SubscriptionStatus.Active, SubscriptionStatus.Trialing]; diff --git a/packages/twenty-server/src/engine/core-modules/billing/services/billing-subscription.service.ts b/packages/twenty-server/src/engine/core-modules/billing/services/billing-subscription.service.ts index ad618af6d7..2bc2fc38c0 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/services/billing-subscription.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/services/billing-subscription.service.ts @@ -5,10 +5,12 @@ import { InjectRepository } from '@nestjs/typeorm'; import { differenceInDays } from 'date-fns'; import { assertIsDefinedOrThrow, isDefined } from 'twenty-shared/utils'; -import { Not, type Repository } from 'typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; +import { Not, Repository } from 'typeorm'; import type Stripe from 'stripe'; +import { CoreEntityCacheService } from 'src/engine/core-entity-cache/services/core-entity-cache.service'; import { transformStripeSubscriptionEventToDatabaseCustomer } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-customer.util'; import { transformStripeSubscriptionEventToDatabaseSubscriptionItem } from 'src/engine/core-modules/billing-webhook/utils/transform-stripe-subscription-event-to-database-subscription-item.util'; import { @@ -25,6 +27,7 @@ import { BillingEntitlementEntity } from 'src/engine/core-modules/billing/entiti import { BillingSubscriptionItemEntity } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; import { BillingSubscriptionEntity } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; import { BillingEntitlementKey } from 'src/engine/core-modules/billing/enums/billing-entitlement-key.enum'; +import { WORKSPACE_ACTIVATING_SUBSCRIPTION_STATUSES } from 'src/engine/core-modules/billing/constants/workspace-activating-subscription-statuses.constant'; import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billing-subscription-status.enum'; import { BillingPlanService } from 'src/engine/core-modules/billing/services/billing-plan.service'; import { BillingPriceService } from 'src/engine/core-modules/billing/services/billing-price.service'; @@ -35,15 +38,19 @@ import { StripeSubscriptionService } from 'src/engine/core-modules/billing/strip import { getPlanKeyFromSubscription } from 'src/engine/core-modules/billing/utils/get-plan-key-from-subscription.util'; import { EnterprisePlanService } from 'src/engine/core-modules/enterprise/services/enterprise-plan.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; -import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { InjectWorkspaceScopedRepository } from 'src/engine/twenty-orm/workspace-scoped-repository/inject-workspace-scoped-repository.decorator'; import { WorkspaceScopedRepository } from 'src/engine/twenty-orm/workspace-scoped-repository/workspace-scoped-repository'; import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; @Injectable() +// oxlint-disable-next-line twenty/inject-workspace-repository export class BillingSubscriptionService { protected readonly logger = new Logger(BillingSubscriptionService.name); constructor( + @InjectRepository(WorkspaceEntity) + private readonly workspaceRepository: Repository, + private readonly coreEntityCacheService: CoreEntityCacheService, private readonly stripeSubscriptionService: StripeSubscriptionService, private readonly billingPriceService: BillingPriceService, private readonly billingPlanService: BillingPlanService, @@ -395,6 +402,30 @@ export class BillingSubscriptionService { `Subscription synced to database: ${subscription.id} for workspace: ${workspaceId}`, ); + if ( + WORKSPACE_ACTIVATING_SUBSCRIPTION_STATUSES.includes( + currentBillingSubscription.status, + ) + ) { + // TODO: drop the ::text cast once the CREATED enum migration has run everywhere (follow-up PR of #22904) + const activationResult = await this.workspaceRepository + .createQueryBuilder() + .update() + .set({ activationStatus: WorkspaceActivationStatus.ACTIVE }) + .where('id = :workspaceId AND "activationStatus"::text = :fromStatus', { + workspaceId, + fromStatus: WorkspaceActivationStatus.CREATED, + }) + .execute(); + + if ((activationResult.affected ?? 0) > 0) { + await this.coreEntityCacheService.invalidate( + 'workspaceEntity', + workspaceId, + ); + } + } + return currentBillingSubscription; } diff --git a/packages/twenty-server/src/engine/core-modules/billing/stripe/services/stripe-subscription.service.ts b/packages/twenty-server/src/engine/core-modules/billing/stripe/services/stripe-subscription.service.ts index d80a205a94..5f5a9729bf 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/stripe/services/stripe-subscription.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/stripe/services/stripe-subscription.service.ts @@ -34,9 +34,7 @@ export class StripeSubscriptionService { limit: 1, }); - return subscription.data[0].customer - ? subscription.data[0].customer - : undefined; + return subscription.data[0]?.customer ?? undefined; } async collectLastInvoice(stripeSubscriptionId: string) { diff --git a/packages/twenty-server/src/engine/core-modules/upgrade/commands/upgrade-status.command.ts b/packages/twenty-server/src/engine/core-modules/upgrade/commands/upgrade-status.command.ts index c1eb5be59a..1a27b25896 100644 --- a/packages/twenty-server/src/engine/core-modules/upgrade/commands/upgrade-status.command.ts +++ b/packages/twenty-server/src/engine/core-modules/upgrade/commands/upgrade-status.command.ts @@ -132,7 +132,7 @@ export class UpgradeStatusCommand extends CommandRunner { const lines: string[] = [chalk.bold.underline('Workspace')]; if (upToDate.length === 0 && behind.length === 0 && failed.length === 0) { - lines.push(chalk.dim(' No active/suspended workspaces found')); + lines.push(chalk.dim(' No provisioned workspaces found')); return lines; } diff --git a/packages/twenty-server/src/engine/core-modules/upgrade/services/instance-command-runner.service.ts b/packages/twenty-server/src/engine/core-modules/upgrade/services/instance-command-runner.service.ts index 27bfa5ba3f..6061a0791b 100644 --- a/packages/twenty-server/src/engine/core-modules/upgrade/services/instance-command-runner.service.ts +++ b/packages/twenty-server/src/engine/core-modules/upgrade/services/instance-command-runner.service.ts @@ -59,7 +59,7 @@ export class InstanceCommandRunnerService { await command.up(queryRunner); const workspaceIds = - await this.workspaceVersionService.getActiveOrSuspendedWorkspaceIds({ + await this.workspaceVersionService.getProvisionedWorkspaceIds({ queryRunner, }); @@ -83,7 +83,7 @@ export class InstanceCommandRunnerService { } const workspaceIds = - await this.workspaceVersionService.getActiveOrSuspendedWorkspaceIds(); + await this.workspaceVersionService.getProvisionedWorkspaceIds(); await this.upgradeMigrationService.recordUpgradeMigration({ name, @@ -149,7 +149,7 @@ export class InstanceCommandRunnerService { this.logger.log(`${name} data migration completed`); } catch (error) { const workspaceIds = - await this.workspaceVersionService.getActiveOrSuspendedWorkspaceIds(); + await this.workspaceVersionService.getProvisionedWorkspaceIds(); await this.upgradeMigrationService.recordUpgradeMigration({ name, diff --git a/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-command-registry.service.ts b/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-command-registry.service.ts index a46b035dc7..818cc918d0 100644 --- a/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-command-registry.service.ts +++ b/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-command-registry.service.ts @@ -1,7 +1,7 @@ import { Injectable, Logger, type OnModuleInit } from '@nestjs/common'; import { DiscoveryService } from '@nestjs/core'; -import { type ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { type ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { type WorkspaceCommandRunner } from 'src/database/commands/command-runners/workspace.command-runner'; import { TWENTY_ALL_VERSIONS, @@ -19,7 +19,7 @@ import { isDefined } from 'twenty-shared/utils'; type WorkspaceCommand = | WorkspaceCommandRunner - | ActiveOrSuspendedWorkspaceCommandRunner; + | ProvisionedWorkspaceCommandRunner; export type RegisteredFastInstanceCommand = { name: string; diff --git a/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-migration.service.ts b/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-migration.service.ts index 697b66ea9b..084706b938 100644 --- a/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-migration.service.ts +++ b/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-migration.service.ts @@ -189,7 +189,7 @@ export class UpgradeMigrationService { // isInitial records are excluded — they represent activation // state, not execution progress. async getLastAttemptedCommandNameOrThrow( - allActiveOrSuspendedWorkspaceIds: string[], + allProvisionedWorkspaceIds: string[], ): Promise<{ name: string; status: UpgradeMigrationStatus; @@ -210,10 +210,10 @@ export class UpgradeMigrationService { )`, ); - if (allActiveOrSuspendedWorkspaceIds.length > 0) { + if (allProvisionedWorkspaceIds.length > 0) { queryBuilder.andWhere( - '(migration."workspaceId" IS NULL OR migration."workspaceId" IN (:...allActiveOrSuspendedWorkspaceIds))', - { allActiveOrSuspendedWorkspaceIds }, + '(migration."workspaceId" IS NULL OR migration."workspaceId" IN (:...allProvisionedWorkspaceIds))', + { allProvisionedWorkspaceIds }, ); } else { queryBuilder.andWhere('migration."workspaceId" IS NULL'); diff --git a/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-sequence-runner.service.ts b/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-sequence-runner.service.ts index 9f12b0fa23..c78c707918 100644 --- a/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-sequence-runner.service.ts +++ b/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-sequence-runner.service.ts @@ -77,19 +77,19 @@ export class UpgradeSequenceRunnerService { sequence: UpgradeStep[]; options: ParsedUpgradeCommandOptions; }): Promise { - const allActiveOrSuspendedWorkspaceIds = - await this.workspaceVersionService.getActiveOrSuspendedWorkspaceIds(); + const allProvisionedWorkspaceIds = + await this.workspaceVersionService.getProvisionedWorkspaceIds(); const startCursor = await this.resolveStartCursor({ sequence, - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, }); let totalSuccesses = 0; let totalFailures = 0; let cursor = startCursor; let workspaceCursors = await this.fetchWorkspaceCursors( - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, ); while (cursor < sequence.length) { @@ -131,7 +131,7 @@ export class UpgradeSequenceRunnerService { await this.runInstanceStep({ instanceStep: step, - skipDataMigration: allActiveOrSuspendedWorkspaceIds.length === 0, + skipDataMigration: allProvisionedWorkspaceIds.length === 0, }); await this.upgradeAwareEntityMetadataAdapter.refresh(); @@ -149,7 +149,7 @@ export class UpgradeSequenceRunnerService { const report = await this.resumeWorkspaceCommandsFromCursors({ workspaceCommandsSegment, workspaceCursors, - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, options, }); @@ -176,7 +176,7 @@ export class UpgradeSequenceRunnerService { cursor += workspaceCommandsSegment.length; workspaceCursors = await this.fetchWorkspaceCursors( - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, ); } @@ -185,14 +185,14 @@ export class UpgradeSequenceRunnerService { private async resolveStartCursor({ sequence, - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, }: { sequence: UpgradeStep[]; - allActiveOrSuspendedWorkspaceIds: string[]; + allProvisionedWorkspaceIds: string[]; }): Promise { const lastAttempted = await this.upgradeMigrationService.getLastAttemptedCommandNameOrThrow( - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, ); const lastAttemptedCursor = @@ -219,7 +219,7 @@ export class UpgradeSequenceRunnerService { await this.validateWorkspaceCursorsAreInWorkspaceSegment({ sequence, - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, workspaceSliceBounds, }); @@ -231,17 +231,17 @@ export class UpgradeSequenceRunnerService { } private async validateWorkspaceCursorsAreInWorkspaceSegment({ - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, sequence, workspaceSliceBounds: { startCursor, endCursor }, }: { sequence: UpgradeStep[]; - allActiveOrSuspendedWorkspaceIds: string[]; + allProvisionedWorkspaceIds: string[]; workspaceSliceBounds: { startCursor: number; endCursor: number }; }): Promise { const workspaceCursors = await this.upgradeMigrationService.getWorkspaceLastAttemptedCommandNameOrThrow( - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, ); const precedingStep = startCursor > 0 ? sequence[startCursor - 1] : undefined; @@ -293,10 +293,10 @@ export class UpgradeSequenceRunnerService { } private async fetchWorkspaceCursors( - allActiveOrSuspendedWorkspaceIds: string[], + allProvisionedWorkspaceIds: string[], ): Promise> { return this.upgradeMigrationService.getWorkspaceLastAttemptedCommandNameOrThrow( - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, ); } @@ -343,16 +343,16 @@ export class UpgradeSequenceRunnerService { private async resumeWorkspaceCommandsFromCursors({ workspaceCommandsSegment, workspaceCursors, - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, options, }: { workspaceCommandsSegment: WorkspaceUpgradeStep[]; workspaceCursors: Map; - allActiveOrSuspendedWorkspaceIds: string[]; + allProvisionedWorkspaceIds: string[]; options: ParsedUpgradeCommandOptions; }): Promise { const workspaceIds = this.deriveWorkspaceIdsToProcess({ - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, options, }); @@ -384,17 +384,17 @@ export class UpgradeSequenceRunnerService { } private deriveWorkspaceIdsToProcess({ - allActiveOrSuspendedWorkspaceIds, + allProvisionedWorkspaceIds, options, }: { - allActiveOrSuspendedWorkspaceIds: string[]; + allProvisionedWorkspaceIds: string[]; options: ParsedUpgradeCommandOptions; }): string[] { if (isDefined(options.workspaceIds) && options.workspaceIds.length > 0) { return options.workspaceIds; } - let workspaceIds = allActiveOrSuspendedWorkspaceIds; + let workspaceIds = allProvisionedWorkspaceIds; if (isDefined(options.startFromWorkspaceId)) { workspaceIds = workspaceIds.filter( diff --git a/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-status.service.ts b/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-status.service.ts index 2aaface676..bc51946c71 100644 --- a/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-status.service.ts +++ b/packages/twenty-server/src/engine/core-modules/upgrade/services/upgrade-status.service.ts @@ -2,7 +2,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { UpgradeHealthEnum } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; -import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; +import { PROVISIONED_WORKSPACE_ACTIVATION_STATUSES } from 'twenty-shared/workspace'; import { InjectRepository } from '@nestjs/typeorm'; import { CoreEntityCacheService } from 'src/engine/core-entity-cache/services/core-entity-cache.service'; @@ -12,6 +12,7 @@ import { UpgradeStatusCacheService } from 'src/engine/core-modules/upgrade/servi import { type UpgradeMigrationStatus } from 'src/engine/core-modules/upgrade/upgrade-migration.entity'; import { extractVersionFromCommandName } from 'src/engine/core-modules/upgrade/utils/extract-version-from-command-name.util'; +import { activationStatusIn } from 'src/engine/core-modules/workspace/utils/activation-status-in.util'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { In, Repository } from 'typeorm'; @@ -102,8 +103,7 @@ export class UpgradeStatusService { async getWorkspaceStatuses( filterWorkspaceIds?: string[], ): Promise { - const workspaces = - await this.loadActiveOrSuspendedWorkspaces(filterWorkspaceIds); + const workspaces = await this.loadProvisionedWorkspaces(filterWorkspaceIds); if (filterWorkspaceIds) { const foundIds = new Set(workspaces.map((workspace) => workspace.id)); @@ -111,7 +111,7 @@ export class UpgradeStatusService { for (const requestedId of filterWorkspaceIds) { if (!foundIds.has(requestedId)) { this.logger.warn( - `Workspace ${requestedId} not found or not active/suspended`, + `Workspace ${requestedId} not found or not provisioned`, ); } } @@ -304,7 +304,7 @@ export class UpgradeStatusService { }; } - private async loadActiveOrSuspendedWorkspaces( + private async loadProvisionedWorkspaces( workspaceIds?: string[], ): Promise[]> { return this.workspaceRepository.find({ @@ -313,10 +313,9 @@ export class UpgradeStatusService { ...(workspaceIds && workspaceIds.length > 0 ? { id: In(workspaceIds) } : {}), - activationStatus: In([ - WorkspaceActivationStatus.ACTIVE, - WorkspaceActivationStatus.SUSPENDED, - ]), + activationStatus: activationStatusIn( + PROVISIONED_WORKSPACE_ACTIVATION_STATUSES, + ), }, order: { id: 'ASC' }, }); diff --git a/packages/twenty-server/src/engine/core-modules/user/services/user.service.spec.ts b/packages/twenty-server/src/engine/core-modules/user/services/user.service.spec.ts index 4fb88bc619..fbad08c5c7 100644 --- a/packages/twenty-server/src/engine/core-modules/user/services/user.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/user/services/user.service.spec.ts @@ -152,9 +152,7 @@ describe('UserService', () => { }); describe('loadWorkspaceMember', () => { - it('returns null when workspace is not active/suspended', async () => { - // isWorkspaceActiveOrSuspendedSpy.mockReturnValue(false); - + it('returns null when workspace is not provisioned', async () => { const res = await service.loadWorkspaceMember( { id: 'u1' } as Pick, { id: 'w1' } as WorkspaceEntity, @@ -194,10 +192,31 @@ describe('UserService', () => { }); expect(res).toEqual({ id: 'wm1', userId: 'u1' }); }); + + it('fetches from workspace member repo when workspace is created', async () => { + jest.spyOn(mockWorkspaceMemberRepo, 'findOne').mockResolvedValue({ + id: 'wm1', + userId: 'u1', + } as WorkspaceMemberWorkspaceEntity); + + jest + .spyOn(globalWorkspaceOrmManager, 'getRepository') + .mockResolvedValue(mockWorkspaceMemberRepo); + + const res = await service.loadWorkspaceMember( + { id: 'u1' } as Pick, + { + id: 'w1', + activationStatus: WorkspaceActivationStatus.CREATED, + } as WorkspaceEntity, + ); + + expect(res).toEqual({ id: 'wm1', userId: 'u1' }); + }); }); describe('loadWorkspaceMembers', () => { - it('returns [] when workspace is not active/suspended', async () => { + it('returns [] when workspace is not provisioned', async () => { const res = await service.loadWorkspaceMembers({ id: 'w1', activationStatus: WorkspaceActivationStatus.INACTIVE, @@ -231,7 +250,7 @@ describe('UserService', () => { }); describe('loadDeletedWorkspaceMembersOnly', () => { - it('returns [] when workspace is not active/suspended', async () => { + it('returns [] when workspace is not provisioned', async () => { const res = await service.loadDeletedWorkspaceMembersOnly({ id: 'w1', activationStatus: WorkspaceActivationStatus.INACTIVE, diff --git a/packages/twenty-server/src/engine/core-modules/user/services/user.service.ts b/packages/twenty-server/src/engine/core-modules/user/services/user.service.ts index a111e102ea..8db2de100a 100644 --- a/packages/twenty-server/src/engine/core-modules/user/services/user.service.ts +++ b/packages/twenty-server/src/engine/core-modules/user/services/user.service.ts @@ -7,7 +7,7 @@ import { isNonEmptyString } from '@sniptt/guards'; import { SOURCE_LOCALE } from 'twenty-shared/translations'; import { assertIsDefinedOrThrow, isDefined } from 'twenty-shared/utils'; import { - isWorkspaceActiveOrSuspended, + isWorkspaceProvisioned, WorkspaceActivationStatus, } from 'twenty-shared/workspace'; import { type QueryRunner, In, IsNull, Not, Repository } from 'typeorm'; @@ -98,7 +98,7 @@ export class UserService { const refreshedWorkspace = await this.refreshWorkspaceIfPendingOrOngoingCreation(workspace); - if (!isWorkspaceActiveOrSuspended(refreshedWorkspace)) { + if (!isWorkspaceProvisioned(refreshedWorkspace)) { return null; } @@ -131,7 +131,7 @@ export class UserService { const refreshedWorkspace = await this.refreshWorkspaceIfPendingOrOngoingCreation(workspace); - if (!isWorkspaceActiveOrSuspended(refreshedWorkspace)) { + if (!isWorkspaceProvisioned(refreshedWorkspace)) { return []; } @@ -218,7 +218,7 @@ export class UserService { workspace: Pick; userIds: string[]; }): Promise { - if (!isWorkspaceActiveOrSuspended(workspace) || userIds.length === 0) { + if (!isWorkspaceProvisioned(workspace) || userIds.length === 0) { return []; } @@ -245,7 +245,7 @@ export class UserService { async loadDeletedWorkspaceMembersOnly( workspace: Pick, ) { - if (!isWorkspaceActiveOrSuspended(workspace)) { + if (!isWorkspaceProvisioned(workspace)) { return []; } diff --git a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts index aa3f03aba4..dc6cdc6c51 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts @@ -366,7 +366,10 @@ export class WorkspaceService { }); if ( - existingWorkspace?.activationStatus === WorkspaceActivationStatus.ACTIVE + existingWorkspace?.activationStatus === + WorkspaceActivationStatus.ACTIVE || + existingWorkspace?.activationStatus === + WorkspaceActivationStatus.CREATED ) { return existingWorkspace; } diff --git a/packages/twenty-server/src/engine/core-modules/workspace/utils/activation-status-in.util.ts b/packages/twenty-server/src/engine/core-modules/workspace/utils/activation-status-in.util.ts new file mode 100644 index 0000000000..c5de1646f6 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/workspace/utils/activation-status-in.util.ts @@ -0,0 +1,18 @@ +import { type WorkspaceActivationStatus } from 'twenty-shared/workspace'; +import { Raw } from 'typeorm'; + +// TODO: drop the ::text cast and use In() once the CREATED enum migration has run everywhere (follow-up PR of #22904) +export const activationStatusIn = (statuses: WorkspaceActivationStatus[]) => + Raw( + (alias) => { + const quotedAlias = alias + .split('.') + .map((aliasPart) => `"${aliasPart.replace(/"/g, '')}"`) + .join('.'); + + return `${quotedAlias}::text IN (:...activationStatusValues)`; + }, + { + activationStatusValues: statuses, + }, + ); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/commands/flat-cache-invalidate.command.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/commands/flat-cache-invalidate.command.ts index 986f79e9dc..52a0edf9f3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/commands/flat-cache-invalidate.command.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/commands/flat-cache-invalidate.command.ts @@ -5,9 +5,9 @@ import { } from 'twenty-shared/metadata'; import { - ActiveOrSuspendedWorkspaceCommandRunner, - type ActiveOrSuspendedWorkspaceCommandOptions, -} from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; + ProvisionedWorkspaceCommandRunner, + type ProvisionedWorkspaceCommandOptions, +} from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type'; @@ -15,7 +15,7 @@ import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-e import { getMetadataRelatedMetadataNames } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-related-metadata-names.util'; import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/services/workspace-migration-runner.service'; -type FlatCacheFlushCommandOptions = ActiveOrSuspendedWorkspaceCommandOptions & { +type FlatCacheFlushCommandOptions = ProvisionedWorkspaceCommandOptions & { metadataName?: string[]; allMetadata?: boolean; }; @@ -25,7 +25,7 @@ type FlatCacheFlushCommandOptions = ActiveOrSuspendedWorkspaceCommandOptions & { description: 'Flush flat entity cache for specific metadata names and workspaces', }) -export class FlatCacheInvalidateCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class FlatCacheInvalidateCommand extends ProvisionedWorkspaceCommandRunner { private flatMapsKeysToFlush: (keyof AllFlatEntityMaps)[] = []; constructor( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-version/services/workspace-version.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-version/services/workspace-version.service.ts index c5bd1874bf..fd4041d4c7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-version/services/workspace-version.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-version/services/workspace-version.service.ts @@ -1,9 +1,10 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; -import { In, MoreThanOrEqual, QueryRunner, Repository } from 'typeorm'; +import { PROVISIONED_WORKSPACE_ACTIVATION_STATUSES } from 'twenty-shared/workspace'; +import { MoreThanOrEqual, QueryRunner, Repository } from 'typeorm'; +import { activationStatusIn } from 'src/engine/core-modules/workspace/utils/activation-status-in.util'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; @Injectable() @@ -13,18 +14,17 @@ export class WorkspaceVersionService { private readonly workspaceRepository: Repository, ) {} - async hasActiveOrSuspendedWorkspaces(): Promise { + async hasProvisionedWorkspaces(): Promise { return this.workspaceRepository.exists({ where: { - activationStatus: In([ - WorkspaceActivationStatus.ACTIVE, - WorkspaceActivationStatus.SUSPENDED, - ]), + activationStatus: activationStatusIn( + PROVISIONED_WORKSPACE_ACTIVATION_STATUSES, + ), }, }); } - async getActiveOrSuspendedWorkspaceIds({ + async getProvisionedWorkspaceIds({ startFromWorkspaceId, workspaceCountLimit, queryRunner, @@ -40,10 +40,9 @@ export class WorkspaceVersionService { const workspaces = await repository.find({ select: ['id'], where: { - activationStatus: In([ - WorkspaceActivationStatus.ACTIVE, - WorkspaceActivationStatus.SUSPENDED, - ]), + activationStatus: activationStatusIn( + PROVISIONED_WORKSPACE_ACTIVATION_STATUSES, + ), ...(startFromWorkspaceId ? { id: MoreThanOrEqual(startFromWorkspaceId) } : {}), diff --git a/packages/twenty-server/src/modules/connected-account/webhook-subscription-manager/commands/create-webhook-subscription-for-connected-account.command.ts b/packages/twenty-server/src/modules/connected-account/webhook-subscription-manager/commands/create-webhook-subscription-for-connected-account.command.ts index 93cc3ede49..b9b28ec36d 100644 --- a/packages/twenty-server/src/modules/connected-account/webhook-subscription-manager/commands/create-webhook-subscription-for-connected-account.command.ts +++ b/packages/twenty-server/src/modules/connected-account/webhook-subscription-manager/commands/create-webhook-subscription-for-connected-account.command.ts @@ -8,7 +8,7 @@ import { } from 'twenty-shared/types'; import { Repository } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; @@ -34,7 +34,7 @@ const WEBHOOK_CAPABLE_PROVIDERS = [ description: 'Enqueue webhook subscription creation for existing Google/Microsoft channels still on polling, staggered to avoid provider rate limiting', }) -export class CreateWebhookSubscriptionForConnectedAccountCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class CreateWebhookSubscriptionForConnectedAccountCommand extends ProvisionedWorkspaceCommandRunner { private enqueueCursorMs = 0; constructor( diff --git a/packages/twenty-server/src/modules/messaging/message-cleaner/commands/messaging-message-clearner-remove-orphans.command.ts b/packages/twenty-server/src/modules/messaging/message-cleaner/commands/messaging-message-clearner-remove-orphans.command.ts index 42f9ae5cda..4dc707acfc 100644 --- a/packages/twenty-server/src/modules/messaging/message-cleaner/commands/messaging-message-clearner-remove-orphans.command.ts +++ b/packages/twenty-server/src/modules/messaging/message-cleaner/commands/messaging-message-clearner-remove-orphans.command.ts @@ -1,6 +1,6 @@ import { Command } from 'nest-commander'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { MessagingMessageCleanerService } from 'src/modules/messaging/message-cleaner/services/messaging-message-cleaner.service'; @@ -9,7 +9,7 @@ import { MessagingMessageCleanerService } from 'src/modules/messaging/message-cl name: 'messaging:message-cleaner-remove-orphans', description: 'Remove orphan message and threads from messaging', }) -export class MessagingMessageCleanerRemoveOrphansCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class MessagingMessageCleanerRemoveOrphansCommand extends ProvisionedWorkspaceCommandRunner { constructor( protected readonly workspaceIteratorService: WorkspaceIteratorService, private readonly messagingMessageCleanerService: MessagingMessageCleanerService, diff --git a/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-run/command/delete-workflow-runs.command.ts b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-run/command/delete-workflow-runs.command.ts index dd2cfc2ccf..40fe2f2143 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-run/command/delete-workflow-runs.command.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-runner/workflow-run/command/delete-workflow-runs.command.ts @@ -1,7 +1,7 @@ import { Command, Option } from 'nest-commander'; import { LessThan } from 'typeorm'; -import { ActiveOrSuspendedWorkspaceCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspace.command-runner'; +import { ProvisionedWorkspaceCommandRunner } from 'src/database/commands/command-runners/provisioned-workspace.command-runner'; import { WorkspaceIteratorService } from 'src/database/commands/command-runners/workspace-iterator.service'; import { type RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspace.command-runner'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; @@ -12,7 +12,7 @@ import { type WorkflowRunWorkspaceEntity } from 'src/modules/workflow/common/sta name: 'workflow:delete-workflow-runs', description: 'Delete all workflow runs', }) -export class DeleteWorkflowRunsCommand extends ActiveOrSuspendedWorkspaceCommandRunner { +export class DeleteWorkflowRunsCommand extends ProvisionedWorkspaceCommandRunner { private createdBeforeDate: string | undefined; constructor( diff --git a/packages/twenty-server/test/integration/upgrade/utils/upgrade-sequence-runner-integration-test.util.ts b/packages/twenty-server/test/integration/upgrade/utils/upgrade-sequence-runner-integration-test.util.ts index e14b1be2aa..75f510d199 100644 --- a/packages/twenty-server/test/integration/upgrade/utils/upgrade-sequence-runner-integration-test.util.ts +++ b/packages/twenty-server/test/integration/upgrade/utils/upgrade-sequence-runner-integration-test.util.ts @@ -200,10 +200,10 @@ export const createUpgradeSequenceRunnerIntegrationTestModule = async () => { { provide: WorkspaceVersionService, useValue: { - getActiveOrSuspendedWorkspaceIds: jest + getProvisionedWorkspaceIds: jest .fn() .mockImplementation(async () => mockActiveWorkspaceIds), - hasActiveOrSuspendedWorkspaces: jest + hasProvisionedWorkspaces: jest .fn() .mockImplementation(async () => mockActiveWorkspaceIds.length > 0), }, diff --git a/packages/twenty-shared/src/workspace/constants/ProvisionedWorkspaceActivationStatuses.ts b/packages/twenty-shared/src/workspace/constants/ProvisionedWorkspaceActivationStatuses.ts new file mode 100644 index 0000000000..2557b73d78 --- /dev/null +++ b/packages/twenty-shared/src/workspace/constants/ProvisionedWorkspaceActivationStatuses.ts @@ -0,0 +1,8 @@ +import { WorkspaceActivationStatus } from '@/workspace/types/WorkspaceActivationStatus'; + +export const PROVISIONED_WORKSPACE_ACTIVATION_STATUSES: WorkspaceActivationStatus[] = + [ + WorkspaceActivationStatus.CREATED, + WorkspaceActivationStatus.ACTIVE, + WorkspaceActivationStatus.SUSPENDED, + ]; diff --git a/packages/twenty-shared/src/workspace/index.ts b/packages/twenty-shared/src/workspace/index.ts index cc47128cd6..40ef95e226 100644 --- a/packages/twenty-shared/src/workspace/index.ts +++ b/packages/twenty-shared/src/workspace/index.ts @@ -7,5 +7,6 @@ * |___/ */ +export { PROVISIONED_WORKSPACE_ACTIVATION_STATUSES } from './constants/ProvisionedWorkspaceActivationStatuses'; export { WorkspaceActivationStatus } from './types/WorkspaceActivationStatus'; -export { isWorkspaceActiveOrSuspended } from './utils/isWorkspaceActiveOrSuspended'; +export { isWorkspaceProvisioned } from './utils/isWorkspaceProvisioned'; diff --git a/packages/twenty-shared/src/workspace/types/WorkspaceActivationStatus.ts b/packages/twenty-shared/src/workspace/types/WorkspaceActivationStatus.ts index 1b76a41f84..8356852e27 100644 --- a/packages/twenty-shared/src/workspace/types/WorkspaceActivationStatus.ts +++ b/packages/twenty-shared/src/workspace/types/WorkspaceActivationStatus.ts @@ -1,6 +1,7 @@ export enum WorkspaceActivationStatus { ONGOING_CREATION = 'ONGOING_CREATION', PENDING_CREATION = 'PENDING_CREATION', + CREATED = 'CREATED', ACTIVE = 'ACTIVE', INACTIVE = 'INACTIVE', SUSPENDED = 'SUSPENDED', diff --git a/packages/twenty-shared/src/workspace/utils/__tests__/isWorkspaceActiveOrSuspended.test.ts b/packages/twenty-shared/src/workspace/utils/__tests__/isWorkspaceProvisioned.test.ts similarity index 58% rename from packages/twenty-shared/src/workspace/utils/__tests__/isWorkspaceActiveOrSuspended.test.ts rename to packages/twenty-shared/src/workspace/utils/__tests__/isWorkspaceProvisioned.test.ts index 34158c1456..5599342e74 100644 --- a/packages/twenty-shared/src/workspace/utils/__tests__/isWorkspaceActiveOrSuspended.test.ts +++ b/packages/twenty-shared/src/workspace/utils/__tests__/isWorkspaceProvisioned.test.ts @@ -1,13 +1,21 @@ import { WorkspaceActivationStatus } from '@/workspace/types/WorkspaceActivationStatus'; -import { isWorkspaceActiveOrSuspended } from '@/workspace/utils/isWorkspaceActiveOrSuspended'; +import { isWorkspaceProvisioned } from '@/workspace/utils/isWorkspaceProvisioned'; + +describe('isWorkspaceProvisioned', () => { + it('should return true for Created workspace', () => { + const workspace = { + activationStatus: WorkspaceActivationStatus.CREATED, + }; + + expect(isWorkspaceProvisioned(workspace)).toBe(true); + }); -describe('isWorkspaceActiveOrSuspended', () => { it('should return true for Active workspace', () => { const workspace = { activationStatus: WorkspaceActivationStatus.ACTIVE, }; - expect(isWorkspaceActiveOrSuspended(workspace)).toBe(true); + expect(isWorkspaceProvisioned(workspace)).toBe(true); }); it('should return true for Suspended workspace', () => { @@ -15,7 +23,7 @@ describe('isWorkspaceActiveOrSuspended', () => { activationStatus: WorkspaceActivationStatus.SUSPENDED, }; - expect(isWorkspaceActiveOrSuspended(workspace)).toBe(true); + expect(isWorkspaceProvisioned(workspace)).toBe(true); }); it('should return false for Inactive workspace', () => { @@ -23,7 +31,7 @@ describe('isWorkspaceActiveOrSuspended', () => { activationStatus: WorkspaceActivationStatus.INACTIVE, }; - expect(isWorkspaceActiveOrSuspended(workspace)).toBe(false); + expect(isWorkspaceProvisioned(workspace)).toBe(false); }); it('should return false for OngoingCreation workspace', () => { @@ -31,7 +39,7 @@ describe('isWorkspaceActiveOrSuspended', () => { activationStatus: WorkspaceActivationStatus.ONGOING_CREATION, }; - expect(isWorkspaceActiveOrSuspended(workspace)).toBe(false); + expect(isWorkspaceProvisioned(workspace)).toBe(false); }); it('should return false for PendingCreation workspace', () => { @@ -39,14 +47,14 @@ describe('isWorkspaceActiveOrSuspended', () => { activationStatus: WorkspaceActivationStatus.PENDING_CREATION, }; - expect(isWorkspaceActiveOrSuspended(workspace)).toBe(false); + expect(isWorkspaceProvisioned(workspace)).toBe(false); }); it('should return false for undefined workspace', () => { - expect(isWorkspaceActiveOrSuspended(undefined)).toBe(false); + expect(isWorkspaceProvisioned(undefined)).toBe(false); }); it('should return false for null workspace', () => { - expect(isWorkspaceActiveOrSuspended(null)).toBe(false); + expect(isWorkspaceProvisioned(null)).toBe(false); }); }); diff --git a/packages/twenty-shared/src/workspace/utils/index.ts b/packages/twenty-shared/src/workspace/utils/index.ts index 9b865d9d06..66a330983f 100644 --- a/packages/twenty-shared/src/workspace/utils/index.ts +++ b/packages/twenty-shared/src/workspace/utils/index.ts @@ -1 +1 @@ -export * from './isWorkspaceActiveOrSuspended'; +export * from './isWorkspaceProvisioned'; diff --git a/packages/twenty-shared/src/workspace/utils/isWorkspaceActiveOrSuspended.ts b/packages/twenty-shared/src/workspace/utils/isWorkspaceActiveOrSuspended.ts deleted file mode 100644 index bb51bfec46..0000000000 --- a/packages/twenty-shared/src/workspace/utils/isWorkspaceActiveOrSuspended.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { WorkspaceActivationStatus } from '@/workspace/types/WorkspaceActivationStatus'; - -export const isWorkspaceActiveOrSuspended = ( - workspace?: { - activationStatus: WorkspaceActivationStatus; - } | null, -): boolean => { - return ( - workspace?.activationStatus === WorkspaceActivationStatus.ACTIVE || - workspace?.activationStatus === WorkspaceActivationStatus.SUSPENDED - ); -}; diff --git a/packages/twenty-shared/src/workspace/utils/isWorkspaceProvisioned.ts b/packages/twenty-shared/src/workspace/utils/isWorkspaceProvisioned.ts new file mode 100644 index 0000000000..adc7957894 --- /dev/null +++ b/packages/twenty-shared/src/workspace/utils/isWorkspaceProvisioned.ts @@ -0,0 +1,16 @@ +import { isDefined } from '@/utils'; +import { PROVISIONED_WORKSPACE_ACTIVATION_STATUSES } from '@/workspace/constants/ProvisionedWorkspaceActivationStatuses'; +import type { WorkspaceActivationStatus } from '@/workspace/types/WorkspaceActivationStatus'; + +export const isWorkspaceProvisioned = ( + workspace?: { + activationStatus: WorkspaceActivationStatus; + } | null, +): boolean => { + return ( + isDefined(workspace) && + PROVISIONED_WORKSPACE_ACTIVATION_STATUSES.includes( + workspace.activationStatus, + ) + ); +};