diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-config/graphql-config.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-config/graphql-config.service.ts index 5449caba7a0d..d5752bc1d8e5 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-config/graphql-config.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-config/graphql-config.service.ts @@ -114,8 +114,13 @@ export class GraphQLConfigService email: user.email, firstName: user.firstName, lastName: user.lastName, - workspaceId: workspace?.id, - workspaceDisplayName: workspace?.displayName, + } + : undefined, + workspace + ? { + id: workspace.id, + displayName: workspace.displayName, + activationStatus: workspace.activationStatus, } : undefined, ); diff --git a/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-exchange-code-for-token.guard.ts b/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-exchange-code-for-token.guard.ts index 8766d7d1742a..c9c621079242 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-exchange-code-for-token.guard.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-exchange-code-for-token.guard.ts @@ -1,13 +1,13 @@ import { ExecutionContext, Injectable } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; -import { - AuthException, - AuthExceptionCode, -} from 'src/engine/core-modules/auth/auth.exception'; import { GoogleAPIsOauthExchangeCodeForTokenStrategy } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-exchange-code-for-token.auth.strategy'; import { TransientTokenService } from 'src/engine/core-modules/auth/token/services/transient-token.service'; import { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util'; +import { + EnvironmentException, + EnvironmentExceptionCode, +} from 'src/engine/core-modules/environment/environment.exception'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; @@ -41,9 +41,9 @@ export class GoogleAPIsOauthExchangeCodeForTokenGuard extends AuthGuard( !this.environmentService.get('MESSAGING_PROVIDER_GMAIL_ENABLED') && !this.environmentService.get('CALENDAR_PROVIDER_GOOGLE_ENABLED') ) { - throw new AuthException( + throw new EnvironmentException( 'Google apis auth is not enabled', - AuthExceptionCode.FORBIDDEN_EXCEPTION, + EnvironmentExceptionCode.ENVIRONMENT_VARIABLES_NOT_FOUND, ); } diff --git a/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-request-code.guard.ts b/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-request-code.guard.ts index 5ba00c3d9b73..b6e579302563 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-request-code.guard.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/guards/google-apis-oauth-request-code.guard.ts @@ -1,13 +1,13 @@ import { ExecutionContext, Injectable } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; -import { - AuthException, - AuthExceptionCode, -} from 'src/engine/core-modules/auth/auth.exception'; import { GoogleAPIsOauthRequestCodeStrategy } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-request-code.auth.strategy'; import { TransientTokenService } from 'src/engine/core-modules/auth/token/services/transient-token.service'; import { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util'; +import { + EnvironmentException, + EnvironmentExceptionCode, +} from 'src/engine/core-modules/environment/environment.exception'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; @@ -41,9 +41,9 @@ export class GoogleAPIsOauthRequestCodeGuard extends AuthGuard('google-apis') { !this.environmentService.get('MESSAGING_PROVIDER_GMAIL_ENABLED') && !this.environmentService.get('CALENDAR_PROVIDER_GOOGLE_ENABLED') ) { - throw new AuthException( + throw new EnvironmentException( 'Google apis auth is not enabled', - AuthExceptionCode.FORBIDDEN_EXCEPTION, + EnvironmentExceptionCode.ENVIRONMENT_VARIABLES_NOT_FOUND, ); } diff --git a/packages/twenty-server/src/engine/core-modules/auth/guards/google-provider-enabled.guard.ts b/packages/twenty-server/src/engine/core-modules/auth/guards/google-provider-enabled.guard.ts index b78fa7f64af5..c21bb38a7745 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/guards/google-provider-enabled.guard.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/guards/google-provider-enabled.guard.ts @@ -2,11 +2,11 @@ import { CanActivate, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { - AuthException, - AuthExceptionCode, -} from 'src/engine/core-modules/auth/auth.exception'; import { GoogleStrategy } from 'src/engine/core-modules/auth/strategies/google.auth.strategy'; +import { + EnvironmentException, + EnvironmentExceptionCode, +} from 'src/engine/core-modules/environment/environment.exception'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; @Injectable() @@ -15,9 +15,9 @@ export class GoogleProviderEnabledGuard implements CanActivate { canActivate(): boolean | Promise | Observable { if (!this.environmentService.get('AUTH_GOOGLE_ENABLED')) { - throw new AuthException( + throw new EnvironmentException( 'Google auth is not enabled', - AuthExceptionCode.FORBIDDEN_EXCEPTION, + EnvironmentExceptionCode.ENVIRONMENT_VARIABLES_NOT_FOUND, ); } diff --git a/packages/twenty-server/src/engine/core-modules/auth/guards/microsoft-provider-enabled.guard.ts b/packages/twenty-server/src/engine/core-modules/auth/guards/microsoft-provider-enabled.guard.ts index 9594c41bd371..d6eeac708570 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/guards/microsoft-provider-enabled.guard.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/guards/microsoft-provider-enabled.guard.ts @@ -2,11 +2,11 @@ import { CanActivate, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; -import { - AuthException, - AuthExceptionCode, -} from 'src/engine/core-modules/auth/auth.exception'; import { MicrosoftStrategy } from 'src/engine/core-modules/auth/strategies/microsoft.auth.strategy'; +import { + EnvironmentException, + EnvironmentExceptionCode, +} from 'src/engine/core-modules/environment/environment.exception'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; @Injectable() @@ -15,9 +15,9 @@ export class MicrosoftProviderEnabledGuard implements CanActivate { canActivate(): boolean | Promise | Observable { if (!this.environmentService.get('AUTH_MICROSOFT_ENABLED')) { - throw new AuthException( + throw new EnvironmentException( 'Microsoft auth is not enabled', - AuthExceptionCode.FORBIDDEN_EXCEPTION, + EnvironmentExceptionCode.ENVIRONMENT_VARIABLES_NOT_FOUND, ); } diff --git a/packages/twenty-server/src/engine/core-modules/auth/guards/sso-provider-enabled.guard.ts b/packages/twenty-server/src/engine/core-modules/auth/guards/sso-provider-enabled.guard.ts index ce1d6b11a72d..d2536b8d4131 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/guards/sso-provider-enabled.guard.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/guards/sso-provider-enabled.guard.ts @@ -5,9 +5,9 @@ import { CanActivate, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; import { - AuthException, - AuthExceptionCode, -} from 'src/engine/core-modules/auth/auth.exception'; + EnvironmentException, + EnvironmentExceptionCode, +} from 'src/engine/core-modules/environment/environment.exception'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; @Injectable() @@ -16,9 +16,9 @@ export class SSOProviderEnabledGuard implements CanActivate { canActivate(): boolean | Promise | Observable { if (!this.environmentService.get('ENTERPRISE_KEY')) { - throw new AuthException( + throw new EnvironmentException( 'Enterprise key must be defined to use SSO', - AuthExceptionCode.FORBIDDEN_EXCEPTION, + EnvironmentExceptionCode.ENVIRONMENT_VARIABLES_NOT_FOUND, ); } 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 e4cc32d50dfb..877cab6631bf 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 @@ -2,13 +2,14 @@ import { HttpService } from '@nestjs/axios'; import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; +import { isDefined } from 'class-validator'; import FileType from 'file-type'; import { Repository } from 'typeorm'; import { v4 } from 'uuid'; -import { isDefined } from 'class-validator'; 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,6 +19,11 @@ import { compareHash, hashPassword, } from 'src/engine/core-modules/auth/auth.util'; +import { + EnvironmentException, + EnvironmentExceptionCode, +} from 'src/engine/core-modules/environment/environment.exception'; +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'; @@ -26,9 +32,7 @@ import { Workspace, WorkspaceActivationStatus, } from 'src/engine/core-modules/workspace/workspace.entity'; -import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { getImageBufferFromUrl } from 'src/utils/image'; -import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; export type SignInUpServiceInput = { email: string; @@ -298,9 +302,9 @@ export class SignInUpService { picture: SignInUpServiceInput['picture']; }) { if (this.environmentService.get('IS_SIGN_UP_DISABLED')) { - throw new AuthException( + throw new EnvironmentException( 'Sign up is disabled', - AuthExceptionCode.FORBIDDEN_EXCEPTION, + EnvironmentExceptionCode.ENVIRONMENT_VARIABLES_NOT_FOUND, ); } 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 1443ee7a6bad..5a47f274fd3a 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 @@ -17,6 +17,10 @@ import { AuthContext, JwtPayload, } from 'src/engine/core-modules/auth/types/auth-context.type'; +import { + EnvironmentException, + EnvironmentExceptionCode, +} from 'src/engine/core-modules/environment/environment.exception'; 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'; @@ -42,9 +46,9 @@ export class AccessTokenService { const expiresIn = this.environmentService.get('ACCESS_TOKEN_EXPIRES_IN'); if (!expiresIn) { - throw new AuthException( + throw new EnvironmentException( 'Expiration time for access token is not set', - AuthExceptionCode.INTERNAL_SERVER_ERROR, + EnvironmentExceptionCode.ENVIRONMENT_VARIABLES_NOT_FOUND, ); } diff --git a/packages/twenty-server/src/engine/core-modules/auth/token/services/login-token.service.spec.ts b/packages/twenty-server/src/engine/core-modules/auth/token/services/login-token.service.spec.ts index 62d21a673d45..4876897fa920 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/token/services/login-token.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/token/services/login-token.service.spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { AuthException } from 'src/engine/core-modules/auth/auth.exception'; +import { EnvironmentException } from 'src/engine/core-modules/environment/environment.exception'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; @@ -76,7 +76,7 @@ describe('LoginTokenService', () => { await expect( service.generateLoginToken('test@example.com'), - ).rejects.toThrow(AuthException); + ).rejects.toThrow(EnvironmentException); }); }); diff --git a/packages/twenty-server/src/engine/core-modules/auth/token/services/login-token.service.ts b/packages/twenty-server/src/engine/core-modules/auth/token/services/login-token.service.ts index 24c96b4e42c5..ece51a3a4ddf 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/token/services/login-token.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/token/services/login-token.service.ts @@ -3,11 +3,11 @@ import { Injectable } from '@nestjs/common'; import { addMilliseconds } from 'date-fns'; import ms from 'ms'; -import { - AuthException, - AuthExceptionCode, -} from 'src/engine/core-modules/auth/auth.exception'; import { AuthToken } from 'src/engine/core-modules/auth/dto/token.entity'; +import { + EnvironmentException, + EnvironmentExceptionCode, +} from 'src/engine/core-modules/environment/environment.exception'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; @@ -23,9 +23,9 @@ export class LoginTokenService { const expiresIn = this.environmentService.get('LOGIN_TOKEN_EXPIRES_IN'); if (!expiresIn) { - throw new AuthException( + throw new EnvironmentException( 'Expiration time for access token is not set', - AuthExceptionCode.INTERNAL_SERVER_ERROR, + EnvironmentExceptionCode.ENVIRONMENT_VARIABLES_NOT_FOUND, ); } diff --git a/packages/twenty-server/src/engine/core-modules/auth/token/services/transient-token.service.spec.ts b/packages/twenty-server/src/engine/core-modules/auth/token/services/transient-token.service.spec.ts index adf31855ac53..f32c10622577 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/token/services/transient-token.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/token/services/transient-token.service.spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { AuthException } from 'src/engine/core-modules/auth/auth.exception'; +import { EnvironmentException } from 'src/engine/core-modules/environment/environment.exception'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; @@ -88,7 +88,7 @@ describe('TransientTokenService', () => { await expect( service.generateTransientToken('member-id', 'user-id', 'workspace-id'), - ).rejects.toThrow(AuthException); + ).rejects.toThrow(EnvironmentException); }); }); diff --git a/packages/twenty-server/src/engine/core-modules/auth/token/services/transient-token.service.ts b/packages/twenty-server/src/engine/core-modules/auth/token/services/transient-token.service.ts index a9cad6c97ff3..609a8bb10241 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/token/services/transient-token.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/token/services/transient-token.service.ts @@ -3,11 +3,11 @@ import { Injectable } from '@nestjs/common'; import { addMilliseconds } from 'date-fns'; import ms from 'ms'; -import { - AuthException, - AuthExceptionCode, -} from 'src/engine/core-modules/auth/auth.exception'; import { AuthToken } from 'src/engine/core-modules/auth/dto/token.entity'; +import { + EnvironmentException, + EnvironmentExceptionCode, +} from 'src/engine/core-modules/environment/environment.exception'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; @@ -32,9 +32,9 @@ export class TransientTokenService { ); if (!expiresIn) { - throw new AuthException( + throw new EnvironmentException( 'Expiration time for access token is not set', - AuthExceptionCode.INTERNAL_SERVER_ERROR, + EnvironmentExceptionCode.ENVIRONMENT_VARIABLES_NOT_FOUND, ); } diff --git a/packages/twenty-server/src/engine/core-modules/environment/environment.exception.ts b/packages/twenty-server/src/engine/core-modules/environment/environment.exception.ts new file mode 100644 index 000000000000..825ba0efb62c --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/environment/environment.exception.ts @@ -0,0 +1,12 @@ +import { CustomException } from 'src/utils/custom-exception'; + +export class EnvironmentException extends CustomException { + code: EnvironmentExceptionCode; + constructor(message: string, code: EnvironmentExceptionCode) { + super(message, code); + } +} + +export enum EnvironmentExceptionCode { + ENVIRONMENT_VARIABLES_NOT_FOUND = 'ENVIRONMENT_VARIABLES_NOT_FOUND', +} diff --git a/packages/twenty-server/src/engine/core-modules/exception-handler/drivers/console.driver.ts b/packages/twenty-server/src/engine/core-modules/exception-handler/drivers/console.driver.ts index 8f58ebf84920..4d4c420b0d81 100644 --- a/packages/twenty-server/src/engine/core-modules/exception-handler/drivers/console.driver.ts +++ b/packages/twenty-server/src/engine/core-modules/exception-handler/drivers/console.driver.ts @@ -1,5 +1,4 @@ /* eslint-disable no-console */ -import { ExceptionHandlerUser } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface'; import { ExceptionHandlerOptions } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-options.interface'; import { ExceptionHandlerDriverInterface } from 'src/engine/core-modules/exception-handler/interfaces'; @@ -18,11 +17,4 @@ export class ExceptionHandlerConsoleDriver return []; } - - captureMessage(message: string, user?: ExceptionHandlerUser): void { - console.group('Message Captured'); - console.info(user); - console.info(message); - console.groupEnd(); - } } diff --git a/packages/twenty-server/src/engine/core-modules/exception-handler/drivers/sentry.driver.ts b/packages/twenty-server/src/engine/core-modules/exception-handler/drivers/sentry.driver.ts index 0f904a858c83..363d2b216c39 100644 --- a/packages/twenty-server/src/engine/core-modules/exception-handler/drivers/sentry.driver.ts +++ b/packages/twenty-server/src/engine/core-modules/exception-handler/drivers/sentry.driver.ts @@ -1,7 +1,6 @@ import * as Sentry from '@sentry/node'; import { ExceptionHandlerOptions } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-options.interface'; -import { ExceptionHandlerUser } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface'; import { ExceptionHandlerDriverInterface } from 'src/engine/core-modules/exception-handler/interfaces'; @@ -24,14 +23,16 @@ export class ExceptionHandlerSentryDriver scope.setExtra('document', options.document); } + if (options?.workspace) { + scope.setExtra('workspace', options.workspace); + } + if (options?.user) { scope.setUser({ id: options.user.id, email: options.user.email, firstName: options.user.firstName, lastName: options.user.lastName, - workspaceId: options.user.workspaceId, - workspaceDisplayName: options.user.workspaceDisplayName, }); } @@ -69,21 +70,4 @@ export class ExceptionHandlerSentryDriver return eventIds; } - - captureMessage(message: string, user?: ExceptionHandlerUser) { - Sentry.captureMessage(message, (scope) => { - if (user) { - scope.setUser({ - id: user.id, - email: user.email, - firstName: user.firstName, - lastName: user.lastName, - workspaceId: user.workspaceId, - workspaceDisplayName: user.workspaceDisplayName, - }); - } - - return scope; - }); - } } diff --git a/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-driver.interface.ts b/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-driver.interface.ts index 361d867fff89..d98893eea732 100644 --- a/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-driver.interface.ts +++ b/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-driver.interface.ts @@ -1,10 +1,8 @@ import { ExceptionHandlerOptions } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-options.interface'; -import { ExceptionHandlerUser } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface'; export interface ExceptionHandlerDriverInterface { captureExceptions( exceptions: ReadonlyArray, options?: ExceptionHandlerOptions, ): string[]; - captureMessage(message: string, user?: ExceptionHandlerUser): void; } diff --git a/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-options.interface.ts b/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-options.interface.ts index 73dd468ac11e..8cf7d102e477 100644 --- a/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-options.interface.ts +++ b/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-options.interface.ts @@ -1,6 +1,7 @@ import { OperationTypeNode } from 'graphql'; import { ExceptionHandlerUser } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface'; +import { ExceptionHandlerWorkspace } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-workspace.interface'; export interface ExceptionHandlerOptions { operation?: { @@ -9,4 +10,5 @@ export interface ExceptionHandlerOptions { }; document?: string; user?: ExceptionHandlerUser | null; + workspace?: ExceptionHandlerWorkspace | null; } diff --git a/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface.ts b/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface.ts index ddfc61033864..bee6bfb47349 100644 --- a/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface.ts +++ b/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface.ts @@ -3,6 +3,4 @@ export interface ExceptionHandlerUser { email?: string; firstName?: string; lastName?: string; - workspaceId?: string; - workspaceDisplayName?: string; } diff --git a/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-workspace.interface.ts b/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-workspace.interface.ts new file mode 100644 index 000000000000..9614a17d624b --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/exception-handler/interfaces/exception-handler-workspace.interface.ts @@ -0,0 +1,6 @@ +export interface ExceptionHandlerWorkspace { + id?: string; + displayName?: string; + activationStatus?: string; + createdAt?: string; +} diff --git a/packages/twenty-server/src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook.ts b/packages/twenty-server/src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook.ts index ff466d3f3324..1d1abd02ecf8 100644 --- a/packages/twenty-server/src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook.ts +++ b/packages/twenty-server/src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook.ts @@ -8,10 +8,10 @@ import { GraphQLError, Kind, OperationDefinitionNode, print } from 'graphql'; import { GraphQLContext } from 'src/engine/api/graphql/graphql-config/interfaces/graphql-context.interface'; +import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service'; import { generateGraphQLErrorFromError } from 'src/engine/core-modules/graphql/utils/generate-graphql-error-from-error.util'; import { BaseGraphQLError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; import { shouldCaptureException } from 'src/engine/core-modules/graphql/utils/should-capture-exception.util'; -import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service'; type GraphQLErrorHandlerHookOptions = { /** @@ -93,6 +93,14 @@ export const useGraphQLErrorHandlerHook = < }, document, user, + workspace: { + id: args.contextValue.req.workspace?.id, + displayName: args.contextValue.req.workspace?.displayName, + createdAt: + args.contextValue.req.workspace?.createdAt.toISOString(), + activationStatus: + args.contextValue.req.workspace?.activationStatus, + }, }, ); diff --git a/packages/twenty-server/src/engine/utils/global-exception-handler.util.ts b/packages/twenty-server/src/engine/utils/global-exception-handler.util.ts index 3a938d4ce7ba..24e8dbfa7f0a 100644 --- a/packages/twenty-server/src/engine/utils/global-exception-handler.util.ts +++ b/packages/twenty-server/src/engine/utils/global-exception-handler.util.ts @@ -3,7 +3,9 @@ import { HttpException } from '@nestjs/common'; import { GraphQLError } from 'graphql'; import { ExceptionHandlerUser } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface'; +import { ExceptionHandlerWorkspace } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-workspace.interface'; +import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service'; import { AuthenticationError, BaseGraphQLError, @@ -15,7 +17,6 @@ import { TimeoutError, ValidationError, } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; -import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service'; const graphQLPredefinedExceptions = { 400: ValidationError, @@ -42,8 +43,9 @@ export const handleExceptionAndConvertToGraphQLError = ( exception: Error, exceptionHandlerService: ExceptionHandlerService, user?: ExceptionHandlerUser, + workspace?: ExceptionHandlerWorkspace, ): BaseGraphQLError => { - handleException(exception, exceptionHandlerService, user); + handleException(exception, exceptionHandlerService, user, workspace); return convertExceptionToGraphQLError(exception); }; @@ -74,12 +76,13 @@ const handleException = ( exception: Error, exceptionHandlerService: ExceptionHandlerService, user?: ExceptionHandlerUser, + workspace?: ExceptionHandlerWorkspace, ): void => { if (shouldFilterException(exception)) { return; } - exceptionHandlerService.captureExceptions([exception], { user }); + exceptionHandlerService.captureExceptions([exception], { user, workspace }); }; export const convertExceptionToGraphQLError = ( 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 d755b2cb984c..8a26b57319ee 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 @@ -78,8 +78,8 @@ export class CalendarEventListFetchCronJob { } } catch (error) { this.exceptionHandlerService.captureExceptions([error], { - user: { - workspaceId: activeWorkspace.id, + workspace: { + id: activeWorkspace.id, }, }); } 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 8e9c02cb364b..204177a9e98a 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 @@ -75,8 +75,8 @@ export class CalendarEventsImportCronJob { } } catch (error) { this.exceptionHandlerService.captureExceptions([error], { - user: { - workspaceId: activeWorkspace.id, + workspace: { + id: activeWorkspace.id, }, }); } 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 7987a8f1c718..96b95de06f7b 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 @@ -52,8 +52,8 @@ export class CalendarOngoingStaleCronJob { ); } catch (error) { this.exceptionHandlerService.captureExceptions([error], { - user: { - workspaceId: activeWorkspace.id, + workspace: { + id: activeWorkspace.id, }, }); } 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 30c41ab7424f..072558bbcfee 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 @@ -79,8 +79,8 @@ export class MessagingMessageListFetchCronJob { } } catch (error) { this.exceptionHandlerService.captureExceptions([error], { - user: { - workspaceId: activeWorkspace.id, + workspace: { + id: activeWorkspace.id, }, }); } 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 c580e5df67fc..86d879e89bfa 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 @@ -76,8 +76,8 @@ export class MessagingMessagesImportCronJob { } } catch (error) { this.exceptionHandlerService.captureExceptions([error], { - user: { - workspaceId: activeWorkspace.id, + workspace: { + id: activeWorkspace.id, }, }); } 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 3dcdb3bac311..fc3771f518f8 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 @@ -52,8 +52,8 @@ export class MessagingOngoingStaleCronJob { ); } catch (error) { this.exceptionHandlerService.captureExceptions([error], { - user: { - workspaceId: activeWorkspace.id, + workspace: { + id: activeWorkspace.id, }, }); } 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 04c1fe6affef..65e6bf9c42ed 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 @@ -82,8 +82,8 @@ export class MessagingMessageChannelSyncStatusMonitoringCronJob { } } catch (error) { this.exceptionHandlerService.captureExceptions([error], { - user: { - workspaceId: activeWorkspace.id, + workspace: { + id: activeWorkspace.id, }, }); }