diff --git a/packages/twenty-front/jest.config.ts b/packages/twenty-front/jest.config.ts index d257c24bd..9f99f5614 100644 --- a/packages/twenty-front/jest.config.ts +++ b/packages/twenty-front/jest.config.ts @@ -24,7 +24,7 @@ const jestConfig: JestConfigWithTsJest = { extensionsToTreatAsEsm: ['.ts', '.tsx'], coverageThreshold: { global: { - statements: 58, + statements: 57, lines: 55, functions: 47, }, diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index ba9400002..8f5289872 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -1784,11 +1784,11 @@ export type WorkspaceBillingSubscriptionsArgs = { }; export enum WorkspaceActivationStatus { - Active = 'ACTIVE', - Inactive = 'INACTIVE', - OngoingCreation = 'ONGOING_CREATION', - PendingCreation = 'PENDING_CREATION', - Suspended = 'SUSPENDED' + ACTIVE = 'ACTIVE', + INACTIVE = 'INACTIVE', + ONGOING_CREATION = 'ONGOING_CREATION', + PENDING_CREATION = 'PENDING_CREATION', + SUSPENDED = 'SUSPENDED' } export type WorkspaceEdge = { diff --git a/packages/twenty-front/src/generated/graphql.tsx b/packages/twenty-front/src/generated/graphql.tsx index e93f8aac1..6f8551222 100644 --- a/packages/twenty-front/src/generated/graphql.tsx +++ b/packages/twenty-front/src/generated/graphql.tsx @@ -1556,11 +1556,11 @@ export type WorkspaceBillingSubscriptionsArgs = { }; export enum WorkspaceActivationStatus { - Active = 'ACTIVE', - Inactive = 'INACTIVE', - OngoingCreation = 'ONGOING_CREATION', - PendingCreation = 'PENDING_CREATION', - Suspended = 'SUSPENDED' + ACTIVE = 'ACTIVE', + INACTIVE = 'INACTIVE', + ONGOING_CREATION = 'ONGOING_CREATION', + PENDING_CREATION = 'PENDING_CREATION', + SUSPENDED = 'SUSPENDED' } export type WorkspaceEdge = { diff --git a/packages/twenty-front/src/hooks/__tests__/usePageChangeEffectNavigateLocation.test.ts b/packages/twenty-front/src/hooks/__tests__/usePageChangeEffectNavigateLocation.test.ts index 8ad603c7b..41c6e985c 100644 --- a/packages/twenty-front/src/hooks/__tests__/usePageChangeEffectNavigateLocation.test.ts +++ b/packages/twenty-front/src/hooks/__tests__/usePageChangeEffectNavigateLocation.test.ts @@ -85,6 +85,15 @@ const testCases = [ { loc: AppPath.ResetPassword, isLoggedIn: true, isWorkspaceSuspended: false, onboardingStatus: OnboardingStatus.InviteTeam, res: undefined }, { loc: AppPath.ResetPassword, isLoggedIn: true, isWorkspaceSuspended: false, onboardingStatus: OnboardingStatus.Completed, res: undefined }, + { loc: AppPath.VerifyEmail, isLoggedIn: true, isWorkspaceSuspended: false, onboardingStatus: OnboardingStatus.PlanRequired, res: undefined }, + { loc: AppPath.VerifyEmail, isLoggedIn: true, isWorkspaceSuspended: true, onboardingStatus: OnboardingStatus.Completed, res: undefined }, + { loc: AppPath.VerifyEmail, isLoggedIn: false, isWorkspaceSuspended: false, onboardingStatus: undefined, res: undefined }, + { loc: AppPath.VerifyEmail, isLoggedIn: true, isWorkspaceSuspended: false, onboardingStatus: OnboardingStatus.WorkspaceActivation, res: undefined }, + { loc: AppPath.VerifyEmail, isLoggedIn: true, isWorkspaceSuspended: false, onboardingStatus: OnboardingStatus.ProfileCreation, res: undefined }, + { loc: AppPath.VerifyEmail, isLoggedIn: true, isWorkspaceSuspended: false, onboardingStatus: OnboardingStatus.SyncEmail, res: undefined }, + { loc: AppPath.VerifyEmail, isLoggedIn: true, isWorkspaceSuspended: false, onboardingStatus: OnboardingStatus.InviteTeam, res: undefined }, + { loc: AppPath.VerifyEmail, isLoggedIn: true, isWorkspaceSuspended: false, onboardingStatus: OnboardingStatus.Completed, res: undefined }, + { loc: AppPath.CreateWorkspace, isLoggedIn: true, isWorkspaceSuspended: false, onboardingStatus: OnboardingStatus.PlanRequired, res: AppPath.PlanRequired }, { loc: AppPath.CreateWorkspace, isLoggedIn: true, isWorkspaceSuspended: true, onboardingStatus: OnboardingStatus.Completed, res: '/settings/billing' }, { loc: AppPath.CreateWorkspace, isLoggedIn: false, isWorkspaceSuspended: false, onboardingStatus: undefined, res: AppPath.SignInUp }, diff --git a/packages/twenty-front/src/modules/billing/constants/BillingCheckoutSessionDefaultValue.ts b/packages/twenty-front/src/modules/billing/constants/BillingCheckoutSessionDefaultValue.ts index 5dd12a661..3081c1256 100644 --- a/packages/twenty-front/src/modules/billing/constants/BillingCheckoutSessionDefaultValue.ts +++ b/packages/twenty-front/src/modules/billing/constants/BillingCheckoutSessionDefaultValue.ts @@ -1,7 +1,7 @@ import { BillingCheckoutSession } from '@/auth/types/billingCheckoutSession.type'; import { - BillingPlanKey, - SubscriptionInterval, + BillingPlanKey, + SubscriptionInterval, } from '~/generated-metadata/graphql'; export const BILLING_CHECKOUT_SESSION_DEFAULT_VALUE: BillingCheckoutSession = { diff --git a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx index f078aa59b..275d21433 100644 --- a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx +++ b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsLoadEffect.tsx @@ -5,7 +5,7 @@ import { currentUserState } from '@/auth/states/currentUserState'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { useLoadMockedObjectMetadataItems } from '@/object-metadata/hooks/useLoadMockedObjectMetadataItems'; import { useRefreshObjectMetadataItems } from '@/object-metadata/hooks/useRefreshObjectMetadataItem'; -import { WorkspaceActivationStatus } from '~/generated/graphql'; +import { isWorkspaceActiveOrSuspended } from 'twenty-shared'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; export const ObjectMetadataItemsLoadEffect = () => { @@ -18,7 +18,7 @@ export const ObjectMetadataItemsLoadEffect = () => { useEffect(() => { if ( isUndefinedOrNull(currentUser) || - currentWorkspace?.activationStatus !== WorkspaceActivationStatus.Active + !isWorkspaceActiveOrSuspended(currentWorkspace) ) { loadMockedObjectMetadataItems(); } else { @@ -26,7 +26,7 @@ export const ObjectMetadataItemsLoadEffect = () => { } }, [ currentUser, - currentWorkspace?.activationStatus, + currentWorkspace, loadMockedObjectMetadataItems, refreshObjectMetadataItems, ]); diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts index 5d3344580..d342df2d9 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts @@ -16,7 +16,7 @@ const Wrapper = getJestMetadataAndApolloMocksWrapper({ featureFlags: [], allowImpersonation: false, subdomain: 'test', - activationStatus: WorkspaceActivationStatus.Active, + activationStatus: WorkspaceActivationStatus.ACTIVE, hasValidEntrepriseKey: false, metadataVersion: 1, isPublicInviteLinkEnabled: false, diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts index 88ac0baab..c407749ab 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNamePluralFromSingular.ts @@ -2,7 +2,7 @@ import { useRecoilValue } from 'recoil'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector'; -import { WorkspaceActivationStatus } from '~/generated/graphql'; +import { isWorkspaceActiveOrSuspended } from 'twenty-shared'; import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { isDefined } from '~/utils/isDefined'; @@ -20,7 +20,7 @@ export const useObjectNamePluralFromSingular = ({ }), ); - if (currentWorkspace?.activationStatus !== WorkspaceActivationStatus.Active) { + if (!isWorkspaceActiveOrSuspended(currentWorkspace)) { objectMetadataItem = generatedMockObjectMetadataItems.find( (objectMetadataItem) => diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts index 2e5127d8f..ce387eb99 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useObjectNameSingularFromPlural.ts @@ -2,7 +2,7 @@ import { useRecoilValue } from 'recoil'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector'; -import { WorkspaceActivationStatus } from '~/generated/graphql'; +import { isWorkspaceActiveOrSuspended } from 'twenty-shared'; import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { isDefined } from '~/utils/isDefined'; @@ -20,7 +20,7 @@ export const useObjectNameSingularFromPlural = ({ }), ); - if (currentWorkspace?.activationStatus !== WorkspaceActivationStatus.Active) { + if (!isWorkspaceActiveOrSuspended(currentWorkspace)) { objectMetadataItem = generatedMockObjectMetadataItems.find( (objectMetadataItem) => diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useLazyLoadRecordIndexTable.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useLazyLoadRecordIndexTable.ts index 5b212528f..d9bcdb7b4 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useLazyLoadRecordIndexTable.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useLazyLoadRecordIndexTable.ts @@ -7,7 +7,7 @@ import { useFindManyRecordIndexTableParams } from '@/object-record/record-index/ import { useRecordTableRecordGqlFields } from '@/object-record/record-index/hooks/useRecordTableRecordGqlFields'; import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable'; import { SIGN_IN_BACKGROUND_MOCK_COMPANIES } from '@/sign-in-background-mock/constants/SignInBackgroundMockCompanies'; -import { WorkspaceActivationStatus } from '~/generated/graphql'; +import { isWorkspaceActiveOrSuspended } from 'twenty-shared'; export const useLazyLoadRecordIndexTable = (objectNameSingular: string) => { const { objectMetadataItem } = useObjectMetadataItem({ @@ -44,10 +44,9 @@ export const useLazyLoadRecordIndexTable = (objectNameSingular: string) => { return { findManyRecords, - records: - currentWorkspace?.activationStatus === WorkspaceActivationStatus.Active - ? records - : SIGN_IN_BACKGROUND_MOCK_COMPANIES, + records: isWorkspaceActiveOrSuspended(currentWorkspace) + ? records + : SIGN_IN_BACKGROUND_MOCK_COMPANIES, totalCount: totalCount, loading, fetchMoreRecords, diff --git a/packages/twenty-front/src/modules/workspace/hooks/__tests__/useSubscriptionStatus.test.ts b/packages/twenty-front/src/modules/workspace/hooks/__tests__/useSubscriptionStatus.test.ts index d7840ca27..821f2fa7b 100644 --- a/packages/twenty-front/src/modules/workspace/hooks/__tests__/useSubscriptionStatus.test.ts +++ b/packages/twenty-front/src/modules/workspace/hooks/__tests__/useSubscriptionStatus.test.ts @@ -16,7 +16,7 @@ import { const currentWorkspace = { id: '1', currentBillingSubscription: { status: SubscriptionStatus.Incomplete }, - activationStatus: WorkspaceActivationStatus.Active, + activationStatus: WorkspaceActivationStatus.ACTIVE, allowImpersonation: true, } as CurrentWorkspace; diff --git a/packages/twenty-front/src/modules/workspace/hooks/useIsWorkspaceActivationStatusSuspended.ts b/packages/twenty-front/src/modules/workspace/hooks/useIsWorkspaceActivationStatusSuspended.ts index 0029b2007..9e52e90a8 100644 --- a/packages/twenty-front/src/modules/workspace/hooks/useIsWorkspaceActivationStatusSuspended.ts +++ b/packages/twenty-front/src/modules/workspace/hooks/useIsWorkspaceActivationStatusSuspended.ts @@ -6,6 +6,6 @@ import { WorkspaceActivationStatus } from '~/generated/graphql'; export const useIsWorkspaceActivationStatusSuspended = (): boolean => { const currentWorkspace = useRecoilValue(currentWorkspaceState); return ( - currentWorkspace?.activationStatus === WorkspaceActivationStatus.Suspended + currentWorkspace?.activationStatus === WorkspaceActivationStatus.SUSPENDED ); }; diff --git a/packages/twenty-front/src/testing/mock-data/users.ts b/packages/twenty-front/src/testing/mock-data/users.ts index c9a55bebb..e93e2ab12 100644 --- a/packages/twenty-front/src/testing/mock-data/users.ts +++ b/packages/twenty-front/src/testing/mock-data/users.ts @@ -45,7 +45,7 @@ export const mockCurrentWorkspace: Workspace = { logo: workspaceLogoUrl, isPublicInviteLinkEnabled: true, allowImpersonation: true, - activationStatus: WorkspaceActivationStatus.Active, + activationStatus: WorkspaceActivationStatus.ACTIVE, hasValidEntrepriseKey: false, isGoogleAuthEnabled: true, isPasswordAuthEnabled: true, diff --git a/packages/twenty-server/src/database/commands/active-workspaces.command.ts b/packages/twenty-server/src/database/commands/active-workspaces.command.ts index 46c7ad220..b9de1e721 100644 --- a/packages/twenty-server/src/database/commands/active-workspaces.command.ts +++ b/packages/twenty-server/src/database/commands/active-workspaces.command.ts @@ -1,16 +1,13 @@ import chalk from 'chalk'; import { Option } from 'nest-commander'; -import { Repository } from 'typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; +import { In, Repository } from 'typeorm'; import { BaseCommandOptions, BaseCommandRunner, } from 'src/database/commands/base.command'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; - +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; export type ActiveWorkspacesCommandOptions = BaseCommandOptions & { workspaceId?: string; }; @@ -38,7 +35,10 @@ export abstract class ActiveWorkspacesCommandRunner extends BaseCommandRunner { const activeWorkspaces = await this.workspaceRepository.find({ select: ['id'], where: { - activationStatus: WorkspaceActivationStatus.ACTIVE, + activationStatus: In([ + WorkspaceActivationStatus.ACTIVE, + WorkspaceActivationStatus.SUSPENDED, + ]), }, }); diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-40/0-40-update-inactive-workspace-status.command.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-40/0-40-update-inactive-workspace-status.command.ts index 3cb37806e..f71585667 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version/0-40/0-40-update-inactive-workspace-status.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-40/0-40-update-inactive-workspace-status.command.ts @@ -2,6 +2,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import chalk from 'chalk'; import { Command, Option } from 'nest-commander'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { In, Repository } from 'typeorm'; import { @@ -16,10 +17,7 @@ import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature- import { KeyValuePair } from 'src/engine/core-modules/key-value-pair/key-value-pair.entity'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { User } from 'src/engine/core-modules/user/user.entity'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; diff --git a/packages/twenty-server/src/database/typeorm-seeds/core/demo/workspaces.ts b/packages/twenty-server/src/database/typeorm-seeds/core/demo/workspaces.ts index 5683d282f..a9fa68402 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/core/demo/workspaces.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/core/demo/workspaces.ts @@ -1,7 +1,6 @@ +import { WorkspaceActivationStatus } from 'twenty-shared'; import { DataSource } from 'typeorm'; -import { WorkspaceActivationStatus } from 'src/engine/core-modules/workspace/workspace.entity'; - const tableName = 'workspace'; export const seedWorkspaces = async ( diff --git a/packages/twenty-server/src/database/typeorm-seeds/core/workspaces.ts b/packages/twenty-server/src/database/typeorm-seeds/core/workspaces.ts index d3dceb8a8..9cae9446a 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/core/workspaces.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/core/workspaces.ts @@ -1,9 +1,7 @@ +import { WorkspaceActivationStatus } from 'twenty-shared'; import { DataSource } from 'typeorm'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; const tableName = 'workspace'; diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/message-channels.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/message-channels.ts index f948b5d9d..79ddfcacb 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/message-channels.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/message-channels.ts @@ -30,6 +30,7 @@ export const seedMessageChannel = async ( 'type', 'connectedAccountId', 'handle', + 'isSyncEnabled', 'visibility', 'syncStage', ]) @@ -46,7 +47,7 @@ export const seedMessageChannel = async ( handle: 'tim@apple.dev', isSyncEnabled: false, visibility: MessageChannelVisibility.SHARE_EVERYTHING, - syncSubStatus: MessageChannelSyncStage.FULL_MESSAGE_LIST_FETCH_PENDING, + syncStage: MessageChannelSyncStage.FULL_MESSAGE_LIST_FETCH_PENDING, }, { id: DEV_SEED_MESSAGE_CHANNEL_IDS.JONY, @@ -59,7 +60,7 @@ export const seedMessageChannel = async ( handle: 'jony.ive@apple.dev', isSyncEnabled: false, visibility: MessageChannelVisibility.SHARE_EVERYTHING, - syncSubStatus: MessageChannelSyncStage.FULL_MESSAGE_LIST_FETCH_PENDING, + syncStage: MessageChannelSyncStage.FULL_MESSAGE_LIST_FETCH_PENDING, }, { id: DEV_SEED_MESSAGE_CHANNEL_IDS.PHIL, @@ -72,7 +73,7 @@ export const seedMessageChannel = async ( handle: 'phil.schiler@apple.dev', isSyncEnabled: false, visibility: MessageChannelVisibility.SHARE_EVERYTHING, - syncSubStatus: MessageChannelSyncStage.FULL_MESSAGE_LIST_FETCH_PENDING, + syncStage: MessageChannelSyncStage.FULL_MESSAGE_LIST_FETCH_PENDING, }, ]) .execute(); diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/sign-in-up.service.spec.ts b/packages/twenty-server/src/engine/core-modules/auth/services/sign-in-up.service.spec.ts index 390d9e49c..98dd651b2 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/sign-in-up.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/sign-in-up.service.spec.ts @@ -1,28 +1,26 @@ -import { Test, TestingModule } from '@nestjs/testing'; import { HttpService } from '@nestjs/axios'; +import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Repository } from 'typeorm'; -import { DomainManagerService } from 'src/engine/core-modules/domain-manager/service/domain-manager.service'; -import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { SignInUpService } from 'src/engine/core-modules/auth/services/sign-in-up.service'; -import { User } from 'src/engine/core-modules/user/user.entity'; -import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.service'; -import { WorkspaceInvitationService } from 'src/engine/core-modules/workspace-invitation/services/workspace-invitation.service'; -import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; -import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service'; import { AuthProviderWithPasswordType, ExistingUserOrPartialUserWithPicture, SignInUpBaseParams, } from 'src/engine/core-modules/auth/types/signInUp.type'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; -import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; +import { DomainManagerService } from 'src/engine/core-modules/domain-manager/service/domain-manager.service'; +import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; +import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.service'; +import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service'; +import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; import { UserService } from 'src/engine/core-modules/user/services/user.service'; +import { User } from 'src/engine/core-modules/user/user.entity'; +import { WorkspaceInvitationService } from 'src/engine/core-modules/workspace-invitation/services/workspace-invitation.service'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; jest.mock('src/utils/image', () => { return { 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 fe6db1031..384865c8d 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 @@ -3,12 +3,16 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import FileType from 'file-type'; -import { TWENTY_ICONS_BASE_URL } from 'twenty-shared'; +import { + TWENTY_ICONS_BASE_URL, + WorkspaceActivationStatus, +} from 'twenty-shared'; import { Repository } from 'typeorm'; import { v4 } from 'uuid'; import { FileFolder } from 'src/engine/core-modules/file/interfaces/file-folder.interface'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { AuthException, AuthExceptionCode, @@ -18,22 +22,6 @@ import { compareHash, hashPassword, } from 'src/engine/core-modules/auth/auth.util'; -import { DomainManagerService } from 'src/engine/core-modules/domain-manager/service/domain-manager.service'; -import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; -import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.service'; -import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service'; -import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; -import { User } from 'src/engine/core-modules/user/user.entity'; -import { WorkspaceInvitationService } from 'src/engine/core-modules/workspace-invitation/services/workspace-invitation.service'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; -import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate'; -import { getDomainNameByEmail } from 'src/utils/get-domain-name-by-email'; -import { getImageBufferFromUrl } from 'src/utils/image'; -import { isWorkEmail } from 'src/utils/is-work-email'; -import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { AuthProviderWithPasswordType, ExistingUserOrPartialUserWithPicture, @@ -41,7 +29,19 @@ import { SignInUpBaseParams, SignInUpNewUserPayload, } from 'src/engine/core-modules/auth/types/signInUp.type'; +import { DomainManagerService } from 'src/engine/core-modules/domain-manager/service/domain-manager.service'; +import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; +import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.service'; +import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service'; +import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; import { UserService } from 'src/engine/core-modules/user/services/user.service'; +import { User } from 'src/engine/core-modules/user/user.entity'; +import { WorkspaceInvitationService } from 'src/engine/core-modules/workspace-invitation/services/workspace-invitation.service'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate'; +import { getDomainNameByEmail } from 'src/utils/get-domain-name-by-email'; +import { getImageBufferFromUrl } from 'src/utils/image'; +import { isWorkEmail } from 'src/utils/is-work-email'; @Injectable() // eslint-disable-next-line @nx/workspace-inject-workspace-repository diff --git a/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.spec.ts b/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.spec.ts index bb73c6369..43438bb5d 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.spec.ts @@ -2,6 +2,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { Request } from 'express'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Repository } from 'typeorm'; import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; @@ -12,10 +13,7 @@ import { EnvironmentService } from 'src/engine/core-modules/environment/environm import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { SSOService } from 'src/engine/core-modules/sso/services/sso.service'; import { User } from 'src/engine/core-modules/user/user.entity'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { AccessTokenService } from './access-token.service'; 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 9fc53b7dc..09dc96cd6 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 @@ -5,6 +5,7 @@ import { addMilliseconds } from 'date-fns'; import { Request } from 'express'; import ms from 'ms'; import { ExtractJwt } from 'passport-jwt'; +import { isWorkspaceActiveOrSuspended } from 'twenty-shared'; import { Repository } from 'typeorm'; import { @@ -20,14 +21,11 @@ import { import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { User } from 'src/engine/core-modules/user/user.entity'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { userValidator } from 'src/engine/core-modules/user/user.validate'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; -import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate'; -import { userValidator } from 'src/engine/core-modules/user/user.validate'; @Injectable() export class AccessTokenService { @@ -67,7 +65,7 @@ export class AccessTokenService { workspaceValidator.assertIsDefinedOrThrow(workspace); - if (workspace.activationStatus === WorkspaceActivationStatus.ACTIVE) { + if (isWorkspaceActiveOrSuspended(workspace)) { const workspaceMemberRepository = await this.twentyORMGlobalManager.getRepositoryForWorkspace( workspaceId, diff --git a/packages/twenty-server/src/engine/core-modules/billing/services/billing-webhook-subscription.service.ts b/packages/twenty-server/src/engine/core-modules/billing/services/billing-webhook-subscription.service.ts index 970137160..fba68f223 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/services/billing-webhook-subscription.service.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/services/billing-webhook-subscription.service.ts @@ -2,6 +2,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import Stripe from 'stripe'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Repository } from 'typeorm'; import { BillingCustomer } from 'src/engine/core-modules/billing/entities/billing-customer.entity'; @@ -12,10 +13,7 @@ import { StripeCustomerService } from 'src/engine/core-modules/billing/stripe/se import { transformStripeSubscriptionEventToCustomerRepositoryData } from 'src/engine/core-modules/billing/utils/transform-stripe-subscription-event-to-customer-repository-data.util'; import { transformStripeSubscriptionEventToSubscriptionItemRepositoryData } from 'src/engine/core-modules/billing/utils/transform-stripe-subscription-event-to-subscription-item-repository-data.util'; import { transformStripeSubscriptionEventToSubscriptionRepositoryData } from 'src/engine/core-modules/billing/utils/transform-stripe-subscription-event-to-subscription-repository-data.util'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; @Injectable() export class BillingWebhookSubscriptionService { protected readonly logger = new Logger( @@ -88,10 +86,11 @@ export class BillingWebhookSubscriptionService { if ( data.object.status === SubscriptionStatus.Canceled || - data.object.status === SubscriptionStatus.Unpaid + data.object.status === SubscriptionStatus.Unpaid || + data.object.status === SubscriptionStatus.Paused ) { await this.workspaceRepository.update(workspaceId, { - activationStatus: WorkspaceActivationStatus.INACTIVE, + activationStatus: WorkspaceActivationStatus.SUSPENDED, }); } @@ -99,7 +98,7 @@ export class BillingWebhookSubscriptionService { (data.object.status === SubscriptionStatus.Active || data.object.status === SubscriptionStatus.Trialing || data.object.status === SubscriptionStatus.PastDue) && - workspace.activationStatus == WorkspaceActivationStatus.INACTIVE + workspace.activationStatus == WorkspaceActivationStatus.SUSPENDED ) { await this.workspaceRepository.update(workspaceId, { activationStatus: WorkspaceActivationStatus.ACTIVE, diff --git a/packages/twenty-server/src/engine/core-modules/onboarding/onboarding.service.ts b/packages/twenty-server/src/engine/core-modules/onboarding/onboarding.service.ts index 053f011ae..413df67c6 100644 --- a/packages/twenty-server/src/engine/core-modules/onboarding/onboarding.service.ts +++ b/packages/twenty-server/src/engine/core-modules/onboarding/onboarding.service.ts @@ -1,13 +1,12 @@ import { Injectable } from '@nestjs/common'; +import { WorkspaceActivationStatus } from 'twenty-shared'; + import { BillingService } from 'src/engine/core-modules/billing/services/billing.service'; import { OnboardingStatus } from 'src/engine/core-modules/onboarding/enums/onboarding-status.enum'; import { UserVarsService } from 'src/engine/core-modules/user/user-vars/services/user-vars.service'; import { User } from 'src/engine/core-modules/user/user.entity'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; export enum OnboardingStepKeys { ONBOARDING_CONNECT_ACCOUNT_PENDING = 'ONBOARDING_CONNECT_ACCOUNT_PENDING', 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 231ce6a2a..3b298b307 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 @@ -3,6 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import assert from 'assert'; import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm'; +import { isWorkspaceActiveOrSuspended } from 'twenty-shared'; import { Repository } from 'typeorm'; import { TypeORMService } from 'src/database/typeorm/typeorm.service'; @@ -14,10 +15,7 @@ import { import { User } from 'src/engine/core-modules/user/user.entity'; import { userValidator } from 'src/engine/core-modules/user/user.validate'; import { WorkspaceService } from 'src/engine/core-modules/workspace/services/workspace.service'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; @@ -41,10 +39,7 @@ export class UserService extends TypeOrmQueryService { } async loadWorkspaceMember(user: User, workspace: Workspace) { - if ( - workspace?.activationStatus !== WorkspaceActivationStatus.ACTIVE && - workspace?.activationStatus !== WorkspaceActivationStatus.SUSPENDED - ) { + if (!isWorkspaceActiveOrSuspended(workspace)) { return null; } @@ -62,7 +57,7 @@ export class UserService extends TypeOrmQueryService { } async loadWorkspaceMembers(workspace: Workspace) { - if (workspace.activationStatus !== WorkspaceActivationStatus.ACTIVE) { + if (!isWorkspaceActiveOrSuspended(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 b2493063f..dd20c1670 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 @@ -4,6 +4,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import assert from 'assert'; import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Repository } from 'typeorm'; import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service'; @@ -14,10 +15,7 @@ import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-works import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; import { User } from 'src/engine/core-modules/user/user.entity'; import { ActivateWorkspaceInput } from 'src/engine/core-modules/workspace/dtos/activate-workspace-input'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceException, WorkspaceExceptionCode, diff --git a/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts b/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts index 8b69c77bb..4ddbe7d2f 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts @@ -1,6 +1,7 @@ import { Field, ObjectType, registerEnumType } from '@nestjs/graphql'; import { IDField, UnPagedRelation } from '@ptc-org/nestjs-query-graphql'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Column, CreateDateColumn, @@ -23,14 +24,6 @@ import { PostgresCredentials } from 'src/engine/core-modules/postgres-credential import { WorkspaceSSOIdentityProvider } from 'src/engine/core-modules/sso/workspace-sso-identity-provider.entity'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; -export enum WorkspaceActivationStatus { - ONGOING_CREATION = 'ONGOING_CREATION', - PENDING_CREATION = 'PENDING_CREATION', - ACTIVE = 'ACTIVE', - INACTIVE = 'INACTIVE', - SUSPENDED = 'SUSPENDED', -} - registerEnumType(WorkspaceActivationStatus, { name: 'WorkspaceActivationStatus', }); diff --git a/packages/twenty-server/src/engine/core-modules/workspace/workspace.validate.ts b/packages/twenty-server/src/engine/core-modules/workspace/workspace.validate.ts index 7069dac55..f3aab2775 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/workspace.validate.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/workspace.validate.ts @@ -1,17 +1,16 @@ -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; -import { CustomException } from 'src/utils/custom-exception'; +import { WorkspaceActivationStatus } from 'twenty-shared'; + import { AuthException, AuthExceptionCode, } from 'src/engine/core-modules/auth/auth.exception'; import { WorkspaceAuthProvider } from 'src/engine/core-modules/workspace/types/workspace.type'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceException, WorkspaceExceptionCode, } from 'src/engine/core-modules/workspace/workspace.exception'; +import { CustomException } from 'src/utils/custom-exception'; const assertIsDefinedOrThrow = ( workspace: Workspace | undefined | null, diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-event-list-fetch.cron.job.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-event-list-fetch.cron.job.ts index 84157f01f..8d1a9b329 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-event-list-fetch.cron.job.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-event-list-fetch.cron.job.ts @@ -1,5 +1,6 @@ import { InjectRepository } from '@nestjs/typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Any, Repository } from 'typeorm'; import { SentryCronMonitor } from 'src/engine/core-modules/cron/sentry-cron-monitor.decorator'; @@ -9,10 +10,7 @@ import { Process } from 'src/engine/core-modules/message-queue/decorators/proces import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { CalendarEventListFetchJob, diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-events-import.cron.job.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-events-import.cron.job.ts index cb66b09ce..5b2951af3 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-events-import.cron.job.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-events-import.cron.job.ts @@ -1,5 +1,6 @@ import { InjectRepository } from '@nestjs/typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Equal, Repository } from 'typeorm'; import { SentryCronMonitor } from 'src/engine/core-modules/cron/sentry-cron-monitor.decorator'; @@ -9,15 +10,11 @@ import { Process } from 'src/engine/core-modules/message-queue/decorators/proces import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { CalendarEventListFetchJobData } from 'src/modules/calendar/calendar-event-import-manager/jobs/calendar-event-list-fetch.job'; import { CalendarEventsImportJob } from 'src/modules/calendar/calendar-event-import-manager/jobs/calendar-events-import.job'; import { CalendarChannelSyncStage } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; - export const CALENDAR_EVENTS_IMPORT_CRON_PATTERN = '*/1 * * * *'; @Processor({ diff --git a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-ongoing-stale.cron.job.ts b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-ongoing-stale.cron.job.ts index 96b95de06..73361fd91 100644 --- a/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-ongoing-stale.cron.job.ts +++ b/packages/twenty-server/src/modules/calendar/calendar-event-import-manager/crons/jobs/calendar-ongoing-stale.cron.job.ts @@ -1,5 +1,6 @@ import { InjectRepository } from '@nestjs/typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Repository } from 'typeorm'; import { SentryCronMonitor } from 'src/engine/core-modules/cron/sentry-cron-monitor.decorator'; @@ -9,15 +10,11 @@ import { Process } from 'src/engine/core-modules/message-queue/decorators/proces import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { CalendarOngoingStaleJob, CalendarOngoingStaleJobData, } from 'src/modules/calendar/calendar-event-import-manager/jobs/calendar-ongoing-stale.job'; - export const CALENDAR_ONGOING_STALE_CRON_PATTERN = '0 * * * *'; @Processor(MessageQueue.cronQueue) diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-message-list-fetch.cron.job.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-message-list-fetch.cron.job.ts index deb92a7e5..390464798 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-message-list-fetch.cron.job.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-message-list-fetch.cron.job.ts @@ -1,5 +1,6 @@ import { InjectRepository } from '@nestjs/typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { In, Repository } from 'typeorm'; import { SentryCronMonitor } from 'src/engine/core-modules/cron/sentry-cron-monitor.decorator'; @@ -9,10 +10,7 @@ import { Process } from 'src/engine/core-modules/message-queue/decorators/proces import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { MessageChannelSyncStage, @@ -22,7 +20,6 @@ import { MessagingMessageListFetchJob, MessagingMessageListFetchJobData, } from 'src/modules/messaging/message-import-manager/jobs/messaging-message-list-fetch.job'; - export const MESSAGING_MESSAGE_LIST_FETCH_CRON_PATTERN = '*/5 * * * *'; @Processor(MessageQueue.cronQueue) diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-messages-import.cron.job.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-messages-import.cron.job.ts index 87392e916..d77a3e1df 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-messages-import.cron.job.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-messages-import.cron.job.ts @@ -1,5 +1,6 @@ import { InjectRepository } from '@nestjs/typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Repository } from 'typeorm'; import { SentryCronMonitor } from 'src/engine/core-modules/cron/sentry-cron-monitor.decorator'; @@ -9,10 +10,7 @@ import { Process } from 'src/engine/core-modules/message-queue/decorators/proces import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { MessageChannelSyncStage, diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-ongoing-stale.cron.job.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-ongoing-stale.cron.job.ts index fc3771f51..a6b3e0565 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-ongoing-stale.cron.job.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/crons/jobs/messaging-ongoing-stale.cron.job.ts @@ -1,5 +1,6 @@ import { InjectRepository } from '@nestjs/typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Repository } from 'typeorm'; import { SentryCronMonitor } from 'src/engine/core-modules/cron/sentry-cron-monitor.decorator'; @@ -9,15 +10,11 @@ import { Process } from 'src/engine/core-modules/message-queue/decorators/proces import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { MessagingOngoingStaleJob, MessagingOngoingStaleJobData, } from 'src/modules/messaging/message-import-manager/jobs/messaging-ongoing-stale.job'; - export const MESSAGING_ONGOING_STALE_CRON_PATTERN = '0 * * * *'; @Processor(MessageQueue.cronQueue) diff --git a/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-workspace-member.listener.ts b/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-workspace-member.listener.ts index e3655c9b2..913ec59c4 100644 --- a/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-workspace-member.listener.ts +++ b/packages/twenty-server/src/modules/messaging/message-participant-manager/listeners/message-participant-workspace-member.listener.ts @@ -1,18 +1,18 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Repository } from 'typeorm'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; +import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; import { ObjectRecordUpdateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-update.event'; import { objectRecordChangedProperties as objectRecordUpdateEventChangedProperties } from 'src/engine/core-modules/event-emitter/utils/object-record-changed-properties.util'; import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type'; import { MessageParticipantMatchParticipantJob, @@ -23,9 +23,6 @@ import { MessageParticipantUnmatchParticipantJobData, } from 'src/modules/messaging/message-participant-manager/jobs/message-participant-unmatch-participant.job'; import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; -import { OnDatabaseBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/decorators/on-database-batch-event.decorator'; -import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; - @Injectable() export class MessageParticipantWorkspaceMemberListener { constructor( diff --git a/packages/twenty-server/src/modules/messaging/monitoring/crons/jobs/messaging-message-channel-sync-status-monitoring.cron.job.ts b/packages/twenty-server/src/modules/messaging/monitoring/crons/jobs/messaging-message-channel-sync-status-monitoring.cron.job.ts index 6d4d12271..a4654f14d 100644 --- a/packages/twenty-server/src/modules/messaging/monitoring/crons/jobs/messaging-message-channel-sync-status-monitoring.cron.job.ts +++ b/packages/twenty-server/src/modules/messaging/monitoring/crons/jobs/messaging-message-channel-sync-status-monitoring.cron.job.ts @@ -2,6 +2,7 @@ import { Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import snakeCase from 'lodash.snakecase'; +import { WorkspaceActivationStatus } from 'twenty-shared'; import { Repository } from 'typeorm'; import { SentryCronMonitor } from 'src/engine/core-modules/cron/sentry-cron-monitor.decorator'; @@ -9,10 +10,7 @@ import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handl import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; -import { - Workspace, - WorkspaceActivationStatus, -} from 'src/engine/core-modules/workspace/workspace.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { MessageChannelWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; import { MessagingTelemetryService } from 'src/modules/messaging/monitoring/services/messaging-telemetry.service'; diff --git a/packages/twenty-shared/src/index.ts b/packages/twenty-shared/src/index.ts index 6bd4638f2..a568cdebb 100644 --- a/packages/twenty-shared/src/index.ts +++ b/packages/twenty-shared/src/index.ts @@ -4,4 +4,4 @@ export * from './types/FieldMetadataType'; export * from './utils/fieldMetadata/isFieldMetadataDateKind'; export * from './utils/image/getImageAbsoluteURI'; export * from './utils/strings'; - +export * from './workspace'; diff --git a/packages/twenty-shared/src/workspace/index.ts b/packages/twenty-shared/src/workspace/index.ts new file mode 100644 index 000000000..c9907f187 --- /dev/null +++ b/packages/twenty-shared/src/workspace/index.ts @@ -0,0 +1,2 @@ +export * from './types/WorkspaceActivationStatus'; +export * from './utils/isWorkspaceActiveOrSuspended'; diff --git a/packages/twenty-shared/src/workspace/types/WorkspaceActivationStatus.ts b/packages/twenty-shared/src/workspace/types/WorkspaceActivationStatus.ts new file mode 100644 index 000000000..1b76a41f8 --- /dev/null +++ b/packages/twenty-shared/src/workspace/types/WorkspaceActivationStatus.ts @@ -0,0 +1,7 @@ +export enum WorkspaceActivationStatus { + ONGOING_CREATION = 'ONGOING_CREATION', + PENDING_CREATION = 'PENDING_CREATION', + 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__/isWorkspaceActiveOrSuspended.test.ts new file mode 100644 index 000000000..8f2318c32 --- /dev/null +++ b/packages/twenty-shared/src/workspace/utils/__tests__/isWorkspaceActiveOrSuspended.test.ts @@ -0,0 +1,52 @@ +import { WorkspaceActivationStatus } from '../../types/WorkspaceActivationStatus'; +import { isWorkspaceActiveOrSuspended } from '../isWorkspaceActiveOrSuspended'; + +describe('isWorkspaceActiveOrSuspended', () => { + it('should return true for Active workspace', () => { + const workspace = { + activationStatus: WorkspaceActivationStatus.ACTIVE, + }; + + expect(isWorkspaceActiveOrSuspended(workspace)).toBe(true); + }); + + it('should return true for Suspended workspace', () => { + const workspace = { + activationStatus: WorkspaceActivationStatus.SUSPENDED, + }; + + expect(isWorkspaceActiveOrSuspended(workspace)).toBe(true); + }); + + it('should return false for Inactive workspace', () => { + const workspace = { + activationStatus: WorkspaceActivationStatus.INACTIVE, + }; + + expect(isWorkspaceActiveOrSuspended(workspace)).toBe(false); + }); + + it('should return false for OngoingCreation workspace', () => { + const workspace = { + activationStatus: WorkspaceActivationStatus.ONGOING_CREATION, + }; + + expect(isWorkspaceActiveOrSuspended(workspace)).toBe(false); + }); + + it('should return false for PendingCreation workspace', () => { + const workspace = { + activationStatus: WorkspaceActivationStatus.PENDING_CREATION, + }; + + expect(isWorkspaceActiveOrSuspended(workspace)).toBe(false); + }); + + it('should return false for undefined workspace', () => { + expect(isWorkspaceActiveOrSuspended(undefined)).toBe(false); + }); + + it('should return false for null workspace', () => { + expect(isWorkspaceActiveOrSuspended(null)).toBe(false); + }); +}); diff --git a/packages/twenty-shared/src/workspace/utils/isWorkspaceActiveOrSuspended.ts b/packages/twenty-shared/src/workspace/utils/isWorkspaceActiveOrSuspended.ts new file mode 100644 index 000000000..a809c446a --- /dev/null +++ b/packages/twenty-shared/src/workspace/utils/isWorkspaceActiveOrSuspended.ts @@ -0,0 +1,12 @@ +import { WorkspaceActivationStatus } from '../types/WorkspaceActivationStatus'; + +export const isWorkspaceActiveOrSuspended = ( + workspace?: { + activationStatus: WorkspaceActivationStatus; + } | null, +): boolean => { + return ( + workspace?.activationStatus === WorkspaceActivationStatus.ACTIVE || + workspace?.activationStatus === WorkspaceActivationStatus.SUSPENDED + ); +};