rename core-module environment to twenty-config (#11445)

closes https://github.com/twentyhq/core-team-issues/issues/759
This commit is contained in:
nitin
2025-04-09 17:41:26 +05:30
committed by GitHub
parent fe6d0241a8
commit bd3ec6d5e3
193 changed files with 1454 additions and 1422 deletions

View File

@ -145,6 +145,25 @@ export type Billing = {
trialPeriods: Array<BillingTrialPeriodDto>; trialPeriods: Array<BillingTrialPeriodDto>;
}; };
export type BillingEndTrialPeriodOutput = {
__typename?: 'BillingEndTrialPeriodOutput';
/** Boolean that confirms if a payment method was found */
hasPaymentMethod: Scalars['Boolean']['output'];
/** Updated subscription status */
status?: Maybe<SubscriptionStatus>;
};
export type BillingMeteredProductUsageOutput = {
__typename?: 'BillingMeteredProductUsageOutput';
includedFreeQuantity: Scalars['Float']['output'];
periodEnd: Scalars['DateTime']['output'];
periodStart: Scalars['DateTime']['output'];
productKey: BillingProductKey;
totalCostCents: Scalars['Float']['output'];
unitPriceCents: Scalars['Float']['output'];
usageQuantity: Scalars['Float']['output'];
};
/** The different billing plans available */ /** The different billing plans available */
export enum BillingPlanKey { export enum BillingPlanKey {
ENTERPRISE = 'ENTERPRISE', ENTERPRISE = 'ENTERPRISE',
@ -153,9 +172,9 @@ export enum BillingPlanKey {
export type BillingPlanOutput = { export type BillingPlanOutput = {
__typename?: 'BillingPlanOutput'; __typename?: 'BillingPlanOutput';
baseProduct: BillingProductDto; baseProduct: BillingProduct;
meteredProducts: Array<BillingProductDto>; meteredProducts: Array<BillingProduct>;
otherLicensedProducts: Array<BillingProductDto>; otherLicensedProducts: Array<BillingProduct>;
planKey: BillingPlanKey; planKey: BillingPlanKey;
}; };
@ -191,13 +210,26 @@ export enum BillingPriceTiersMode {
export type BillingPriceUnionDto = BillingPriceLicensedDto | BillingPriceMeteredDto; export type BillingPriceUnionDto = BillingPriceLicensedDto | BillingPriceMeteredDto;
export type BillingProductDto = { export type BillingProduct = {
__typename?: 'BillingProductDTO'; __typename?: 'BillingProduct';
description: Scalars['String']['output']; description: Scalars['String']['output'];
images?: Maybe<Array<Scalars['String']['output']>>; images?: Maybe<Array<Scalars['String']['output']>>;
metadata: BillingProductMetadata;
name: Scalars['String']['output']; name: Scalars['String']['output'];
prices: Array<BillingPriceUnionDto>; prices?: Maybe<Array<BillingPriceUnionDto>>;
type: BillingUsageType; };
/** The different billing products available */
export enum BillingProductKey {
BASE_PRODUCT = 'BASE_PRODUCT',
WORKFLOW_NODE_EXECUTION = 'WORKFLOW_NODE_EXECUTION'
}
export type BillingProductMetadata = {
__typename?: 'BillingProductMetadata';
planKey: BillingPlanKey;
priceUsageBased: BillingUsageType;
productKey: BillingProductKey;
}; };
export type BillingSessionOutput = { export type BillingSessionOutput = {
@ -207,11 +239,19 @@ export type BillingSessionOutput = {
export type BillingSubscription = { export type BillingSubscription = {
__typename?: 'BillingSubscription'; __typename?: 'BillingSubscription';
billingSubscriptionItems?: Maybe<Array<BillingSubscriptionItem>>;
id: Scalars['UUID']['output']; id: Scalars['UUID']['output'];
interval?: Maybe<SubscriptionInterval>; interval?: Maybe<SubscriptionInterval>;
status: SubscriptionStatus; status: SubscriptionStatus;
}; };
export type BillingSubscriptionItem = {
__typename?: 'BillingSubscriptionItem';
billingProduct?: Maybe<BillingProduct>;
hasReachedCurrentPeriodCap: Scalars['Boolean']['output'];
id: Scalars['UUID']['output'];
};
export type BillingTrialPeriodDto = { export type BillingTrialPeriodDto = {
__typename?: 'BillingTrialPeriodDTO'; __typename?: 'BillingTrialPeriodDTO';
duration: Scalars['Float']['output']; duration: Scalars['Float']['output'];
@ -280,6 +320,49 @@ export type ComputeStepOutputSchemaInput = {
step: Scalars['JSON']['input']; step: Scalars['JSON']['input'];
}; };
export type ConfigVariable = {
__typename?: 'ConfigVariable';
description: Scalars['String']['output'];
isSensitive: Scalars['Boolean']['output'];
name: Scalars['String']['output'];
value: Scalars['String']['output'];
};
export enum ConfigVariablesGroup {
AnalyticsConfig = 'AnalyticsConfig',
BillingConfig = 'BillingConfig',
CaptchaConfig = 'CaptchaConfig',
CloudflareConfig = 'CloudflareConfig',
EmailSettings = 'EmailSettings',
ExceptionHandler = 'ExceptionHandler',
GoogleAuth = 'GoogleAuth',
LLM = 'LLM',
Logging = 'Logging',
Metering = 'Metering',
MicrosoftAuth = 'MicrosoftAuth',
Other = 'Other',
RateLimiting = 'RateLimiting',
SSL = 'SSL',
ServerConfig = 'ServerConfig',
ServerlessConfig = 'ServerlessConfig',
StorageConfig = 'StorageConfig',
SupportChatConfig = 'SupportChatConfig',
TokensDuration = 'TokensDuration'
}
export type ConfigVariablesGroupData = {
__typename?: 'ConfigVariablesGroupData';
description: Scalars['String']['output'];
isHiddenOnLoad: Scalars['Boolean']['output'];
name: ConfigVariablesGroup;
variables: Array<ConfigVariable>;
};
export type ConfigVariablesOutput = {
__typename?: 'ConfigVariablesOutput';
groups: Array<ConfigVariablesGroupData>;
};
export type CreateAppTokenInput = { export type CreateAppTokenInput = {
expiresAt: Scalars['DateTime']['input']; expiresAt: Scalars['DateTime']['input'];
}; };
@ -498,49 +581,6 @@ export type EmailPasswordResetLink = {
success: Scalars['Boolean']['output']; success: Scalars['Boolean']['output'];
}; };
export type EnvironmentVariable = {
__typename?: 'EnvironmentVariable';
description: Scalars['String']['output'];
name: Scalars['String']['output'];
sensitive: Scalars['Boolean']['output'];
value: Scalars['String']['output'];
};
export enum EnvironmentVariablesGroup {
AnalyticsConfig = 'AnalyticsConfig',
BillingConfig = 'BillingConfig',
CaptchaConfig = 'CaptchaConfig',
CloudflareConfig = 'CloudflareConfig',
EmailSettings = 'EmailSettings',
ExceptionHandler = 'ExceptionHandler',
GoogleAuth = 'GoogleAuth',
LLM = 'LLM',
Logging = 'Logging',
Metering = 'Metering',
MicrosoftAuth = 'MicrosoftAuth',
Other = 'Other',
RateLimiting = 'RateLimiting',
SSL = 'SSL',
ServerConfig = 'ServerConfig',
ServerlessConfig = 'ServerlessConfig',
StorageConfig = 'StorageConfig',
SupportChatConfig = 'SupportChatConfig',
TokensDuration = 'TokensDuration'
}
export type EnvironmentVariablesGroupData = {
__typename?: 'EnvironmentVariablesGroupData';
description: Scalars['String']['output'];
isHiddenOnLoad: Scalars['Boolean']['output'];
name: EnvironmentVariablesGroup;
variables: Array<EnvironmentVariable>;
};
export type EnvironmentVariablesOutput = {
__typename?: 'EnvironmentVariablesOutput';
groups: Array<EnvironmentVariablesGroupData>;
};
export type ExecuteServerlessFunctionInput = { export type ExecuteServerlessFunctionInput = {
/** Id of the serverless function to execute */ /** Id of the serverless function to execute */
id: Scalars['UUID']['input']; id: Scalars['UUID']['input'];
@ -908,6 +948,7 @@ export type Mutation = {
editSSOIdentityProvider: EditSsoOutput; editSSOIdentityProvider: EditSsoOutput;
emailPasswordResetLink: EmailPasswordResetLink; emailPasswordResetLink: EmailPasswordResetLink;
enablePostgresProxy: PostgresCredentials; enablePostgresProxy: PostgresCredentials;
endSubscriptionTrialPeriod: BillingEndTrialPeriodOutput;
executeOneServerlessFunction: ServerlessFunctionExecutionResult; executeOneServerlessFunction: ServerlessFunctionExecutionResult;
generateApiKeyToken: ApiKeyToken; generateApiKeyToken: ApiKeyToken;
generateTransientToken: TransientToken; generateTransientToken: TransientToken;
@ -926,11 +967,11 @@ export type Mutation = {
signUpInNewWorkspace: SignUpOutput; signUpInNewWorkspace: SignUpOutput;
skipSyncEmailOnboardingStep: OnboardingStepSuccess; skipSyncEmailOnboardingStep: OnboardingStepSuccess;
submitFormStep: Scalars['Boolean']['output']; submitFormStep: Scalars['Boolean']['output'];
switchToYearlyInterval: BillingUpdateOutput;
syncRemoteTable: RemoteTable; syncRemoteTable: RemoteTable;
syncRemoteTableSchemaChanges: RemoteTable; syncRemoteTableSchemaChanges: RemoteTable;
track: Analytics; track: Analytics;
unsyncRemoteTable: RemoteTable; unsyncRemoteTable: RemoteTable;
updateBillingSubscription: BillingUpdateOutput;
updateLabPublicFeatureFlag: FeatureFlag; updateLabPublicFeatureFlag: FeatureFlag;
updateOneField: Field; updateOneField: Field;
updateOneObject: Object; updateOneObject: Object;
@ -1524,8 +1565,9 @@ export type Query = {
findWorkspaceInvitations: Array<WorkspaceInvitation>; findWorkspaceInvitations: Array<WorkspaceInvitation>;
getApprovedAccessDomains: Array<ApprovedAccessDomain>; getApprovedAccessDomains: Array<ApprovedAccessDomain>;
getAvailablePackages: Scalars['JSON']['output']; getAvailablePackages: Scalars['JSON']['output'];
getEnvironmentVariablesGrouped: EnvironmentVariablesOutput; getConfigVariablesGrouped: ConfigVariablesOutput;
getIndicatorHealthStatus: AdminPanelHealthServiceData; getIndicatorHealthStatus: AdminPanelHealthServiceData;
getMeteredProductsUsage: Array<BillingMeteredProductUsageOutput>;
getPostgresCredentials?: Maybe<PostgresCredentials>; getPostgresCredentials?: Maybe<PostgresCredentials>;
getPublicWorkspaceDataByDomain: PublicWorkspaceDataOutput; getPublicWorkspaceDataByDomain: PublicWorkspaceDataOutput;
getQueueMetrics: QueueMetricsData; getQueueMetrics: QueueMetricsData;
@ -1545,6 +1587,7 @@ export type Query = {
relationMetadata: RelationMetadataConnection; relationMetadata: RelationMetadataConnection;
search: Array<SearchRecord>; search: Array<SearchRecord>;
validatePasswordResetToken: ValidatePasswordResetToken; validatePasswordResetToken: ValidatePasswordResetToken;
versionInfo: VersionInfo;
}; };
@ -2369,6 +2412,12 @@ export type ValidatePasswordResetToken = {
id: Scalars['String']['output']; id: Scalars['String']['output'];
}; };
export type VersionInfo = {
__typename?: 'VersionInfo';
currentVersion?: Maybe<Scalars['String']['output']>;
latestVersion: Scalars['String']['output'];
};
export type WorkerQueueMetrics = { export type WorkerQueueMetrics = {
__typename?: 'WorkerQueueMetrics'; __typename?: 'WorkerQueueMetrics';
active: Scalars['Float']['output']; active: Scalars['Float']['output'];

View File

@ -312,6 +312,49 @@ export type ComputeStepOutputSchemaInput = {
step: Scalars['JSON']; step: Scalars['JSON'];
}; };
export type ConfigVariable = {
__typename?: 'ConfigVariable';
description: Scalars['String'];
isSensitive: Scalars['Boolean'];
name: Scalars['String'];
value: Scalars['String'];
};
export enum ConfigVariablesGroup {
AnalyticsConfig = 'AnalyticsConfig',
BillingConfig = 'BillingConfig',
CaptchaConfig = 'CaptchaConfig',
CloudflareConfig = 'CloudflareConfig',
EmailSettings = 'EmailSettings',
ExceptionHandler = 'ExceptionHandler',
GoogleAuth = 'GoogleAuth',
LLM = 'LLM',
Logging = 'Logging',
Metering = 'Metering',
MicrosoftAuth = 'MicrosoftAuth',
Other = 'Other',
RateLimiting = 'RateLimiting',
SSL = 'SSL',
ServerConfig = 'ServerConfig',
ServerlessConfig = 'ServerlessConfig',
StorageConfig = 'StorageConfig',
SupportChatConfig = 'SupportChatConfig',
TokensDuration = 'TokensDuration'
}
export type ConfigVariablesGroupData = {
__typename?: 'ConfigVariablesGroupData';
description: Scalars['String'];
isHiddenOnLoad: Scalars['Boolean'];
name: ConfigVariablesGroup;
variables: Array<ConfigVariable>;
};
export type ConfigVariablesOutput = {
__typename?: 'ConfigVariablesOutput';
groups: Array<ConfigVariablesGroupData>;
};
export type CreateApprovedAccessDomainInput = { export type CreateApprovedAccessDomainInput = {
domain: Scalars['String']; domain: Scalars['String'];
email: Scalars['String']; email: Scalars['String'];
@ -469,49 +512,6 @@ export type EmailPasswordResetLink = {
success: Scalars['Boolean']; success: Scalars['Boolean'];
}; };
export type EnvironmentVariable = {
__typename?: 'EnvironmentVariable';
description: Scalars['String'];
name: Scalars['String'];
sensitive: Scalars['Boolean'];
value: Scalars['String'];
};
export enum EnvironmentVariablesGroup {
AnalyticsConfig = 'AnalyticsConfig',
BillingConfig = 'BillingConfig',
CaptchaConfig = 'CaptchaConfig',
CloudflareConfig = 'CloudflareConfig',
EmailSettings = 'EmailSettings',
ExceptionHandler = 'ExceptionHandler',
GoogleAuth = 'GoogleAuth',
LLM = 'LLM',
Logging = 'Logging',
Metering = 'Metering',
MicrosoftAuth = 'MicrosoftAuth',
Other = 'Other',
RateLimiting = 'RateLimiting',
SSL = 'SSL',
ServerConfig = 'ServerConfig',
ServerlessConfig = 'ServerlessConfig',
StorageConfig = 'StorageConfig',
SupportChatConfig = 'SupportChatConfig',
TokensDuration = 'TokensDuration'
}
export type EnvironmentVariablesGroupData = {
__typename?: 'EnvironmentVariablesGroupData';
description: Scalars['String'];
isHiddenOnLoad: Scalars['Boolean'];
name: EnvironmentVariablesGroup;
variables: Array<EnvironmentVariable>;
};
export type EnvironmentVariablesOutput = {
__typename?: 'EnvironmentVariablesOutput';
groups: Array<EnvironmentVariablesGroupData>;
};
export type ExecuteServerlessFunctionInput = { export type ExecuteServerlessFunctionInput = {
/** Id of the serverless function to execute */ /** Id of the serverless function to execute */
id: Scalars['UUID']; id: Scalars['UUID'];
@ -1428,7 +1428,7 @@ export type Query = {
findWorkspaceInvitations: Array<WorkspaceInvitation>; findWorkspaceInvitations: Array<WorkspaceInvitation>;
getApprovedAccessDomains: Array<ApprovedAccessDomain>; getApprovedAccessDomains: Array<ApprovedAccessDomain>;
getAvailablePackages: Scalars['JSON']; getAvailablePackages: Scalars['JSON'];
getEnvironmentVariablesGrouped: EnvironmentVariablesOutput; getConfigVariablesGrouped: ConfigVariablesOutput;
getIndicatorHealthStatus: AdminPanelHealthServiceData; getIndicatorHealthStatus: AdminPanelHealthServiceData;
getMeteredProductsUsage: Array<BillingMeteredProductUsageOutput>; getMeteredProductsUsage: Array<BillingMeteredProductUsageOutput>;
getPostgresCredentials?: Maybe<PostgresCredentials>; getPostgresCredentials?: Maybe<PostgresCredentials>;
@ -2625,10 +2625,10 @@ export type UserLookupAdminPanelMutationVariables = Exact<{
export type UserLookupAdminPanelMutation = { __typename?: 'Mutation', userLookupAdminPanel: { __typename?: 'UserLookup', user: { __typename?: 'UserInfo', id: string, email: string, firstName?: string | null, lastName?: string | null }, workspaces: Array<{ __typename?: 'WorkspaceInfo', id: string, name: string, logo?: string | null, totalUsers: number, allowImpersonation: boolean, users: Array<{ __typename?: 'UserInfo', id: string, email: string, firstName?: string | null, lastName?: string | null }>, featureFlags: Array<{ __typename?: 'FeatureFlag', key: FeatureFlagKey, value: boolean }> }> } }; export type UserLookupAdminPanelMutation = { __typename?: 'Mutation', userLookupAdminPanel: { __typename?: 'UserLookup', user: { __typename?: 'UserInfo', id: string, email: string, firstName?: string | null, lastName?: string | null }, workspaces: Array<{ __typename?: 'WorkspaceInfo', id: string, name: string, logo?: string | null, totalUsers: number, allowImpersonation: boolean, users: Array<{ __typename?: 'UserInfo', id: string, email: string, firstName?: string | null, lastName?: string | null }>, featureFlags: Array<{ __typename?: 'FeatureFlag', key: FeatureFlagKey, value: boolean }> }> } };
export type GetEnvironmentVariablesGroupedQueryVariables = Exact<{ [key: string]: never; }>; export type GetConfigVariablesGroupedQueryVariables = Exact<{ [key: string]: never; }>;
export type GetEnvironmentVariablesGroupedQuery = { __typename?: 'Query', getEnvironmentVariablesGrouped: { __typename?: 'EnvironmentVariablesOutput', groups: Array<{ __typename?: 'EnvironmentVariablesGroupData', name: EnvironmentVariablesGroup, description: string, isHiddenOnLoad: boolean, variables: Array<{ __typename?: 'EnvironmentVariable', name: string, description: string, value: string, sensitive: boolean }> }> } }; export type GetConfigVariablesGroupedQuery = { __typename?: 'Query', getConfigVariablesGrouped: { __typename?: 'ConfigVariablesOutput', groups: Array<{ __typename?: 'ConfigVariablesGroupData', name: ConfigVariablesGroup, description: string, isHiddenOnLoad: boolean, variables: Array<{ __typename?: 'ConfigVariable', name: string, description: string, value: string, isSensitive: boolean }> }> } };
export type GetVersionInfoQueryVariables = Exact<{ [key: string]: never; }>; export type GetVersionInfoQueryVariables = Exact<{ [key: string]: never; }>;
@ -4578,9 +4578,9 @@ export function useUserLookupAdminPanelMutation(baseOptions?: Apollo.MutationHoo
export type UserLookupAdminPanelMutationHookResult = ReturnType<typeof useUserLookupAdminPanelMutation>; export type UserLookupAdminPanelMutationHookResult = ReturnType<typeof useUserLookupAdminPanelMutation>;
export type UserLookupAdminPanelMutationResult = Apollo.MutationResult<UserLookupAdminPanelMutation>; export type UserLookupAdminPanelMutationResult = Apollo.MutationResult<UserLookupAdminPanelMutation>;
export type UserLookupAdminPanelMutationOptions = Apollo.BaseMutationOptions<UserLookupAdminPanelMutation, UserLookupAdminPanelMutationVariables>; export type UserLookupAdminPanelMutationOptions = Apollo.BaseMutationOptions<UserLookupAdminPanelMutation, UserLookupAdminPanelMutationVariables>;
export const GetEnvironmentVariablesGroupedDocument = gql` export const GetConfigVariablesGroupedDocument = gql`
query GetEnvironmentVariablesGrouped { query GetConfigVariablesGrouped {
getEnvironmentVariablesGrouped { getConfigVariablesGrouped {
groups { groups {
name name
description description
@ -4589,7 +4589,7 @@ export const GetEnvironmentVariablesGroupedDocument = gql`
name name
description description
value value
sensitive isSensitive
} }
} }
} }
@ -4597,31 +4597,31 @@ export const GetEnvironmentVariablesGroupedDocument = gql`
`; `;
/** /**
* __useGetEnvironmentVariablesGroupedQuery__ * __useGetConfigVariablesGroupedQuery__
* *
* To run a query within a React component, call `useGetEnvironmentVariablesGroupedQuery` and pass it any options that fit your needs. * To run a query within a React component, call `useGetConfigVariablesGroupedQuery` and pass it any options that fit your needs.
* When your component renders, `useGetEnvironmentVariablesGroupedQuery` returns an object from Apollo Client that contains loading, error, and data properties * When your component renders, `useGetConfigVariablesGroupedQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI. * you can use to render your UI.
* *
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
* *
* @example * @example
* const { data, loading, error } = useGetEnvironmentVariablesGroupedQuery({ * const { data, loading, error } = useGetConfigVariablesGroupedQuery({
* variables: { * variables: {
* }, * },
* }); * });
*/ */
export function useGetEnvironmentVariablesGroupedQuery(baseOptions?: Apollo.QueryHookOptions<GetEnvironmentVariablesGroupedQuery, GetEnvironmentVariablesGroupedQueryVariables>) { export function useGetConfigVariablesGroupedQuery(baseOptions?: Apollo.QueryHookOptions<GetConfigVariablesGroupedQuery, GetConfigVariablesGroupedQueryVariables>) {
const options = {...defaultOptions, ...baseOptions} const options = {...defaultOptions, ...baseOptions}
return Apollo.useQuery<GetEnvironmentVariablesGroupedQuery, GetEnvironmentVariablesGroupedQueryVariables>(GetEnvironmentVariablesGroupedDocument, options); return Apollo.useQuery<GetConfigVariablesGroupedQuery, GetConfigVariablesGroupedQueryVariables>(GetConfigVariablesGroupedDocument, options);
} }
export function useGetEnvironmentVariablesGroupedLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetEnvironmentVariablesGroupedQuery, GetEnvironmentVariablesGroupedQueryVariables>) { export function useGetConfigVariablesGroupedLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetConfigVariablesGroupedQuery, GetConfigVariablesGroupedQueryVariables>) {
const options = {...defaultOptions, ...baseOptions} const options = {...defaultOptions, ...baseOptions}
return Apollo.useLazyQuery<GetEnvironmentVariablesGroupedQuery, GetEnvironmentVariablesGroupedQueryVariables>(GetEnvironmentVariablesGroupedDocument, options); return Apollo.useLazyQuery<GetConfigVariablesGroupedQuery, GetConfigVariablesGroupedQueryVariables>(GetConfigVariablesGroupedDocument, options);
} }
export type GetEnvironmentVariablesGroupedQueryHookResult = ReturnType<typeof useGetEnvironmentVariablesGroupedQuery>; export type GetConfigVariablesGroupedQueryHookResult = ReturnType<typeof useGetConfigVariablesGroupedQuery>;
export type GetEnvironmentVariablesGroupedLazyQueryHookResult = ReturnType<typeof useGetEnvironmentVariablesGroupedLazyQuery>; export type GetConfigVariablesGroupedLazyQueryHookResult = ReturnType<typeof useGetConfigVariablesGroupedLazyQuery>;
export type GetEnvironmentVariablesGroupedQueryResult = Apollo.QueryResult<GetEnvironmentVariablesGroupedQuery, GetEnvironmentVariablesGroupedQueryVariables>; export type GetConfigVariablesGroupedQueryResult = Apollo.QueryResult<GetConfigVariablesGroupedQuery, GetConfigVariablesGroupedQueryVariables>;
export const GetVersionInfoDocument = gql` export const GetVersionInfoDocument = gql`
query GetVersionInfo { query GetVersionInfo {
versionInfo { versionInfo {

View File

@ -5,10 +5,10 @@ import { SettingsPath } from '@/types/SettingsPath';
import { useTheme } from '@emotion/react'; import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { useGetEnvironmentVariablesGroupedQuery } from '~/generated/graphql';
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
import { Card, Section } from 'twenty-ui/layout';
import { H2Title, IconHeartRateMonitor } from 'twenty-ui/display'; import { H2Title, IconHeartRateMonitor } from 'twenty-ui/display';
import { Card, Section } from 'twenty-ui/layout';
import { useGetConfigVariablesGroupedQuery } from '~/generated/graphql';
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
const StyledGroupContainer = styled.div``; const StyledGroupContainer = styled.div``;
@ -22,17 +22,17 @@ const StyledCard = styled(Card)`
export const SettingsAdminEnvVariables = () => { export const SettingsAdminEnvVariables = () => {
const theme = useTheme(); const theme = useTheme();
const { data: environmentVariables, loading: environmentVariablesLoading } = const { data: configVariables, loading: configVariablesLoading } =
useGetEnvironmentVariablesGroupedQuery({ useGetConfigVariablesGroupedQuery({
fetchPolicy: 'network-only', fetchPolicy: 'network-only',
}); });
const visibleGroups = const visibleGroups =
environmentVariables?.getEnvironmentVariablesGrouped.groups.filter( configVariables?.getConfigVariablesGrouped.groups.filter(
(group) => !group.isHiddenOnLoad, (group) => !group.isHiddenOnLoad,
) ?? []; ) ?? [];
if (environmentVariablesLoading) { if (configVariablesLoading) {
return <SettingsAdminTabSkeletonLoader />; return <SettingsAdminTabSkeletonLoader />;
} }

View File

@ -6,16 +6,16 @@ import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { useState } from 'react'; import { useState } from 'react';
import { AnimatedExpandableContainer } from 'twenty-ui/layout';
import { IconChevronRight, IconEye, IconEyeOff } from 'twenty-ui/display'; import { IconChevronRight, IconEye, IconEyeOff } from 'twenty-ui/display';
import { LightIconButton } from 'twenty-ui/input'; import { LightIconButton } from 'twenty-ui/input';
import { AnimatedExpandableContainer } from 'twenty-ui/layout';
type SettingsAdminEnvVariablesRowProps = { type SettingsAdminEnvVariablesRowProps = {
variable: { variable: {
name: string; name: string;
description: string; description: string;
value: string; value: string;
sensitive: boolean; isSensitive: boolean;
}; };
isExpanded: boolean; isExpanded: boolean;
onExpandToggle: (name: string) => void; onExpandToggle: (name: string) => void;
@ -79,7 +79,7 @@ export const SettingsAdminEnvVariablesRow = ({
const displayValue = const displayValue =
variable.value === '' variable.value === ''
? 'null' ? 'null'
: variable.sensitive && !showSensitiveValue : variable.isSensitive && !showSensitiveValue
? '••••••' ? '••••••'
: variable.value; : variable.value;
@ -112,7 +112,7 @@ export const SettingsAdminEnvVariablesRow = ({
displayText={displayValue} displayText={displayValue}
multiline={true} multiline={true}
/> />
{variable.sensitive && variable.value !== '' && ( {variable.isSensitive && variable.value !== '' && (
<LightIconButton <LightIconButton
Icon={showSensitiveValue ? IconEyeOff : IconEye} Icon={showSensitiveValue ? IconEyeOff : IconEye}
size="small" size="small"

View File

@ -15,7 +15,7 @@ type SettingsAdminEnvVariablesTableProps = {
name: string; name: string;
description: string; description: string;
value: string; value: string;
sensitive: boolean; isSensitive: boolean;
}>; }>;
}; };

View File

@ -1,8 +1,8 @@
import { gql } from '@apollo/client'; import { gql } from '@apollo/client';
export const GET_ENVIRONMENT_VARIABLES_GROUPED = gql` export const GET_CONFIG_VARIABLES_GROUPED = gql`
query GetEnvironmentVariablesGrouped { query GetConfigVariablesGrouped {
getEnvironmentVariablesGrouped { getConfigVariablesGrouped {
groups { groups {
name name
description description
@ -11,7 +11,7 @@ export const GET_ENVIRONMENT_VARIABLES_GROUPED = gql`
name name
description description
value value
sensitive isSensitive
} }
} }
} }

View File

@ -5,24 +5,26 @@ import { SettingsPath } from '@/types/SettingsPath';
import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer'; import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { t } from '@lingui/core/macro'; import { t } from '@lingui/core/macro';
import { useGetEnvironmentVariablesGroupedQuery } from '~/generated/graphql';
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
import { H2Title } from 'twenty-ui/display'; import { H2Title } from 'twenty-ui/display';
import { useGetConfigVariablesGroupedQuery } from '~/generated/graphql';
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
const StyledGroupContainer = styled.div``; const StyledGroupContainer = styled.div``;
export const SettingsAdminSecondaryEnvVariables = () => { export const SettingsAdminSecondaryEnvVariables = () => {
const { data: environmentVariables, loading: environmentVariablesLoading } = const {
useGetEnvironmentVariablesGroupedQuery({ data: secondaryConfigVariables,
fetchPolicy: 'network-only', loading: secondaryConfigVariablesLoading,
}); } = useGetConfigVariablesGroupedQuery({
fetchPolicy: 'network-only',
});
const hiddenGroups = const hiddenGroups =
environmentVariables?.getEnvironmentVariablesGrouped.groups.filter( secondaryConfigVariables?.getConfigVariablesGrouped.groups.filter(
(group) => group.isHiddenOnLoad, (group) => group.isHiddenOnLoad,
) ?? []; ) ?? [];
if (environmentVariablesLoading) { if (secondaryConfigVariablesLoading) {
return <SettingsSkeletonLoader />; return <SettingsSkeletonLoader />;
} }

View File

@ -1,6 +1,6 @@
import { JestConfigWithTsJest, pathsToModuleNameMapper } from 'ts-jest'; import { JestConfigWithTsJest, pathsToModuleNameMapper } from 'ts-jest';
import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; import { NodeEnvironment } from 'src/engine/core-modules/twenty-config/interfaces/node-environment.interface';
const isBillingEnabled = process.env.IS_BILLING_ENABLED === 'true'; const isBillingEnabled = process.env.IS_BILLING_ENABLED === 'true';

View File

@ -6,8 +6,8 @@ import { EachTestingContext } from 'twenty-shared/testing';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { UpgradeCommandRunner } from 'src/database/commands/command-runners/upgrade.command-runner'; import { UpgradeCommandRunner } from 'src/database/commands/command-runners/upgrade.command-runner';
import { EnvironmentVariables } from 'src/engine/core-modules/environment/environment-variables'; import { ConfigVariables } from 'src/engine/core-modules/twenty-config/config-variables';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } 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 { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command'; import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command';
@ -97,20 +97,18 @@ const buildUpgradeCommandModule = async ({
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest get: jest.fn().mockImplementation((key: keyof ConfigVariables) => {
.fn() switch (key) {
.mockImplementation((key: keyof EnvironmentVariables) => { case 'APP_VERSION': {
switch (key) { return appVersion;
case 'APP_VERSION': {
return appVersion;
}
default: {
return;
}
} }
}), default: {
return;
}
}
}),
}, },
}, },
{ {

View File

@ -9,7 +9,7 @@ import {
ActiveOrSuspendedWorkspacesMigrationCommandRunner, ActiveOrSuspendedWorkspacesMigrationCommandRunner,
RunOnWorkspaceArgs, RunOnWorkspaceArgs,
} from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } 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 { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command'; import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command';
@ -26,7 +26,7 @@ export abstract class UpgradeCommandRunner extends ActiveOrSuspendedWorkspacesMi
constructor( constructor(
@InjectRepository(Workspace, 'core') @InjectRepository(Workspace, 'core')
protected readonly workspaceRepository: Repository<Workspace>, protected readonly workspaceRepository: Repository<Workspace>,
protected readonly environmentService: EnvironmentService, protected readonly twentyConfigService: TwentyConfigService,
protected readonly twentyORMGlobalManager: TwentyORMGlobalManager, protected readonly twentyORMGlobalManager: TwentyORMGlobalManager,
protected readonly syncWorkspaceMetadataCommand: SyncWorkspaceMetadataCommand, protected readonly syncWorkspaceMetadataCommand: SyncWorkspaceMetadataCommand,
) { ) {
@ -87,7 +87,7 @@ export abstract class UpgradeCommandRunner extends ActiveOrSuspendedWorkspacesMi
} }
private retrieveToVersionFromAppVersion() { private retrieveToVersionFromAppVersion() {
const appVersion = this.environmentService.get('APP_VERSION'); const appVersion = this.twentyConfigService.get('APP_VERSION');
if (!isDefined(appVersion)) { if (!isDefined(appVersion)) {
throw new Error( throw new Error(

View File

@ -2,14 +2,14 @@ import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { DataSeedDemoWorkspaceService } from 'src/database/commands/data-seed-demo-workspace/services/data-seed-demo-workspace.service'; import { DataSeedDemoWorkspaceService } from 'src/database/commands/data-seed-demo-workspace/services/data-seed-demo-workspace.service';
import { EnvironmentModule } from 'src/engine/core-modules/environment/environment.module'; import { TwentyConfigModule } from 'src/engine/core-modules/twenty-config/twenty-config.module';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { WorkspaceManagerModule } from 'src/engine/workspace-manager/workspace-manager.module'; import { WorkspaceManagerModule } from 'src/engine/workspace-manager/workspace-manager.module';
@Module({ @Module({
imports: [ imports: [
WorkspaceManagerModule, WorkspaceManagerModule,
EnvironmentModule, TwentyConfigModule,
TypeOrmModule.forFeature([Workspace], 'core'), TypeOrmModule.forFeature([Workspace], 'core'),
], ],
providers: [DataSeedDemoWorkspaceService], providers: [DataSeedDemoWorkspaceService],

View File

@ -9,7 +9,7 @@ import { rawDataSource } from 'src/database/typeorm/raw/raw.datasource';
import { InjectCacheStorage } from 'src/engine/core-modules/cache-storage/decorators/cache-storage.decorator'; import { InjectCacheStorage } from 'src/engine/core-modules/cache-storage/decorators/cache-storage.decorator';
import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service'; import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service';
import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum'; import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { WorkspaceManagerService } from 'src/engine/workspace-manager/workspace-manager.service'; import { WorkspaceManagerService } from 'src/engine/workspace-manager/workspace-manager.service';
@ -21,7 +21,7 @@ export class DataSeedDemoWorkspaceService {
protected readonly workspaceRepository: Repository<Workspace>, protected readonly workspaceRepository: Repository<Workspace>,
@InjectCacheStorage(CacheStorageNamespace.EngineWorkspace) @InjectCacheStorage(CacheStorageNamespace.EngineWorkspace)
private readonly workspaceSchemaCache: CacheStorageService, private readonly workspaceSchemaCache: CacheStorageService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
async seedDemo(): Promise<void> { async seedDemo(): Promise<void> {
@ -43,7 +43,7 @@ export class DataSeedDemoWorkspaceService {
await deleteCoreSchema(rawDataSource, workspaceId); await deleteCoreSchema(rawDataSource, workspaceId);
} }
const appVersion = this.environmentService.get('APP_VERSION'); const appVersion = this.twentyConfigService.get('APP_VERSION');
await seedCoreSchema({ await seedCoreSchema({
workspaceDataSource: rawDataSource, workspaceDataSource: rawDataSource,

View File

@ -32,7 +32,7 @@ import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { InjectCacheStorage } from 'src/engine/core-modules/cache-storage/decorators/cache-storage.decorator'; import { InjectCacheStorage } from 'src/engine/core-modules/cache-storage/decorators/cache-storage.decorator';
import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service'; import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service';
import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum'; import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity';
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/field-metadata.service'; import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/field-metadata.service';
@ -68,7 +68,7 @@ export class DataSeedWorkspaceCommand extends CommandRunner {
private readonly workspaceSchemaCache: CacheStorageService, private readonly workspaceSchemaCache: CacheStorageService,
private readonly seederService: SeederService, private readonly seederService: SeederService,
private readonly workspaceManagerService: WorkspaceManagerService, private readonly workspaceManagerService: WorkspaceManagerService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) { ) {
super(); super();
} }
@ -94,8 +94,8 @@ export class DataSeedWorkspaceCommand extends CommandRunner {
await rawDataSource.initialize(); await rawDataSource.initialize();
const isBillingEnabled = this.environmentService.get('IS_BILLING_ENABLED'); const isBillingEnabled = this.twentyConfigService.get('IS_BILLING_ENABLED');
const appVersion = this.environmentService.get('APP_VERSION'); const appVersion = this.twentyConfigService.get('APP_VERSION');
await seedCoreSchema({ await seedCoreSchema({
workspaceDataSource: rawDataSource, workspaceDataSource: rawDataSource,

View File

@ -17,7 +17,7 @@ import { UpdateDefaultViewRecordOpeningOnWorkflowObjectsCommand } from 'src/data
import { InitializePermissionsCommand } from 'src/database/commands/upgrade-version-command/0-44/0-44-initialize-permissions.command'; import { InitializePermissionsCommand } from 'src/database/commands/upgrade-version-command/0-44/0-44-initialize-permissions.command';
import { UpdateViewAggregateOperationsCommand } from 'src/database/commands/upgrade-version-command/0-44/0-44-update-view-aggregate-operations.command'; import { UpdateViewAggregateOperationsCommand } from 'src/database/commands/upgrade-version-command/0-44/0-44-update-view-aggregate-operations.command';
import { UpgradeCreatedByEnumCommand } from 'src/database/commands/upgrade-version-command/0-51/0-51-update-workflow-trigger-type-enum.command'; import { UpgradeCreatedByEnumCommand } from 'src/database/commands/upgrade-version-command/0-51/0-51-update-workflow-trigger-type-enum.command';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } 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 { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command'; import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command';
@ -37,7 +37,7 @@ export class UpgradeCommand extends UpgradeCommandRunner {
constructor( constructor(
@InjectRepository(Workspace, 'core') @InjectRepository(Workspace, 'core')
protected readonly workspaceRepository: Repository<Workspace>, protected readonly workspaceRepository: Repository<Workspace>,
protected readonly environmentService: EnvironmentService, protected readonly twentyConfigService: TwentyConfigService,
protected readonly twentyORMGlobalManager: TwentyORMGlobalManager, protected readonly twentyORMGlobalManager: TwentyORMGlobalManager,
protected readonly syncWorkspaceMetadataCommand: SyncWorkspaceMetadataCommand, protected readonly syncWorkspaceMetadataCommand: SyncWorkspaceMetadataCommand,
@ -57,7 +57,7 @@ export class UpgradeCommand extends UpgradeCommandRunner {
) { ) {
super( super(
workspaceRepository, workspaceRepository,
environmentService, twentyConfigService,
twentyORMGlobalManager, twentyORMGlobalManager,
syncWorkspaceMetadataCommand, syncWorkspaceMetadataCommand,
); );

View File

@ -2,7 +2,7 @@ import { Module } from '@nestjs/common';
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm'; import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';
import { typeORMCoreModuleOptions } from 'src/database/typeorm/core/core.datasource'; import { typeORMCoreModuleOptions } from 'src/database/typeorm/core/core.datasource';
import { EnvironmentModule } from 'src/engine/core-modules/environment/environment.module'; import { TwentyConfigModule } from 'src/engine/core-modules/twenty-config/twenty-config.module';
import { TypeORMService } from './typeorm.service'; import { TypeORMService } from './typeorm.service';
@ -28,7 +28,7 @@ const coreTypeORMFactory = async (): Promise<TypeOrmModuleOptions> => ({
useFactory: coreTypeORMFactory, useFactory: coreTypeORMFactory,
name: 'core', name: 'core',
}), }),
EnvironmentModule, TwentyConfigModule,
], ],
providers: [TypeORMService], providers: [TypeORMService],
exports: [TypeORMService], exports: [TypeORMService],

View File

@ -2,7 +2,7 @@ import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
import { DataSource } from 'typeorm'; import { DataSource } from 'typeorm';
import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; import { NodeEnvironment } from 'src/engine/core-modules/twenty-config/interfaces/node-environment.interface';
import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity';
import { ApprovedAccessDomain } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.entity'; import { ApprovedAccessDomain } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.entity';
@ -13,11 +13,11 @@ import { BillingPrice } from 'src/engine/core-modules/billing/entities/billing-p
import { BillingProduct } from 'src/engine/core-modules/billing/entities/billing-product.entity'; import { BillingProduct } from 'src/engine/core-modules/billing/entities/billing-product.entity';
import { BillingSubscriptionItem } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; import { BillingSubscriptionItem } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity';
import { BillingSubscription } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; import { BillingSubscription } from 'src/engine/core-modules/billing/entities/billing-subscription.entity';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
import { KeyValuePair } from 'src/engine/core-modules/key-value-pair/key-value-pair.entity'; import { KeyValuePair } from 'src/engine/core-modules/key-value-pair/key-value-pair.entity';
import { PostgresCredentials } from 'src/engine/core-modules/postgres-credentials/postgres-credentials.entity'; import { PostgresCredentials } from 'src/engine/core-modules/postgres-credentials/postgres-credentials.entity';
import { WorkspaceSSOIdentityProvider } from 'src/engine/core-modules/sso/workspace-sso-identity-provider.entity'; import { WorkspaceSSOIdentityProvider } from 'src/engine/core-modules/sso/workspace-sso-identity-provider.entity';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { TwoFactorMethod } from 'src/engine/core-modules/two-factor-method/two-factor-method.entity'; import { TwoFactorMethod } from 'src/engine/core-modules/two-factor-method/two-factor-method.entity';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
@ -29,12 +29,12 @@ export class TypeORMService implements OnModuleInit, OnModuleDestroy {
private dataSources: Map<string, DataSource> = new Map(); private dataSources: Map<string, DataSource> = new Map();
private isDatasourceInitializing: Map<string, boolean> = new Map(); private isDatasourceInitializing: Map<string, boolean> = new Map();
constructor(private readonly environmentService: EnvironmentService) { constructor(private readonly twentyConfigService: TwentyConfigService) {
this.mainDataSource = new DataSource({ this.mainDataSource = new DataSource({
url: environmentService.get('PG_DATABASE_URL'), url: twentyConfigService.get('PG_DATABASE_URL'),
type: 'postgres', type: 'postgres',
logging: logging:
environmentService.get('NODE_ENV') === NodeEnvironment.development twentyConfigService.get('NODE_ENV') === NodeEnvironment.development
? ['query', 'error'] ? ['query', 'error']
: ['error'], : ['error'],
schema: 'core', schema: 'core',
@ -58,7 +58,7 @@ export class TypeORMService implements OnModuleInit, OnModuleDestroy {
TwoFactorMethod, TwoFactorMethod,
], ],
metadataTableName: '_typeorm_generated_columns_and_materialized_views', metadataTableName: '_typeorm_generated_columns_and_materialized_views',
ssl: environmentService.get('PG_SSL_ALLOW_SELF_SIGNED') ssl: twentyConfigService.get('PG_SSL_ALLOW_SELF_SIGNED')
? { ? {
rejectUnauthorized: false, rejectUnauthorized: false,
} }
@ -111,14 +111,14 @@ export class TypeORMService implements OnModuleInit, OnModuleDestroy {
const schema = dataSource.schema; const schema = dataSource.schema;
const workspaceDataSource = new DataSource({ const workspaceDataSource = new DataSource({
url: dataSource.url ?? this.environmentService.get('PG_DATABASE_URL'), url: dataSource.url ?? this.twentyConfigService.get('PG_DATABASE_URL'),
type: 'postgres', type: 'postgres',
logging: logging:
this.environmentService.get('NODE_ENV') === NodeEnvironment.development this.twentyConfigService.get('NODE_ENV') === NodeEnvironment.development
? ['query', 'error'] ? ['query', 'error']
: ['error'], : ['error'],
schema, schema,
ssl: this.environmentService.get('PG_SSL_ALLOW_SELF_SIGNED') ssl: this.twentyConfigService.get('PG_SSL_ALLOW_SELF_SIGNED')
? { ? {
rejectUnauthorized: false, rejectUnauthorized: false,
} }

View File

@ -12,16 +12,16 @@ import GraphQLJSON from 'graphql-type-json';
import { GraphQLSchemaWithContext, YogaInitialContext } from 'graphql-yoga'; import { GraphQLSchemaWithContext, YogaInitialContext } from 'graphql-yoga';
import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken'; import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken';
import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; import { NodeEnvironment } from 'src/engine/core-modules/twenty-config/interfaces/node-environment.interface';
import { useThrottler } from 'src/engine/api/graphql/graphql-config/hooks/use-throttler'; import { useThrottler } from 'src/engine/api/graphql/graphql-config/hooks/use-throttler';
import { WorkspaceSchemaFactory } from 'src/engine/api/graphql/workspace-schema.factory'; import { WorkspaceSchemaFactory } from 'src/engine/api/graphql/workspace-schema.factory';
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type'; import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { CoreEngineModule } from 'src/engine/core-modules/core-engine.module'; import { CoreEngineModule } from 'src/engine/core-modules/core-engine.module';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service'; import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service';
import { useSentryTracing } from 'src/engine/core-modules/exception-handler/hooks/use-sentry-tracing'; import { useSentryTracing } from 'src/engine/core-modules/exception-handler/hooks/use-sentry-tracing';
import { useGraphQLErrorHandlerHook } from 'src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook'; import { useGraphQLErrorHandlerHook } from 'src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { handleExceptionAndConvertToGraphQLError } from 'src/engine/utils/global-exception-handler.util'; import { handleExceptionAndConvertToGraphQLError } from 'src/engine/utils/global-exception-handler.util';
@ -38,17 +38,17 @@ export class GraphQLConfigService
{ {
constructor( constructor(
private readonly exceptionHandlerService: ExceptionHandlerService, private readonly exceptionHandlerService: ExceptionHandlerService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly moduleRef: ModuleRef, private readonly moduleRef: ModuleRef,
) {} ) {}
createGqlOptions(): YogaDriverConfig { createGqlOptions(): YogaDriverConfig {
const isDebugMode = const isDebugMode =
this.environmentService.get('NODE_ENV') === NodeEnvironment.development; this.twentyConfigService.get('NODE_ENV') === NodeEnvironment.development;
const plugins = [ const plugins = [
useThrottler({ useThrottler({
ttl: this.environmentService.get('API_RATE_LIMITING_TTL'), ttl: this.twentyConfigService.get('API_RATE_LIMITING_TTL'),
limit: this.environmentService.get('API_RATE_LIMITING_LIMIT'), limit: this.twentyConfigService.get('API_RATE_LIMITING_LIMIT'),
identifyFn: (context) => { identifyFn: (context) => {
return context.req.user?.id ?? context.req.ip ?? 'anonymous'; return context.req.user?.id ?? context.req.ip ?? 'anonymous';
}, },

View File

@ -5,11 +5,11 @@ import { YogaDriver, YogaDriverConfig } from '@graphql-yoga/nestjs';
import { GraphQLConfigModule } from 'src/engine/api/graphql/graphql-config/graphql-config.module'; import { GraphQLConfigModule } from 'src/engine/api/graphql/graphql-config/graphql-config.module';
import { metadataModuleFactory } from 'src/engine/api/graphql/metadata.module-factory'; import { metadataModuleFactory } from 'src/engine/api/graphql/metadata.module-factory';
import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum';
import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { DataloaderModule } from 'src/engine/dataloaders/dataloader.module'; import { DataloaderModule } from 'src/engine/dataloaders/dataloader.module';
import { DataloaderService } from 'src/engine/dataloaders/dataloader.service'; import { DataloaderService } from 'src/engine/dataloaders/dataloader.service';
import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service';
import { MetadataEngineModule } from 'src/engine/metadata-modules/metadata-engine.module'; import { MetadataEngineModule } from 'src/engine/metadata-modules/metadata-engine.module';
import { WorkspaceMigrationModule } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.module'; import { WorkspaceMigrationModule } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.module';
import { WorkspaceMigrationRunnerModule } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.module'; import { WorkspaceMigrationRunnerModule } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.module';
@ -21,7 +21,7 @@ import { WorkspaceMigrationRunnerModule } from 'src/engine/workspace-manager/wor
useFactory: metadataModuleFactory, useFactory: metadataModuleFactory,
imports: [GraphQLConfigModule, DataloaderModule], imports: [GraphQLConfigModule, DataloaderModule],
inject: [ inject: [
EnvironmentService, TwentyConfigService,
ExceptionHandlerService, ExceptionHandlerService,
DataloaderService, DataloaderService,
CacheStorageNamespace.EngineWorkspace, CacheStorageNamespace.EngineWorkspace,

View File

@ -1,20 +1,20 @@
import { YogaDriverConfig } from '@graphql-yoga/nestjs'; import { YogaDriverConfig } from '@graphql-yoga/nestjs';
import GraphQLJSON from 'graphql-type-json'; import GraphQLJSON from 'graphql-type-json';
import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; import { NodeEnvironment } from 'src/engine/core-modules/twenty-config/interfaces/node-environment.interface';
import { useCachedMetadata } from 'src/engine/api/graphql/graphql-config/hooks/use-cached-metadata'; import { useCachedMetadata } from 'src/engine/api/graphql/graphql-config/hooks/use-cached-metadata';
import { useThrottler } from 'src/engine/api/graphql/graphql-config/hooks/use-throttler'; import { useThrottler } from 'src/engine/api/graphql/graphql-config/hooks/use-throttler';
import { MetadataGraphQLApiModule } from 'src/engine/api/graphql/metadata-graphql-api.module'; import { MetadataGraphQLApiModule } from 'src/engine/api/graphql/metadata-graphql-api.module';
import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service'; import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service'; import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service';
import { useGraphQLErrorHandlerHook } from 'src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook'; import { useGraphQLErrorHandlerHook } from 'src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { DataloaderService } from 'src/engine/dataloaders/dataloader.service'; import { DataloaderService } from 'src/engine/dataloaders/dataloader.service';
import { renderApolloPlayground } from 'src/engine/utils/render-apollo-playground.util'; import { renderApolloPlayground } from 'src/engine/utils/render-apollo-playground.util';
export const metadataModuleFactory = async ( export const metadataModuleFactory = async (
environmentService: EnvironmentService, twentyConfigService: TwentyConfigService,
exceptionHandlerService: ExceptionHandlerService, exceptionHandlerService: ExceptionHandlerService,
dataloaderService: DataloaderService, dataloaderService: DataloaderService,
cacheStorageService: CacheStorageService, cacheStorageService: CacheStorageService,
@ -28,8 +28,8 @@ export const metadataModuleFactory = async (
resolvers: { JSON: GraphQLJSON }, resolvers: { JSON: GraphQLJSON },
plugins: [ plugins: [
useThrottler({ useThrottler({
ttl: environmentService.get('API_RATE_LIMITING_TTL'), ttl: twentyConfigService.get('API_RATE_LIMITING_TTL'),
limit: environmentService.get('API_RATE_LIMITING_LIMIT'), limit: twentyConfigService.get('API_RATE_LIMITING_LIMIT'),
identifyFn: (context) => { identifyFn: (context) => {
return context.req.user?.id ?? context.req.ip ?? 'anonymous'; return context.req.user?.id ?? context.req.ip ?? 'anonymous';
}, },
@ -49,7 +49,7 @@ export const metadataModuleFactory = async (
}), }),
}; };
if (environmentService.get('NODE_ENV') === NodeEnvironment.development) { if (twentyConfigService.get('NODE_ENV') === NodeEnvironment.development) {
config.renderGraphiQL = () => { config.renderGraphiQL = () => {
return renderApolloPlayground({ path: 'metadata' }); return renderApolloPlayground({ path: 'metadata' });
}; };

View File

@ -1,13 +1,13 @@
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios'; import { HttpService } from '@nestjs/axios';
import { Injectable } from '@nestjs/common';
import { Request } from 'express';
import { AxiosResponse } from 'axios'; import { AxiosResponse } from 'axios';
import { Request } from 'express';
import { Query } from 'src/engine/api/rest/core/types/query.type'; import { Query } from 'src/engine/api/rest/core/types/query.type';
import { getServerUrl } from 'src/utils/get-server-url';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { RestApiException } from 'src/engine/api/rest/errors/RestApiException'; import { RestApiException } from 'src/engine/api/rest/errors/RestApiException';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { getServerUrl } from 'src/utils/get-server-url';
export enum GraphqlApiType { export enum GraphqlApiType {
CORE = 'core', CORE = 'core',
@ -17,14 +17,14 @@ export enum GraphqlApiType {
@Injectable() @Injectable()
export class RestApiService { export class RestApiService {
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly httpService: HttpService, private readonly httpService: HttpService,
) {} ) {}
async call(graphqlApiType: GraphqlApiType, request: Request, data: Query) { async call(graphqlApiType: GraphqlApiType, request: Request, data: Query) {
const baseUrl = getServerUrl( const baseUrl = getServerUrl(
request, request,
this.environmentService.get('SERVER_URL'), this.twentyConfigService.get('SERVER_URL'),
); );
let response: AxiosResponse; let response: AxiosResponse;
const url = `${baseUrl}/${ const url = `${baseUrl}/${

View File

@ -8,7 +8,6 @@ import { HEALTH_INDICATORS } from 'src/engine/core-modules/admin-panel/constants
import { SystemHealth } from 'src/engine/core-modules/admin-panel/dtos/system-health.dto'; import { SystemHealth } from 'src/engine/core-modules/admin-panel/dtos/system-health.dto';
import { AdminPanelHealthServiceStatus } from 'src/engine/core-modules/admin-panel/enums/admin-panel-health-service-status.enum'; import { AdminPanelHealthServiceStatus } from 'src/engine/core-modules/admin-panel/enums/admin-panel-health-service-status.enum';
import { QueueMetricsTimeRange } from 'src/engine/core-modules/admin-panel/enums/queue-metrics-time-range.enum'; import { QueueMetricsTimeRange } from 'src/engine/core-modules/admin-panel/enums/queue-metrics-time-range.enum';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { HEALTH_ERROR_MESSAGES } from 'src/engine/core-modules/health/constants/health-error-messages.constants'; import { HEALTH_ERROR_MESSAGES } from 'src/engine/core-modules/health/constants/health-error-messages.constants';
import { HealthIndicatorId } from 'src/engine/core-modules/health/enums/health-indicator-id.enum'; import { HealthIndicatorId } from 'src/engine/core-modules/health/enums/health-indicator-id.enum';
import { AppHealthIndicator } from 'src/engine/core-modules/health/indicators/app.health'; import { AppHealthIndicator } from 'src/engine/core-modules/health/indicators/app.health';
@ -18,6 +17,7 @@ import { RedisHealthIndicator } from 'src/engine/core-modules/health/indicators/
import { WorkerHealthIndicator } from 'src/engine/core-modules/health/indicators/worker.health'; import { WorkerHealthIndicator } from 'src/engine/core-modules/health/indicators/worker.health';
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
import { RedisClientService } from 'src/engine/core-modules/redis-client/redis-client.service'; import { RedisClientService } from 'src/engine/core-modules/redis-client/redis-client.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
jest.mock('bullmq'); jest.mock('bullmq');
@ -29,7 +29,7 @@ describe('AdminPanelHealthService', () => {
let connectedAccountHealth: jest.Mocked<ConnectedAccountHealth>; let connectedAccountHealth: jest.Mocked<ConnectedAccountHealth>;
let appHealth: jest.Mocked<AppHealthIndicator>; let appHealth: jest.Mocked<AppHealthIndicator>;
let redisClient: jest.Mocked<RedisClientService>; let redisClient: jest.Mocked<RedisClientService>;
let environmentService: jest.Mocked<EnvironmentService>; let twentyConfigService: jest.Mocked<TwentyConfigService>;
let loggerSpy: jest.SpyInstance; let loggerSpy: jest.SpyInstance;
beforeEach(async () => { beforeEach(async () => {
@ -41,7 +41,7 @@ describe('AdminPanelHealthService', () => {
redisClient = { redisClient = {
getClient: jest.fn().mockReturnValue({} as Redis), getClient: jest.fn().mockReturnValue({} as Redis),
} as any; } as any;
environmentService = { get: jest.fn() } as any; twentyConfigService = { get: jest.fn() } as any;
(Queue as unknown as jest.Mock) = jest.fn().mockImplementation(() => ({ (Queue as unknown as jest.Mock) = jest.fn().mockImplementation(() => ({
getMetrics: jest.fn(), getMetrics: jest.fn(),
@ -58,7 +58,7 @@ describe('AdminPanelHealthService', () => {
{ provide: ConnectedAccountHealth, useValue: connectedAccountHealth }, { provide: ConnectedAccountHealth, useValue: connectedAccountHealth },
{ provide: AppHealthIndicator, useValue: appHealth }, { provide: AppHealthIndicator, useValue: appHealth },
{ provide: RedisClientService, useValue: redisClient }, { provide: RedisClientService, useValue: redisClient },
{ provide: EnvironmentService, useValue: environmentService }, { provide: TwentyConfigService, useValue: twentyConfigService },
], ],
}).compile(); }).compile();

View File

@ -10,17 +10,17 @@ import {
} from 'src/engine/core-modules/auth/auth.exception'; } from 'src/engine/core-modules/auth/auth.exception';
import { LoginTokenService } from 'src/engine/core-modules/auth/token/services/login-token.service'; import { LoginTokenService } from 'src/engine/core-modules/auth/token/services/login-token.service';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
const UserFindOneMock = jest.fn(); const UserFindOneMock = jest.fn();
const LoginTokenServiceGenerateLoginTokenMock = jest.fn(); const LoginTokenServiceGenerateLoginTokenMock = jest.fn();
const EnvironmentServiceGetAllMock = jest.fn(); const TwentyConfigServiceGetAllMock = jest.fn();
jest.mock( jest.mock(
'../../environment/constants/environment-variables-group-metadata', 'src/engine/core-modules/twenty-config/constants/config-variables-group-metadata',
() => ({ () => ({
ENVIRONMENT_VARIABLES_GROUP_METADATA: { CONFIG_VARIABLES_GROUP_METADATA: {
SERVER_CONFIG: { SERVER_CONFIG: {
position: 100, position: 100,
description: 'Server config description', description: 'Server config description',
@ -69,9 +69,9 @@ describe('AdminPanelService', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
getAll: EnvironmentServiceGetAllMock, getAll: TwentyConfigServiceGetAllMock,
}, },
}, },
], ],
@ -157,9 +157,9 @@ describe('AdminPanelService', () => {
expect(UserFindOneMock).toHaveBeenCalled(); expect(UserFindOneMock).toHaveBeenCalled();
}); });
describe('getEnvironmentVariablesGrouped', () => { describe('getConfigVariablesGrouped', () => {
it('should correctly group and sort environment variables', () => { it('should correctly group and sort config variables', () => {
EnvironmentServiceGetAllMock.mockReturnValue({ TwentyConfigServiceGetAllMock.mockReturnValue({
SERVER_URL: { SERVER_URL: {
value: 'http://localhost', value: 'http://localhost',
metadata: { metadata: {
@ -179,7 +179,7 @@ describe('AdminPanelService', () => {
metadata: { metadata: {
group: 'SERVER_CONFIG', group: 'SERVER_CONFIG',
description: 'API Key', description: 'API Key',
sensitive: true, isSensitive: true,
}, },
}, },
OTHER_VAR: { OTHER_VAR: {
@ -191,7 +191,7 @@ describe('AdminPanelService', () => {
}, },
}); });
const result = service.getEnvironmentVariablesGrouped(); const result = service.getConfigVariablesGrouped();
expect(result).toEqual({ expect(result).toEqual({
groups: [ groups: [
@ -204,13 +204,13 @@ describe('AdminPanelService', () => {
name: 'API_KEY', name: 'API_KEY',
value: 'secret-key', value: 'secret-key',
description: 'API Key', description: 'API Key',
sensitive: true, isSensitive: true,
}, },
{ {
name: 'SERVER_URL', name: 'SERVER_URL',
value: 'http://localhost', value: 'http://localhost',
description: 'Server URL', description: 'Server URL',
sensitive: false, isSensitive: false,
}, },
], ],
}, },
@ -223,7 +223,7 @@ describe('AdminPanelService', () => {
name: 'RATE_LIMIT_TTL', name: 'RATE_LIMIT_TTL',
value: '60', value: '60',
description: 'Rate limit TTL', description: 'Rate limit TTL',
sensitive: false, isSensitive: false,
}, },
], ],
}, },
@ -236,7 +236,7 @@ describe('AdminPanelService', () => {
name: 'OTHER_VAR', name: 'OTHER_VAR',
value: 'other', value: 'other',
description: 'Other var', description: 'Other var',
sensitive: false, isSensitive: false,
}, },
], ],
}, },
@ -248,10 +248,10 @@ describe('AdminPanelService', () => {
expect(result.groups[2].name).toBe('OTHER'); expect(result.groups[2].name).toBe('OTHER');
}); });
it('should handle empty environment variables', () => { it('should handle empty config variables', () => {
EnvironmentServiceGetAllMock.mockReturnValue({}); TwentyConfigServiceGetAllMock.mockReturnValue({});
const result = service.getEnvironmentVariablesGrouped(); const result = service.getConfigVariablesGrouped();
expect(result).toEqual({ expect(result).toEqual({
groups: [], groups: [],
@ -259,7 +259,7 @@ describe('AdminPanelService', () => {
}); });
it('should handle variables with undefined metadata fields', () => { it('should handle variables with undefined metadata fields', () => {
EnvironmentServiceGetAllMock.mockReturnValue({ TwentyConfigServiceGetAllMock.mockReturnValue({
TEST_VAR: { TEST_VAR: {
value: 'test', value: 'test',
metadata: { metadata: {
@ -268,13 +268,13 @@ describe('AdminPanelService', () => {
}, },
}); });
const result = service.getEnvironmentVariablesGrouped(); const result = service.getConfigVariablesGrouped();
expect(result.groups[0].variables[0]).toEqual({ expect(result.groups[0].variables[0]).toEqual({
name: 'TEST_VAR', name: 'TEST_VAR',
value: 'test', value: 'test',
description: undefined, description: undefined,
sensitive: false, isSensitive: false,
}); });
}); });
}); });
@ -287,7 +287,7 @@ describe('AdminPanelService', () => {
mockEnvironmentGet.mockReset(); mockEnvironmentGet.mockReset();
mockAxiosGet.mockReset(); mockAxiosGet.mockReset();
jest.spyOn(axios, 'get').mockImplementation(mockAxiosGet); jest.spyOn(axios, 'get').mockImplementation(mockAxiosGet);
service['environmentService'].get = mockEnvironmentGet; service['twentyConfigService'].get = mockEnvironmentGet;
}); });
it('should return current and latest version when everything works', async () => { it('should return current and latest version when everything works', async () => {

View File

@ -3,7 +3,7 @@ import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
import { AdminPanelHealthService } from 'src/engine/core-modules/admin-panel/admin-panel-health.service'; import { AdminPanelHealthService } from 'src/engine/core-modules/admin-panel/admin-panel-health.service';
import { AdminPanelService } from 'src/engine/core-modules/admin-panel/admin-panel.service'; import { AdminPanelService } from 'src/engine/core-modules/admin-panel/admin-panel.service';
import { EnvironmentVariablesOutput } from 'src/engine/core-modules/admin-panel/dtos/environment-variables.output'; import { ConfigVariablesOutput } from 'src/engine/core-modules/admin-panel/dtos/config-variables.output';
import { ImpersonateInput } from 'src/engine/core-modules/admin-panel/dtos/impersonate.input'; import { ImpersonateInput } from 'src/engine/core-modules/admin-panel/dtos/impersonate.input';
import { ImpersonateOutput } from 'src/engine/core-modules/admin-panel/dtos/impersonate.output'; import { ImpersonateOutput } from 'src/engine/core-modules/admin-panel/dtos/impersonate.output';
import { SystemHealth } from 'src/engine/core-modules/admin-panel/dtos/system-health.dto'; import { SystemHealth } from 'src/engine/core-modules/admin-panel/dtos/system-health.dto';
@ -17,7 +17,6 @@ import { FeatureFlagException } from 'src/engine/core-modules/feature-flag/featu
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { UserInputError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; import { UserInputError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
import { HealthIndicatorId } from 'src/engine/core-modules/health/enums/health-indicator-id.enum'; import { HealthIndicatorId } from 'src/engine/core-modules/health/enums/health-indicator-id.enum';
import { WorkerHealthIndicator } from 'src/engine/core-modules/health/indicators/worker.health';
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
import { AdminPanelGuard } from 'src/engine/guards/admin-panel-guard'; import { AdminPanelGuard } from 'src/engine/guards/admin-panel-guard';
import { ImpersonateGuard } from 'src/engine/guards/impersonate-guard'; import { ImpersonateGuard } from 'src/engine/guards/impersonate-guard';
@ -33,7 +32,6 @@ export class AdminPanelResolver {
constructor( constructor(
private adminService: AdminPanelService, private adminService: AdminPanelService,
private adminPanelHealthService: AdminPanelHealthService, private adminPanelHealthService: AdminPanelHealthService,
private workerHealthIndicator: WorkerHealthIndicator,
private featureFlagService: FeatureFlagService, private featureFlagService: FeatureFlagService,
) {} ) {}
@ -76,9 +74,9 @@ export class AdminPanelResolver {
} }
@UseGuards(WorkspaceAuthGuard, UserAuthGuard, AdminPanelGuard) @UseGuards(WorkspaceAuthGuard, UserAuthGuard, AdminPanelGuard)
@Query(() => EnvironmentVariablesOutput) @Query(() => ConfigVariablesOutput)
async getEnvironmentVariablesGrouped(): Promise<EnvironmentVariablesOutput> { async getConfigVariablesGrouped(): Promise<ConfigVariablesOutput> {
return this.adminService.getEnvironmentVariablesGrouped(); return this.adminService.getConfigVariablesGrouped();
} }
@UseGuards(WorkspaceAuthGuard, UserAuthGuard, AdminPanelGuard) @UseGuards(WorkspaceAuthGuard, UserAuthGuard, AdminPanelGuard)

View File

@ -5,9 +5,9 @@ import axios from 'axios';
import semver from 'semver'; import semver from 'semver';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { EnvironmentVariable } from 'src/engine/core-modules/admin-panel/dtos/environment-variable.dto'; import { ConfigVariable } from 'src/engine/core-modules/admin-panel/dtos/config-variable.dto';
import { EnvironmentVariablesGroupData } from 'src/engine/core-modules/admin-panel/dtos/environment-variables-group.dto'; import { ConfigVariablesGroupData } from 'src/engine/core-modules/admin-panel/dtos/config-variables-group.dto';
import { EnvironmentVariablesOutput } from 'src/engine/core-modules/admin-panel/dtos/environment-variables.output'; import { ConfigVariablesOutput } from 'src/engine/core-modules/admin-panel/dtos/config-variables.output';
import { UserLookup } from 'src/engine/core-modules/admin-panel/dtos/user-lookup.entity'; import { UserLookup } from 'src/engine/core-modules/admin-panel/dtos/user-lookup.entity';
import { VersionInfo } from 'src/engine/core-modules/admin-panel/dtos/version-info.dto'; import { VersionInfo } from 'src/engine/core-modules/admin-panel/dtos/version-info.dto';
import { import {
@ -16,11 +16,11 @@ import {
} from 'src/engine/core-modules/auth/auth.exception'; } from 'src/engine/core-modules/auth/auth.exception';
import { LoginTokenService } from 'src/engine/core-modules/auth/token/services/login-token.service'; import { LoginTokenService } from 'src/engine/core-modules/auth/token/services/login-token.service';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { ENVIRONMENT_VARIABLES_GROUP_METADATA } from 'src/engine/core-modules/environment/constants/environment-variables-group-metadata';
import { EnvironmentVariablesGroup } from 'src/engine/core-modules/environment/enums/environment-variables-group.enum';
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 { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
import { CONFIG_VARIABLES_GROUP_METADATA } from 'src/engine/core-modules/twenty-config/constants/config-variables-group-metadata';
import { ConfigVariablesGroup } from 'src/engine/core-modules/twenty-config/enums/config-variables-group.enum';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
import { userValidator } from 'src/engine/core-modules/user/user.validate'; import { userValidator } from 'src/engine/core-modules/user/user.validate';
@ -28,7 +28,7 @@ import { userValidator } from 'src/engine/core-modules/user/user.validate';
export class AdminPanelService { export class AdminPanelService {
constructor( constructor(
private readonly loginTokenService: LoginTokenService, private readonly loginTokenService: LoginTokenService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly domainManagerService: DomainManagerService, private readonly domainManagerService: DomainManagerService,
@InjectRepository(User, 'core') @InjectRepository(User, 'core')
private readonly userRepository: Repository<User>, private readonly userRepository: Repository<User>,
@ -123,21 +123,18 @@ export class AdminPanelService {
}; };
} }
getEnvironmentVariablesGrouped(): EnvironmentVariablesOutput { getConfigVariablesGrouped(): ConfigVariablesOutput {
const rawEnvVars = this.environmentService.getAll(); const rawEnvVars = this.twentyConfigService.getAll();
const groupedData = new Map< const groupedData = new Map<ConfigVariablesGroup, ConfigVariable[]>();
EnvironmentVariablesGroup,
EnvironmentVariable[]
>();
for (const [varName, { value, metadata }] of Object.entries(rawEnvVars)) { for (const [varName, { value, metadata }] of Object.entries(rawEnvVars)) {
const { group, description } = metadata; const { group, description } = metadata;
const envVar: EnvironmentVariable = { const envVar: ConfigVariable = {
name: varName, name: varName,
description, description,
value: String(value), value: String(value),
sensitive: metadata.sensitive ?? false, isSensitive: metadata.isSensitive ?? false,
}; };
if (!groupedData.has(group)) { if (!groupedData.has(group)) {
@ -147,20 +144,17 @@ export class AdminPanelService {
groupedData.get(group)?.push(envVar); groupedData.get(group)?.push(envVar);
} }
const groups: EnvironmentVariablesGroupData[] = Array.from( const groups: ConfigVariablesGroupData[] = Array.from(groupedData.entries())
groupedData.entries(),
)
.sort((a, b) => { .sort((a, b) => {
const positionA = ENVIRONMENT_VARIABLES_GROUP_METADATA[a[0]].position; const positionA = CONFIG_VARIABLES_GROUP_METADATA[a[0]].position;
const positionB = ENVIRONMENT_VARIABLES_GROUP_METADATA[b[0]].position; const positionB = CONFIG_VARIABLES_GROUP_METADATA[b[0]].position;
return positionA - positionB; return positionA - positionB;
}) })
.map(([name, variables]) => ({ .map(([name, variables]) => ({
name, name,
description: ENVIRONMENT_VARIABLES_GROUP_METADATA[name].description, description: CONFIG_VARIABLES_GROUP_METADATA[name].description,
isHiddenOnLoad: isHiddenOnLoad: CONFIG_VARIABLES_GROUP_METADATA[name].isHiddenOnLoad,
ENVIRONMENT_VARIABLES_GROUP_METADATA[name].isHiddenOnLoad,
variables: variables.sort((a, b) => a.name.localeCompare(b.name)), variables: variables.sort((a, b) => a.name.localeCompare(b.name)),
})); }));
@ -168,7 +162,7 @@ export class AdminPanelService {
} }
async getVersionInfo(): Promise<VersionInfo> { async getVersionInfo(): Promise<VersionInfo> {
const currentVersion = this.environmentService.get('APP_VERSION'); const currentVersion = this.twentyConfigService.get('APP_VERSION');
try { try {
const response = await axios.get( const response = await axios.get(

View File

@ -1,7 +1,7 @@
import { Field, ObjectType } from '@nestjs/graphql'; import { Field, ObjectType } from '@nestjs/graphql';
@ObjectType() @ObjectType()
export class EnvironmentVariable { export class ConfigVariable {
@Field() @Field()
name: string; name: string;
@ -12,5 +12,5 @@ export class EnvironmentVariable {
value: string; value: string;
@Field() @Field()
sensitive: boolean; isSensitive: boolean;
} }

View File

@ -0,0 +1,23 @@
import { Field, ObjectType, registerEnumType } from '@nestjs/graphql';
import { ConfigVariable } from 'src/engine/core-modules/admin-panel/dtos/config-variable.dto';
import { ConfigVariablesGroup } from 'src/engine/core-modules/twenty-config/enums/config-variables-group.enum';
registerEnumType(ConfigVariablesGroup, {
name: 'ConfigVariablesGroup',
});
@ObjectType()
export class ConfigVariablesGroupData {
@Field(() => [ConfigVariable])
variables: ConfigVariable[];
@Field(() => ConfigVariablesGroup)
name: ConfigVariablesGroup;
@Field(() => String, { defaultValue: '' })
description: string;
@Field(() => Boolean, { defaultValue: false })
isHiddenOnLoad: boolean;
}

View File

@ -0,0 +1,9 @@
import { Field, ObjectType } from '@nestjs/graphql';
import { ConfigVariablesGroupData } from 'src/engine/core-modules/admin-panel/dtos/config-variables-group.dto';
@ObjectType()
export class ConfigVariablesOutput {
@Field(() => [ConfigVariablesGroupData])
groups: ConfigVariablesGroupData[];
}

View File

@ -1,24 +0,0 @@
import { Field, ObjectType, registerEnumType } from '@nestjs/graphql';
import { EnvironmentVariablesGroup } from 'src/engine/core-modules/environment/enums/environment-variables-group.enum';
import { EnvironmentVariable } from './environment-variable.dto';
registerEnumType(EnvironmentVariablesGroup, {
name: 'EnvironmentVariablesGroup',
});
@ObjectType()
export class EnvironmentVariablesGroupData {
@Field(() => [EnvironmentVariable])
variables: EnvironmentVariable[];
@Field(() => EnvironmentVariablesGroup)
name: EnvironmentVariablesGroup;
@Field(() => String, { defaultValue: '' })
description: string;
@Field(() => Boolean, { defaultValue: false })
isHiddenOnLoad: boolean;
}

View File

@ -1,9 +0,0 @@
import { Field, ObjectType } from '@nestjs/graphql';
import { EnvironmentVariablesGroupData } from './environment-variables-group.dto';
@ObjectType()
export class EnvironmentVariablesOutput {
@Field(() => [EnvironmentVariablesGroupData])
groups: EnvironmentVariablesGroupData[];
}

View File

@ -1,8 +1,8 @@
import { HttpService } from '@nestjs/axios'; import { HttpService } from '@nestjs/axios';
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { AnalyticsService } from './analytics.service'; import { AnalyticsService } from './analytics.service';
@ -14,7 +14,7 @@ describe('AnalyticsService', () => {
providers: [ providers: [
AnalyticsService, AnalyticsService,
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: {}, useValue: {},
}, },
{ {

View File

@ -1,6 +1,6 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
type CreateEventInput = { type CreateEventInput = {
action: string; action: string;
@ -9,14 +9,14 @@ type CreateEventInput = {
@Injectable() @Injectable()
export class AnalyticsService { export class AnalyticsService {
constructor(private readonly environmentService: EnvironmentService) {} constructor(private readonly twentyConfigService: TwentyConfigService) {}
async create( async create(
createEventInput: CreateEventInput, createEventInput: CreateEventInput,
userId: string | null | undefined, userId: string | null | undefined,
workspaceId: string | null | undefined, workspaceId: string | null | undefined,
) { ) {
if (!this.environmentService.get('ANALYTICS_ENABLED')) { if (!this.twentyConfigService.get('ANALYTICS_ENABLED')) {
return { success: true }; return { success: true };
} }

View File

@ -16,7 +16,7 @@ import {
import { approvedAccessDomainValidator } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.validate'; import { approvedAccessDomainValidator } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.validate';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EmailService } from 'src/engine/core-modules/email/email.service'; import { EmailService } from 'src/engine/core-modules/email/email.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { isWorkDomain } from 'src/utils/is-work-email'; import { isWorkDomain } from 'src/utils/is-work-email';
@ -28,7 +28,7 @@ export class ApprovedAccessDomainService {
@InjectRepository(ApprovedAccessDomainEntity, 'core') @InjectRepository(ApprovedAccessDomainEntity, 'core')
private readonly approvedAccessDomainRepository: Repository<ApprovedAccessDomainEntity>, private readonly approvedAccessDomainRepository: Repository<ApprovedAccessDomainEntity>,
private readonly emailService: EmailService, private readonly emailService: EmailService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly domainManagerService: DomainManagerService, private readonly domainManagerService: DomainManagerService,
) {} ) {}
@ -70,7 +70,7 @@ export class ApprovedAccessDomainService {
firstName: sender.firstName, firstName: sender.firstName,
lastName: sender.lastName, lastName: sender.lastName,
}, },
serverUrl: this.environmentService.get('SERVER_URL'), serverUrl: this.twentyConfigService.get('SERVER_URL'),
locale: 'en' as keyof typeof APP_LOCALES, locale: 'en' as keyof typeof APP_LOCALES,
}); });
const html = await render(emailTemplate); const html = await render(emailTemplate);
@ -79,7 +79,7 @@ export class ApprovedAccessDomainService {
}); });
await this.emailService.send({ await this.emailService.send({
from: `${sender.firstName} ${sender.lastName} (via Twenty) <${this.environmentService.get('EMAIL_FROM_ADDRESS')}>`, from: `${sender.firstName} ${sender.lastName} (via Twenty) <${this.twentyConfigService.get('EMAIL_FROM_ADDRESS')}>`,
to, to,
subject: 'Approve your access domain', subject: 'Approve your access domain',
text, text,
@ -94,7 +94,7 @@ export class ApprovedAccessDomainService {
JSON.stringify({ JSON.stringify({
id: approvedAccessDomain.id, id: approvedAccessDomain.id,
domain: approvedAccessDomain.domain, domain: approvedAccessDomain.domain,
key: this.environmentService.get('APP_SECRET'), key: this.twentyConfigService.get('APP_SECRET'),
}), }),
) )
.digest('hex'); .digest('hex');

View File

@ -3,16 +3,16 @@ import { getRepositoryToken } from '@nestjs/typeorm';
import { DeleteResult, Repository } from 'typeorm'; import { DeleteResult, Repository } from 'typeorm';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { User } from 'src/engine/core-modules/user/user.entity';
import { EmailService } from 'src/engine/core-modules/email/email.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { ApprovedAccessDomain } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.entity'; import { ApprovedAccessDomain } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.entity';
import { import {
ApprovedAccessDomainException, ApprovedAccessDomainException,
ApprovedAccessDomainExceptionCode, ApprovedAccessDomainExceptionCode,
} from 'src/engine/core-modules/approved-access-domain/approved-access-domain.exception'; } from 'src/engine/core-modules/approved-access-domain/approved-access-domain.exception';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EmailService } from 'src/engine/core-modules/email/email.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { ApprovedAccessDomainService } from './approved-access-domain.service'; import { ApprovedAccessDomainService } from './approved-access-domain.service';
@ -20,7 +20,7 @@ describe('ApprovedAccessDomainService', () => {
let service: ApprovedAccessDomainService; let service: ApprovedAccessDomainService;
let approvedAccessDomainRepository: Repository<ApprovedAccessDomain>; let approvedAccessDomainRepository: Repository<ApprovedAccessDomain>;
let emailService: EmailService; let emailService: EmailService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
let domainManagerService: DomainManagerService; let domainManagerService: DomainManagerService;
beforeEach(async () => { beforeEach(async () => {
@ -43,7 +43,7 @@ describe('ApprovedAccessDomainService', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -64,7 +64,7 @@ describe('ApprovedAccessDomainService', () => {
getRepositoryToken(ApprovedAccessDomain, 'core'), getRepositoryToken(ApprovedAccessDomain, 'core'),
); );
emailService = module.get<EmailService>(EmailService); emailService = module.get<EmailService>(EmailService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
domainManagerService = domainManagerService =
module.get<DomainManagerService>(DomainManagerService); module.get<DomainManagerService>(DomainManagerService);
}); });
@ -267,7 +267,7 @@ describe('ApprovedAccessDomainService', () => {
.mockReturnValue(new URL('https://sub.twenty.com')); .mockReturnValue(new URL('https://sub.twenty.com'));
jest jest
.spyOn(environmentService, 'get') .spyOn(twentyConfigService, 'get')
.mockImplementation((key: string) => { .mockImplementation((key: string) => {
if (key === 'EMAIL_FROM_ADDRESS') return 'no-reply@example.com'; if (key === 'EMAIL_FROM_ADDRESS') return 'no-reply@example.com';
if (key === 'SERVER_URL') return 'https://api.example.com'; if (key === 'SERVER_URL') return 'https://api.example.com';

View File

@ -22,9 +22,9 @@ import { GoogleAPIsService } from 'src/engine/core-modules/auth/services/google-
import { TransientTokenService } from 'src/engine/core-modules/auth/token/services/transient-token.service'; import { TransientTokenService } from 'src/engine/core-modules/auth/token/services/transient-token.service';
import { GoogleAPIsRequest } from 'src/engine/core-modules/auth/types/google-api-request.type'; import { GoogleAPIsRequest } from 'src/engine/core-modules/auth/types/google-api-request.type';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service'; import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service'; import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
@Controller('auth/google-apis') @Controller('auth/google-apis')
@ -33,7 +33,7 @@ export class GoogleAPIsAuthController {
constructor( constructor(
private readonly googleAPIsService: GoogleAPIsService, private readonly googleAPIsService: GoogleAPIsService,
private readonly transientTokenService: TransientTokenService, private readonly transientTokenService: TransientTokenService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly onboardingService: OnboardingService, private readonly onboardingService: OnboardingService,
private readonly domainManagerService: DomainManagerService, private readonly domainManagerService: DomainManagerService,
private readonly guardRedirectService: GuardRedirectService, private readonly guardRedirectService: GuardRedirectService,
@ -123,7 +123,7 @@ export class GoogleAPIsAuthController {
this.guardRedirectService.getRedirectErrorUrlAndCaptureExceptions( this.guardRedirectService.getRedirectErrorUrlAndCaptureExceptions(
err, err,
workspace ?? { workspace ?? {
subdomain: this.environmentService.get('DEFAULT_SUBDOMAIN'), subdomain: this.twentyConfigService.get('DEFAULT_SUBDOMAIN'),
customDomain: null, customDomain: null,
}, },
), ),

View File

@ -22,9 +22,9 @@ import { MicrosoftAPIsService } from 'src/engine/core-modules/auth/services/micr
import { TransientTokenService } from 'src/engine/core-modules/auth/token/services/transient-token.service'; import { TransientTokenService } from 'src/engine/core-modules/auth/token/services/transient-token.service';
import { MicrosoftAPIsRequest } from 'src/engine/core-modules/auth/types/microsoft-api-request.type'; import { MicrosoftAPIsRequest } from 'src/engine/core-modules/auth/types/microsoft-api-request.type';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service'; import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service'; import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
@Controller('auth/microsoft-apis') @Controller('auth/microsoft-apis')
@ -33,7 +33,7 @@ export class MicrosoftAPIsAuthController {
constructor( constructor(
private readonly microsoftAPIsService: MicrosoftAPIsService, private readonly microsoftAPIsService: MicrosoftAPIsService,
private readonly transientTokenService: TransientTokenService, private readonly transientTokenService: TransientTokenService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly domainManagerService: DomainManagerService, private readonly domainManagerService: DomainManagerService,
private readonly onboardingService: OnboardingService, private readonly onboardingService: OnboardingService,
private readonly guardRedirectService: GuardRedirectService, private readonly guardRedirectService: GuardRedirectService,
@ -130,7 +130,7 @@ export class MicrosoftAPIsAuthController {
this.guardRedirectService.getRedirectErrorUrlAndCaptureExceptions( this.guardRedirectService.getRedirectErrorUrlAndCaptureExceptions(
err, err,
workspace ?? { workspace ?? {
subdomain: this.environmentService.get('DEFAULT_SUBDOMAIN'), subdomain: this.twentyConfigService.get('DEFAULT_SUBDOMAIN'),
customDomain: null, customDomain: null,
}, },
), ),

View File

@ -6,19 +6,19 @@ import {
AuthException, AuthException,
AuthExceptionCode, AuthExceptionCode,
} from 'src/engine/core-modules/auth/auth.exception'; } from 'src/engine/core-modules/auth/auth.exception';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service'; import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class EnterpriseFeaturesEnabledGuard implements CanActivate { export class EnterpriseFeaturesEnabledGuard implements CanActivate {
constructor( constructor(
private readonly guardRedirectService: GuardRedirectService, private readonly guardRedirectService: GuardRedirectService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
canActivate(context: ExecutionContext): boolean { canActivate(context: ExecutionContext): boolean {
try { try {
if (!this.environmentService.get('ENTERPRISE_KEY')) { if (!this.twentyConfigService.get('ENTERPRISE_KEY')) {
throw new AuthException( throw new AuthException(
'Enterprise key missing', 'Enterprise key missing',
AuthExceptionCode.MISSING_ENVIRONMENT_VARIABLE, AuthExceptionCode.MISSING_ENVIRONMENT_VARIABLE,

View File

@ -7,8 +7,8 @@ import {
} from 'src/engine/core-modules/auth/auth.exception'; } 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 { GoogleAPIsOauthExchangeCodeForTokenStrategy } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-exchange-code-for-token.auth.strategy';
import { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util'; import { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service'; import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class GoogleAPIsOauthExchangeCodeForTokenGuard extends AuthGuard( export class GoogleAPIsOauthExchangeCodeForTokenGuard extends AuthGuard(
@ -16,7 +16,7 @@ export class GoogleAPIsOauthExchangeCodeForTokenGuard extends AuthGuard(
) { ) {
constructor( constructor(
private readonly guardRedirectService: GuardRedirectService, private readonly guardRedirectService: GuardRedirectService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) { ) {
super(); super();
} }
@ -27,8 +27,8 @@ export class GoogleAPIsOauthExchangeCodeForTokenGuard extends AuthGuard(
const state = JSON.parse(request.query.state); const state = JSON.parse(request.query.state);
if ( if (
!this.environmentService.get('MESSAGING_PROVIDER_GMAIL_ENABLED') && !this.twentyConfigService.get('MESSAGING_PROVIDER_GMAIL_ENABLED') &&
!this.environmentService.get('CALENDAR_PROVIDER_GOOGLE_ENABLED') !this.twentyConfigService.get('CALENDAR_PROVIDER_GOOGLE_ENABLED')
) { ) {
throw new AuthException( throw new AuthException(
'Google apis auth is not enabled', 'Google apis auth is not enabled',
@ -36,7 +36,7 @@ export class GoogleAPIsOauthExchangeCodeForTokenGuard extends AuthGuard(
); );
} }
new GoogleAPIsOauthExchangeCodeForTokenStrategy(this.environmentService); new GoogleAPIsOauthExchangeCodeForTokenStrategy(this.twentyConfigService);
setRequestExtraParams(request, { setRequestExtraParams(request, {
transientToken: state.transientToken, transientToken: state.transientToken,

View File

@ -11,15 +11,15 @@ import {
import { GoogleAPIsOauthRequestCodeStrategy } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-request-code.auth.strategy'; 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 { 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 { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
@Injectable() @Injectable()
export class GoogleAPIsOauthRequestCodeGuard extends AuthGuard('google-apis') { export class GoogleAPIsOauthRequestCodeGuard extends AuthGuard('google-apis') {
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly transientTokenService: TransientTokenService, private readonly transientTokenService: TransientTokenService,
private readonly guardRedirectService: GuardRedirectService, private readonly guardRedirectService: GuardRedirectService,
@InjectRepository(Workspace, 'core') @InjectRepository(Workspace, 'core')
@ -57,8 +57,8 @@ export class GoogleAPIsOauthRequestCodeGuard extends AuthGuard('google-apis') {
}); });
if ( if (
!this.environmentService.get('MESSAGING_PROVIDER_GMAIL_ENABLED') && !this.twentyConfigService.get('MESSAGING_PROVIDER_GMAIL_ENABLED') &&
!this.environmentService.get('CALENDAR_PROVIDER_GOOGLE_ENABLED') !this.twentyConfigService.get('CALENDAR_PROVIDER_GOOGLE_ENABLED')
) { ) {
throw new AuthException( throw new AuthException(
'Google apis auth is not enabled', 'Google apis auth is not enabled',
@ -66,7 +66,7 @@ export class GoogleAPIsOauthRequestCodeGuard extends AuthGuard('google-apis') {
); );
} }
new GoogleAPIsOauthRequestCodeStrategy(this.environmentService); new GoogleAPIsOauthRequestCodeStrategy(this.twentyConfigService);
return (await super.canActivate(context)) as boolean; return (await super.canActivate(context)) as boolean;
} catch (err) { } catch (err) {

View File

@ -5,26 +5,26 @@ import {
AuthExceptionCode, AuthExceptionCode,
} from 'src/engine/core-modules/auth/auth.exception'; } from 'src/engine/core-modules/auth/auth.exception';
import { GoogleStrategy } from 'src/engine/core-modules/auth/strategies/google.auth.strategy'; import { GoogleStrategy } from 'src/engine/core-modules/auth/strategies/google.auth.strategy';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service'; import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class GoogleProviderEnabledGuard implements CanActivate { export class GoogleProviderEnabledGuard implements CanActivate {
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly guardRedirectService: GuardRedirectService, private readonly guardRedirectService: GuardRedirectService,
) {} ) {}
canActivate(context: ExecutionContext): boolean { canActivate(context: ExecutionContext): boolean {
try { try {
if (!this.environmentService.get('AUTH_GOOGLE_ENABLED')) { if (!this.twentyConfigService.get('AUTH_GOOGLE_ENABLED')) {
throw new AuthException( throw new AuthException(
'Google auth is not enabled', 'Google auth is not enabled',
AuthExceptionCode.GOOGLE_API_AUTH_DISABLED, AuthExceptionCode.GOOGLE_API_AUTH_DISABLED,
); );
} }
new GoogleStrategy(this.environmentService); new GoogleStrategy(this.twentyConfigService);
return true; return true;
} catch (err) { } catch (err) {

View File

@ -7,8 +7,8 @@ import {
} from 'src/engine/core-modules/auth/auth.exception'; } from 'src/engine/core-modules/auth/auth.exception';
import { MicrosoftAPIsOauthExchangeCodeForTokenStrategy } from 'src/engine/core-modules/auth/strategies/microsoft-apis-oauth-exchange-code-for-token.auth.strategy'; import { MicrosoftAPIsOauthExchangeCodeForTokenStrategy } from 'src/engine/core-modules/auth/strategies/microsoft-apis-oauth-exchange-code-for-token.auth.strategy';
import { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util'; import { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service'; import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class MicrosoftAPIsOauthExchangeCodeForTokenGuard extends AuthGuard( export class MicrosoftAPIsOauthExchangeCodeForTokenGuard extends AuthGuard(
@ -16,7 +16,7 @@ export class MicrosoftAPIsOauthExchangeCodeForTokenGuard extends AuthGuard(
) { ) {
constructor( constructor(
private readonly guardRedirectService: GuardRedirectService, private readonly guardRedirectService: GuardRedirectService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) { ) {
super(); super();
} }
@ -27,8 +27,8 @@ export class MicrosoftAPIsOauthExchangeCodeForTokenGuard extends AuthGuard(
const state = JSON.parse(request.query.state); const state = JSON.parse(request.query.state);
if ( if (
!this.environmentService.get('MESSAGING_PROVIDER_MICROSOFT_ENABLED') && !this.twentyConfigService.get('MESSAGING_PROVIDER_MICROSOFT_ENABLED') &&
!this.environmentService.get('CALENDAR_PROVIDER_MICROSOFT_ENABLED') !this.twentyConfigService.get('CALENDAR_PROVIDER_MICROSOFT_ENABLED')
) { ) {
throw new AuthException( throw new AuthException(
'Microsoft apis auth is not enabled', 'Microsoft apis auth is not enabled',
@ -37,7 +37,7 @@ export class MicrosoftAPIsOauthExchangeCodeForTokenGuard extends AuthGuard(
} }
new MicrosoftAPIsOauthExchangeCodeForTokenStrategy( new MicrosoftAPIsOauthExchangeCodeForTokenStrategy(
this.environmentService, this.twentyConfigService,
); );
setRequestExtraParams(request, { setRequestExtraParams(request, {

View File

@ -11,17 +11,17 @@ import {
import { MicrosoftAPIsOauthRequestCodeStrategy } from 'src/engine/core-modules/auth/strategies/microsoft-apis-oauth-request-code.auth.strategy'; import { MicrosoftAPIsOauthRequestCodeStrategy } from 'src/engine/core-modules/auth/strategies/microsoft-apis-oauth-request-code.auth.strategy';
import { TransientTokenService } from 'src/engine/core-modules/auth/token/services/transient-token.service'; 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 { setRequestExtraParams } from 'src/engine/core-modules/auth/utils/google-apis-set-request-extra-params.util';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
@Injectable() @Injectable()
export class MicrosoftAPIsOauthRequestCodeGuard extends AuthGuard( export class MicrosoftAPIsOauthRequestCodeGuard extends AuthGuard(
'microsoft-apis', 'microsoft-apis',
) { ) {
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly transientTokenService: TransientTokenService, private readonly transientTokenService: TransientTokenService,
private readonly guardRedirectService: GuardRedirectService, private readonly guardRedirectService: GuardRedirectService,
@InjectRepository(Workspace, 'core') @InjectRepository(Workspace, 'core')
@ -38,8 +38,8 @@ export class MicrosoftAPIsOauthRequestCodeGuard extends AuthGuard(
try { try {
if ( if (
!this.environmentService.get('MESSAGING_PROVIDER_MICROSOFT_ENABLED') && !this.twentyConfigService.get('MESSAGING_PROVIDER_MICROSOFT_ENABLED') &&
!this.environmentService.get('CALENDAR_PROVIDER_MICROSOFT_ENABLED') !this.twentyConfigService.get('CALENDAR_PROVIDER_MICROSOFT_ENABLED')
) { ) {
throw new AuthException( throw new AuthException(
'Microsoft apis auth is not enabled', 'Microsoft apis auth is not enabled',
@ -58,7 +58,7 @@ export class MicrosoftAPIsOauthRequestCodeGuard extends AuthGuard(
id: workspaceId, id: workspaceId,
}); });
new MicrosoftAPIsOauthRequestCodeStrategy(this.environmentService); new MicrosoftAPIsOauthRequestCodeStrategy(this.twentyConfigService);
setRequestExtraParams(request, { setRequestExtraParams(request, {
transientToken: request.query.transientToken, transientToken: request.query.transientToken,
redirectLocation: request.query.redirectLocation, redirectLocation: request.query.redirectLocation,

View File

@ -5,26 +5,26 @@ import {
AuthExceptionCode, AuthExceptionCode,
} from 'src/engine/core-modules/auth/auth.exception'; } from 'src/engine/core-modules/auth/auth.exception';
import { MicrosoftStrategy } from 'src/engine/core-modules/auth/strategies/microsoft.auth.strategy'; import { MicrosoftStrategy } from 'src/engine/core-modules/auth/strategies/microsoft.auth.strategy';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service'; import { GuardRedirectService } from 'src/engine/core-modules/guard-redirect/services/guard-redirect.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class MicrosoftProviderEnabledGuard implements CanActivate { export class MicrosoftProviderEnabledGuard implements CanActivate {
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly guardRedirectService: GuardRedirectService, private readonly guardRedirectService: GuardRedirectService,
) {} ) {}
canActivate(context: ExecutionContext): boolean { canActivate(context: ExecutionContext): boolean {
try { try {
if (!this.environmentService.get('AUTH_MICROSOFT_ENABLED')) { if (!this.twentyConfigService.get('AUTH_MICROSOFT_ENABLED')) {
throw new AuthException( throw new AuthException(
'Microsoft auth is not enabled', 'Microsoft auth is not enabled',
AuthExceptionCode.MICROSOFT_API_AUTH_DISABLED, AuthExceptionCode.MICROSOFT_API_AUTH_DISABLED,
); );
} }
new MicrosoftStrategy(this.environmentService); new MicrosoftStrategy(this.twentyConfigService);
return true; return true;
} catch (err) { } catch (err) {

View File

@ -1,14 +1,14 @@
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { ApiKeyService } from './api-key.service'; import { ApiKeyService } from './api-key.service';
describe('ApiKeyService', () => { describe('ApiKeyService', () => {
let service: ApiKeyService; let service: ApiKeyService;
let jwtWrapperService: JwtWrapperService; let jwtWrapperService: JwtWrapperService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
beforeEach(async () => { beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({ const module: TestingModule = await Test.createTestingModule({
@ -22,7 +22,7 @@ describe('ApiKeyService', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -32,7 +32,7 @@ describe('ApiKeyService', () => {
service = module.get<ApiKeyService>(ApiKeyService); service = module.get<ApiKeyService>(ApiKeyService);
jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService); jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
}); });
it('should be defined', () => { it('should be defined', () => {
@ -51,7 +51,7 @@ describe('ApiKeyService', () => {
const apiKeyId = 'api-key-id'; const apiKeyId = 'api-key-id';
const mockToken = 'mock-token'; const mockToken = 'mock-token';
jest.spyOn(environmentService, 'get').mockReturnValue('1h'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('1h');
jest.spyOn(jwtWrapperService, 'sign').mockReturnValue(mockToken); jest.spyOn(jwtWrapperService, 'sign').mockReturnValue(mockToken);
jest jest
.spyOn(jwtWrapperService, 'generateAppSecret') .spyOn(jwtWrapperService, 'generateAppSecret')

View File

@ -1,14 +1,14 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { ApiKeyToken } from 'src/engine/core-modules/auth/dto/token.entity'; import { ApiKeyToken } from 'src/engine/core-modules/auth/dto/token.entity';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class ApiKeyService { export class ApiKeyService {
constructor( constructor(
private readonly jwtWrapperService: JwtWrapperService, private readonly jwtWrapperService: JwtWrapperService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
async generateApiKeyToken( async generateApiKeyToken(

View File

@ -3,16 +3,16 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { WorkspaceAuthProvider } from 'src/engine/core-modules/workspace/types/workspace.type'; import { WorkspaceAuthProvider } from 'src/engine/core-modules/workspace/types/workspace.type';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
@Injectable() @Injectable()
export class AuthSsoService { export class AuthSsoService {
constructor( constructor(
@InjectRepository(Workspace, 'core') @InjectRepository(Workspace, 'core')
private readonly workspaceRepository: Repository<Workspace>, private readonly workspaceRepository: Repository<Workspace>,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
private getAuthProviderColumnNameByProvider( private getAuthProviderColumnNameByProvider(
@ -41,7 +41,7 @@ export class AuthSsoService {
workspaceId?: string, workspaceId?: string,
) { ) {
if ( if (
this.environmentService.get('IS_MULTIWORKSPACE_ENABLED') && this.twentyConfigService.get('IS_MULTIWORKSPACE_ENABLED') &&
!workspaceId !workspaceId
) { ) {
// Multi-workspace enable mode but on non workspace url. // Multi-workspace enable mode but on non workspace url.

View File

@ -4,13 +4,13 @@ import { getRepositoryToken } from '@nestjs/typeorm';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { AuthSsoService } from 'src/engine/core-modules/auth/services/auth-sso.service'; import { AuthSsoService } from 'src/engine/core-modules/auth/services/auth-sso.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
describe('AuthSsoService', () => { describe('AuthSsoService', () => {
let authSsoService: AuthSsoService; let authSsoService: AuthSsoService;
let workspaceRepository: Repository<Workspace>; let workspaceRepository: Repository<Workspace>;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
beforeEach(async () => { beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({ const module: TestingModule = await Test.createTestingModule({
@ -23,7 +23,7 @@ describe('AuthSsoService', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -35,7 +35,7 @@ describe('AuthSsoService', () => {
workspaceRepository = module.get<Repository<Workspace>>( workspaceRepository = module.get<Repository<Workspace>>(
getRepositoryToken(Workspace, 'core'), getRepositoryToken(Workspace, 'core'),
); );
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
}); });
describe('findWorkspaceFromWorkspaceIdOrAuthProvider', () => { describe('findWorkspaceFromWorkspaceIdOrAuthProvider', () => {
@ -67,7 +67,7 @@ describe('AuthSsoService', () => {
const email = 'test@example.com'; const email = 'test@example.com';
const mockWorkspace = { id: 'workspace-id-456' } as Workspace; const mockWorkspace = { id: 'workspace-id-456' } as Workspace;
jest.spyOn(environmentService, 'get').mockReturnValue(true); jest.spyOn(twentyConfigService, 'get').mockReturnValue(true);
jest jest
.spyOn(workspaceRepository, 'findOne') .spyOn(workspaceRepository, 'findOne')
.mockResolvedValue(mockWorkspace); .mockResolvedValue(mockWorkspace);
@ -97,7 +97,7 @@ describe('AuthSsoService', () => {
}); });
it('should return undefined if no workspace is found when multi-workspace mode is enabled', async () => { it('should return undefined if no workspace is found when multi-workspace mode is enabled', async () => {
jest.spyOn(environmentService, 'get').mockReturnValue(true); jest.spyOn(twentyConfigService, 'get').mockReturnValue(true);
jest.spyOn(workspaceRepository, 'findOne').mockResolvedValue(null); jest.spyOn(workspaceRepository, 'findOne').mockResolvedValue(null);
const result = const result =
@ -110,7 +110,7 @@ describe('AuthSsoService', () => {
}); });
it('should throw an error for an invalid authProvider', async () => { it('should throw an error for an invalid authProvider', async () => {
jest.spyOn(environmentService, 'get').mockReturnValue(true); jest.spyOn(twentyConfigService, 'get').mockReturnValue(true);
await expect( await expect(
authSsoService.findWorkspaceFromWorkspaceIdOrAuthProvider({ authSsoService.findWorkspaceFromWorkspaceIdOrAuthProvider({

View File

@ -16,7 +16,7 @@ import { RefreshTokenService } from 'src/engine/core-modules/auth/token/services
import { ExistingUserOrNewUser } from 'src/engine/core-modules/auth/types/signInUp.type'; import { ExistingUserOrNewUser } from 'src/engine/core-modules/auth/types/signInUp.type';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EmailService } from 'src/engine/core-modules/email/email.service'; import { EmailService } from 'src/engine/core-modules/email/email.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.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 { UserService } from 'src/engine/core-modules/user/services/user.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
@ -35,7 +35,7 @@ const workspaceInvitationGetOneWorkspaceInvitationMock = jest.fn();
const workspaceInvitationValidatePersonalInvitationMock = jest.fn(); const workspaceInvitationValidatePersonalInvitationMock = jest.fn();
const userWorkspaceAddUserToWorkspaceMock = jest.fn(); const userWorkspaceAddUserToWorkspaceMock = jest.fn();
const environmentServiceGetMock = jest.fn(); const twentyConfigServiceGetMock = jest.fn();
describe('AuthService', () => { describe('AuthService', () => {
let service: AuthService; let service: AuthService;
@ -75,9 +75,9 @@ describe('AuthService', () => {
useValue: {}, useValue: {},
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: environmentServiceGetMock, get: twentyConfigServiceGetMock,
}, },
}, },
{ {
@ -138,7 +138,7 @@ describe('AuthService', () => {
}); });
beforeEach(() => { beforeEach(() => {
environmentServiceGetMock.mockReturnValue(false); twentyConfigServiceGetMock.mockReturnValue(false);
}); });
it('should be defined', async () => { it('should be defined', async () => {

View File

@ -13,7 +13,7 @@ import { APP_LOCALES } from 'twenty-shared/translations';
import { isDefined } from 'twenty-shared/utils'; import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; import { NodeEnvironment } from 'src/engine/core-modules/twenty-config/interfaces/node-environment.interface';
import { import {
AppToken, AppToken,
@ -51,7 +51,7 @@ import {
import { WorkspaceSubdomainCustomDomainAndIsCustomDomainEnabledType } from 'src/engine/core-modules/domain-manager/domain-manager.type'; import { WorkspaceSubdomainCustomDomainAndIsCustomDomainEnabledType } from 'src/engine/core-modules/domain-manager/domain-manager.type';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EmailService } from 'src/engine/core-modules/email/email.service'; import { EmailService } from 'src/engine/core-modules/email/email.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.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 { UserService } from 'src/engine/core-modules/user/services/user.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
@ -77,7 +77,7 @@ export class AuthService {
private readonly workspaceRepository: Repository<Workspace>, private readonly workspaceRepository: Repository<Workspace>,
@InjectRepository(User, 'core') @InjectRepository(User, 'core')
private readonly userRepository: Repository<User>, private readonly userRepository: Repository<User>,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly emailService: EmailService, private readonly emailService: EmailService,
@InjectRepository(AppToken, 'core') @InjectRepository(AppToken, 'core')
private readonly appTokenRepository: Repository<AppToken>, private readonly appTokenRepository: Repository<AppToken>,
@ -164,7 +164,7 @@ export class AuthService {
); );
} }
const isEmailVerificationRequired = this.environmentService.get( const isEmailVerificationRequired = this.twentyConfigService.get(
'IS_EMAIL_VERIFICATION_REQUIRED', 'IS_EMAIL_VERIFICATION_REQUIRED',
); );
@ -323,10 +323,10 @@ export class AuthService {
id: 'chrome', id: 'chrome',
name: 'Chrome Extension', name: 'Chrome Extension',
redirectUrl: redirectUrl:
this.environmentService.get('NODE_ENV') === this.twentyConfigService.get('NODE_ENV') ===
NodeEnvironment.development NodeEnvironment.development
? authorizeAppInput.redirectUrl ? authorizeAppInput.redirectUrl
: `https://${this.environmentService.get( : `https://${this.twentyConfigService.get(
'CHROME_EXTENSION_ID', 'CHROME_EXTENSION_ID',
)}.chromiumapp.org/`, )}.chromiumapp.org/`,
}, },
@ -448,9 +448,9 @@ export class AuthService {
i18n.activate(locale); i18n.activate(locale);
this.emailService.send({ this.emailService.send({
from: `${this.environmentService.get( from: `${this.twentyConfigService.get(
'EMAIL_FROM_NAME', 'EMAIL_FROM_NAME',
)} <${this.environmentService.get('EMAIL_FROM_ADDRESS')}>`, )} <${this.twentyConfigService.get('EMAIL_FROM_ADDRESS')}>`,
to: user.email, to: user.email,
subject: t`Your Password Has Been Successfully Changed`, subject: t`Your Password Has Been Successfully Changed`,
text, text,

View File

@ -1,16 +1,16 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { ConnectedAccountProvider } from 'twenty-shared/types';
import { EntityManager, Repository } from 'typeorm'; import { EntityManager, Repository } from 'typeorm';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import { ConnectedAccountProvider } from 'twenty-shared/types';
import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action';
import { getGoogleApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes'; import { getGoogleApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; 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 { 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 { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter'; import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter';
@ -45,7 +45,7 @@ export class GoogleAPIsService {
private readonly messageQueueService: MessageQueueService, private readonly messageQueueService: MessageQueueService,
@InjectMessageQueue(MessageQueue.calendarQueue) @InjectMessageQueue(MessageQueue.calendarQueue)
private readonly calendarQueueService: MessageQueueService, private readonly calendarQueueService: MessageQueueService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly accountsToReconnectService: AccountsToReconnectService, private readonly accountsToReconnectService: AccountsToReconnectService,
private readonly workspaceEventEmitter: WorkspaceEventEmitter, private readonly workspaceEventEmitter: WorkspaceEventEmitter,
@InjectRepository(ObjectMetadataEntity, 'metadata') @InjectRepository(ObjectMetadataEntity, 'metadata')
@ -69,7 +69,7 @@ export class GoogleAPIsService {
messageVisibility, messageVisibility,
} = input; } = input;
const isCalendarEnabled = this.environmentService.get( const isCalendarEnabled = this.twentyConfigService.get(
'CALENDAR_PROVIDER_GOOGLE_ENABLED', 'CALENDAR_PROVIDER_GOOGLE_ENABLED',
); );
@ -300,7 +300,7 @@ export class GoogleAPIsService {
} }
}); });
if (this.environmentService.get('MESSAGING_PROVIDER_GMAIL_ENABLED')) { if (this.twentyConfigService.get('MESSAGING_PROVIDER_GMAIL_ENABLED')) {
const messageChannels = await messageChannelRepository.find({ const messageChannels = await messageChannelRepository.find({
where: { where: {
connectedAccountId: newOrExistingConnectedAccountId, connectedAccountId: newOrExistingConnectedAccountId,

View File

@ -1,16 +1,16 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { ConnectedAccountProvider } from 'twenty-shared/types';
import { EntityManager, Repository } from 'typeorm'; import { EntityManager, Repository } from 'typeorm';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import { ConnectedAccountProvider } from 'twenty-shared/types';
import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action'; import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action';
import { getMicrosoftApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes'; import { getMicrosoftApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; 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 { 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 { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter'; import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter';
@ -51,7 +51,7 @@ export class MicrosoftAPIsService {
private readonly workspaceEventEmitter: WorkspaceEventEmitter, private readonly workspaceEventEmitter: WorkspaceEventEmitter,
@InjectRepository(ObjectMetadataEntity, 'metadata') @InjectRepository(ObjectMetadataEntity, 'metadata')
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>, private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
async refreshMicrosoftRefreshToken(input: { async refreshMicrosoftRefreshToken(input: {
@ -200,7 +200,7 @@ export class MicrosoftAPIsService {
}); });
if ( if (
this.environmentService.get('CALENDAR_PROVIDER_MICROSOFT_ENABLED') this.twentyConfigService.get('CALENDAR_PROVIDER_MICROSOFT_ENABLED')
) { ) {
const newCalendarChannel = await calendarChannelRepository.save( const newCalendarChannel = await calendarChannelRepository.save(
{ {
@ -328,7 +328,7 @@ export class MicrosoftAPIsService {
} }
}); });
if (this.environmentService.get('MESSAGING_PROVIDER_MICROSOFT_ENABLED')) { if (this.twentyConfigService.get('MESSAGING_PROVIDER_MICROSOFT_ENABLED')) {
const messageChannels = await messageChannelRepository.find({ const messageChannels = await messageChannelRepository.find({
where: { where: {
connectedAccountId: newOrExistingConnectedAccountId, connectedAccountId: newOrExistingConnectedAccountId,
@ -346,7 +346,7 @@ export class MicrosoftAPIsService {
} }
} }
if (this.environmentService.get('CALENDAR_PROVIDER_MICROSOFT_ENABLED')) { if (this.twentyConfigService.get('CALENDAR_PROVIDER_MICROSOFT_ENABLED')) {
const calendarChannels = await calendarChannelRepository.find({ const calendarChannels = await calendarChannelRepository.find({
where: { where: {
connectedAccountId: newOrExistingConnectedAccountId, connectedAccountId: newOrExistingConnectedAccountId,

View File

@ -11,7 +11,7 @@ import {
import { AuthException } from 'src/engine/core-modules/auth/auth.exception'; import { AuthException } from 'src/engine/core-modules/auth/auth.exception';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EmailService } from 'src/engine/core-modules/email/email.service'; import { EmailService } from 'src/engine/core-modules/email/email.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
@ -23,7 +23,7 @@ describe('ResetPasswordService', () => {
let workspaceRepository: Repository<Workspace>; let workspaceRepository: Repository<Workspace>;
let appTokenRepository: Repository<AppToken>; let appTokenRepository: Repository<AppToken>;
let emailService: EmailService; let emailService: EmailService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
let domainManagerService: DomainManagerService; let domainManagerService: DomainManagerService;
beforeEach(async () => { beforeEach(async () => {
@ -62,7 +62,7 @@ describe('ResetPasswordService', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -81,7 +81,7 @@ describe('ResetPasswordService', () => {
getRepositoryToken(AppToken, 'core'), getRepositoryToken(AppToken, 'core'),
); );
emailService = module.get<EmailService>(EmailService); emailService = module.get<EmailService>(EmailService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
domainManagerService = domainManagerService =
module.get<DomainManagerService>(DomainManagerService); module.get<DomainManagerService>(DomainManagerService);
}); });
@ -99,7 +99,7 @@ describe('ResetPasswordService', () => {
.mockResolvedValue(mockUser as User); .mockResolvedValue(mockUser as User);
jest.spyOn(appTokenRepository, 'findOne').mockResolvedValue(null); jest.spyOn(appTokenRepository, 'findOne').mockResolvedValue(null);
jest.spyOn(appTokenRepository, 'save').mockResolvedValue({} as AppToken); jest.spyOn(appTokenRepository, 'save').mockResolvedValue({} as AppToken);
jest.spyOn(environmentService, 'get').mockReturnValue('1h'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('1h');
const result = await service.generatePasswordResetToken( const result = await service.generatePasswordResetToken(
'test@example.com', 'test@example.com',
@ -165,7 +165,7 @@ describe('ResetPasswordService', () => {
.spyOn(workspaceRepository, 'findOneBy') .spyOn(workspaceRepository, 'findOneBy')
.mockResolvedValue({ id: 'workspace-id' } as Workspace); .mockResolvedValue({ id: 'workspace-id' } as Workspace);
jest jest
.spyOn(environmentService, 'get') .spyOn(twentyConfigService, 'get')
.mockReturnValue('http://localhost:3000'); .mockReturnValue('http://localhost:3000');
jest jest
.spyOn(domainManagerService, 'buildWorkspaceURL') .spyOn(domainManagerService, 'buildWorkspaceURL')

View File

@ -26,7 +26,7 @@ import { PasswordResetToken } from 'src/engine/core-modules/auth/dto/token.entit
import { ValidatePasswordResetToken } from 'src/engine/core-modules/auth/dto/validate-password-reset-token.entity'; import { ValidatePasswordResetToken } from 'src/engine/core-modules/auth/dto/validate-password-reset-token.entity';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EmailService } from 'src/engine/core-modules/email/email.service'; import { EmailService } from 'src/engine/core-modules/email/email.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate'; import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
@ -34,7 +34,7 @@ import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.
@Injectable() @Injectable()
export class ResetPasswordService { export class ResetPasswordService {
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly domainManagerService: DomainManagerService, private readonly domainManagerService: DomainManagerService,
@InjectRepository(User, 'core') @InjectRepository(User, 'core')
private readonly userRepository: Repository<User>, private readonly userRepository: Repository<User>,
@ -60,7 +60,7 @@ export class ResetPasswordService {
); );
} }
const expiresIn = this.environmentService.get( const expiresIn = this.twentyConfigService.get(
'PASSWORD_RESET_TOKEN_EXPIRES_IN', 'PASSWORD_RESET_TOKEN_EXPIRES_IN',
); );
@ -164,9 +164,9 @@ export class ResetPasswordService {
i18n.activate(locale); i18n.activate(locale);
this.emailService.send({ this.emailService.send({
from: `${this.environmentService.get( from: `${this.twentyConfigService.get(
'EMAIL_FROM_NAME', 'EMAIL_FROM_NAME',
)} <${this.environmentService.get('EMAIL_FROM_ADDRESS')}>`, )} <${this.twentyConfigService.get('EMAIL_FROM_ADDRESS')}>`,
to: email, to: email,
subject: t`Action Needed to Reset Password`, subject: t`Action Needed to Reset Password`,
text, text,

View File

@ -2,8 +2,8 @@ import { HttpService } from '@nestjs/axios';
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { getRepositoryToken } from '@nestjs/typeorm'; import { getRepositoryToken } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; import { WorkspaceActivationStatus } from 'twenty-shared/workspace';
import { Repository } from 'typeorm';
import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity';
import { import {
@ -17,10 +17,10 @@ import {
SignInUpBaseParams, SignInUpBaseParams,
} from 'src/engine/core-modules/auth/types/signInUp.type'; } from 'src/engine/core-modules/auth/types/signInUp.type';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.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 { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.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 { UserService } from 'src/engine/core-modules/user/services/user.service';
@ -42,7 +42,7 @@ describe('SignInUpService', () => {
let fileUploadService: FileUploadService; let fileUploadService: FileUploadService;
let workspaceInvitationService: WorkspaceInvitationService; let workspaceInvitationService: WorkspaceInvitationService;
let userWorkspaceService: UserWorkspaceService; let userWorkspaceService: UserWorkspaceService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
let domainManagerService: DomainManagerService; let domainManagerService: DomainManagerService;
beforeEach(async () => { beforeEach(async () => {
@ -98,7 +98,7 @@ describe('SignInUpService', () => {
useValue: {}, useValue: {},
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -143,7 +143,7 @@ describe('SignInUpService', () => {
); );
userWorkspaceService = userWorkspaceService =
module.get<UserWorkspaceService>(UserWorkspaceService); module.get<UserWorkspaceService>(UserWorkspaceService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
domainManagerService = domainManagerService =
module.get<DomainManagerService>(DomainManagerService); module.get<DomainManagerService>(DomainManagerService);
}); });
@ -242,7 +242,7 @@ describe('SignInUpService', () => {
}, },
}; };
jest.spyOn(environmentService, 'get').mockReturnValue(false); jest.spyOn(twentyConfigService, 'get').mockReturnValue(false);
jest.spyOn(WorkspaceRepository, 'count').mockResolvedValue(0); jest.spyOn(WorkspaceRepository, 'count').mockResolvedValue(0);
jest.spyOn(WorkspaceRepository, 'create').mockReturnValue({} as Workspace); jest.spyOn(WorkspaceRepository, 'create').mockReturnValue({} as Workspace);
jest.spyOn(WorkspaceRepository, 'save').mockResolvedValue({ jest.spyOn(WorkspaceRepository, 'save').mockResolvedValue({
@ -292,7 +292,7 @@ describe('SignInUpService', () => {
}, },
}; };
jest.spyOn(environmentService, 'get').mockReturnValue(false); jest.spyOn(twentyConfigService, 'get').mockReturnValue(false);
jest jest
.spyOn(userWorkspaceService, 'addUserToWorkspaceIfUserNotInWorkspace') .spyOn(userWorkspaceService, 'addUserToWorkspaceIfUserNotInWorkspace')
.mockResolvedValue(undefined); .mockResolvedValue(undefined);
@ -324,7 +324,7 @@ describe('SignInUpService', () => {
}, },
}; };
jest.spyOn(environmentService, 'get').mockReturnValue(false); jest.spyOn(twentyConfigService, 'get').mockReturnValue(false);
jest jest
.spyOn(userWorkspaceService, 'checkUserWorkspaceExists') .spyOn(userWorkspaceService, 'checkUserWorkspaceExists')
.mockResolvedValue(null); .mockResolvedValue(null);
@ -349,7 +349,7 @@ describe('SignInUpService', () => {
}, },
}; };
jest.spyOn(environmentService, 'get').mockReturnValue(false); jest.spyOn(twentyConfigService, 'get').mockReturnValue(false);
jest.spyOn(WorkspaceRepository, 'count').mockResolvedValue(0); jest.spyOn(WorkspaceRepository, 'count').mockResolvedValue(0);
jest.spyOn(WorkspaceRepository, 'create').mockReturnValue({} as Workspace); jest.spyOn(WorkspaceRepository, 'create').mockReturnValue({} as Workspace);
jest.spyOn(WorkspaceRepository, 'save').mockResolvedValue({ jest.spyOn(WorkspaceRepository, 'save').mockResolvedValue({

View File

@ -3,10 +3,10 @@ import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import FileType from 'file-type'; import FileType from 'file-type';
import { Repository } from 'typeorm';
import { v4 } from 'uuid';
import { TWENTY_ICONS_BASE_URL } from 'twenty-shared/constants'; import { TWENTY_ICONS_BASE_URL } from 'twenty-shared/constants';
import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; import { WorkspaceActivationStatus } from 'twenty-shared/workspace';
import { Repository } from 'typeorm';
import { v4 } from 'uuid';
import { FileFolder } from 'src/engine/core-modules/file/interfaces/file-folder.interface'; import { FileFolder } from 'src/engine/core-modules/file/interfaces/file-folder.interface';
@ -28,10 +28,10 @@ import {
SignInUpNewUserPayload, SignInUpNewUserPayload,
} from 'src/engine/core-modules/auth/types/signInUp.type'; } from 'src/engine/core-modules/auth/types/signInUp.type';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.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 { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.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 { UserService } from 'src/engine/core-modules/user/services/user.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
@ -55,7 +55,7 @@ export class SignInUpService {
private readonly userWorkspaceService: UserWorkspaceService, private readonly userWorkspaceService: UserWorkspaceService,
private readonly onboardingService: OnboardingService, private readonly onboardingService: OnboardingService,
private readonly httpService: HttpService, private readonly httpService: HttpService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly domainManagerService: DomainManagerService, private readonly domainManagerService: DomainManagerService,
private readonly userService: UserService, private readonly userService: UserService,
private readonly userRoleService: UserRoleService, private readonly userRoleService: UserRoleService,
@ -324,7 +324,7 @@ export class SignInUpService {
); );
} }
if (!this.environmentService.get('IS_MULTIWORKSPACE_ENABLED')) { if (!this.twentyConfigService.get('IS_MULTIWORKSPACE_ENABLED')) {
const workspacesCount = await this.workspaceRepository.count(); const workspacesCount = await this.workspaceRepository.count();
// if the workspace doesn't exist it means it's the first user of the workspace // if the workspace doesn't exist it means it's the first user of the workspace

View File

@ -3,8 +3,8 @@ import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-google-oauth20'; import { Strategy } from 'passport-google-oauth20';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { getGoogleApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes'; import { getGoogleApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
export type GoogleAPIScopeConfig = { export type GoogleAPIScopeConfig = {
isCalendarEnabled?: boolean; isCalendarEnabled?: boolean;
@ -16,13 +16,13 @@ export class GoogleAPIsOauthCommonStrategy extends PassportStrategy(
Strategy, Strategy,
'google-apis', 'google-apis',
) { ) {
constructor(environmentService: EnvironmentService) { constructor(twentyConfigService: TwentyConfigService) {
const scopes = getGoogleApisOauthScopes(); const scopes = getGoogleApisOauthScopes();
super({ super({
clientID: environmentService.get('AUTH_GOOGLE_CLIENT_ID'), clientID: twentyConfigService.get('AUTH_GOOGLE_CLIENT_ID'),
clientSecret: environmentService.get('AUTH_GOOGLE_CLIENT_SECRET'), clientSecret: twentyConfigService.get('AUTH_GOOGLE_CLIENT_SECRET'),
callbackURL: environmentService.get('AUTH_GOOGLE_APIS_CALLBACK_URL'), callbackURL: twentyConfigService.get('AUTH_GOOGLE_APIS_CALLBACK_URL'),
scope: scopes, scope: scopes,
passReqToCallback: true, passReqToCallback: true,
}); });

View File

@ -4,7 +4,7 @@ import { VerifyCallback } from 'passport-google-oauth20';
import { GoogleAPIsOauthCommonStrategy } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-common.auth.strategy'; import { GoogleAPIsOauthCommonStrategy } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-common.auth.strategy';
import { GoogleAPIsRequest } from 'src/engine/core-modules/auth/types/google-api-request.type'; import { GoogleAPIsRequest } from 'src/engine/core-modules/auth/types/google-api-request.type';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
export type GoogleAPIScopeConfig = { export type GoogleAPIScopeConfig = {
isCalendarEnabled?: boolean; isCalendarEnabled?: boolean;
@ -12,8 +12,8 @@ export type GoogleAPIScopeConfig = {
@Injectable() @Injectable()
export class GoogleAPIsOauthExchangeCodeForTokenStrategy extends GoogleAPIsOauthCommonStrategy { export class GoogleAPIsOauthExchangeCodeForTokenStrategy extends GoogleAPIsOauthCommonStrategy {
constructor(environmentService: EnvironmentService) { constructor(twentyConfigService: TwentyConfigService) {
super(environmentService); super(twentyConfigService);
} }
async validate( async validate(

View File

@ -1,7 +1,7 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { GoogleAPIsOauthCommonStrategy } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-common.auth.strategy'; import { GoogleAPIsOauthCommonStrategy } from 'src/engine/core-modules/auth/strategies/google-apis-oauth-common.auth.strategy';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
export type GoogleAPIScopeConfig = { export type GoogleAPIScopeConfig = {
isCalendarEnabled?: boolean; isCalendarEnabled?: boolean;
@ -10,8 +10,8 @@ export type GoogleAPIScopeConfig = {
@Injectable() @Injectable()
export class GoogleAPIsOauthRequestCodeStrategy extends GoogleAPIsOauthCommonStrategy { export class GoogleAPIsOauthRequestCodeStrategy extends GoogleAPIsOauthCommonStrategy {
constructor(environmentService: EnvironmentService) { constructor(twentyConfigService: TwentyConfigService) {
super(environmentService); super(twentyConfigService);
} }
authenticate(req: any, options: any) { authenticate(req: any, options: any) {

View File

@ -5,7 +5,7 @@ import { Request } from 'express';
import { Strategy, VerifyCallback } from 'passport-google-oauth20'; import { Strategy, VerifyCallback } from 'passport-google-oauth20';
import { APP_LOCALES } from 'twenty-shared/translations'; import { APP_LOCALES } from 'twenty-shared/translations';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
export type GoogleRequest = Omit< export type GoogleRequest = Omit<
Request, Request,
@ -26,11 +26,11 @@ export type GoogleRequest = Omit<
@Injectable() @Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
constructor(environmentService: EnvironmentService) { constructor(twentyConfigService: TwentyConfigService) {
super({ super({
clientID: environmentService.get('AUTH_GOOGLE_CLIENT_ID'), clientID: twentyConfigService.get('AUTH_GOOGLE_CLIENT_ID'),
clientSecret: environmentService.get('AUTH_GOOGLE_CLIENT_SECRET'), clientSecret: twentyConfigService.get('AUTH_GOOGLE_CLIENT_SECRET'),
callbackURL: environmentService.get('AUTH_GOOGLE_CALLBACK_URL'), callbackURL: twentyConfigService.get('AUTH_GOOGLE_CALLBACK_URL'),
scope: ['email', 'profile'], scope: ['email', 'profile'],
passReqToCallback: true, passReqToCallback: true,
}); });

View File

@ -14,8 +14,8 @@ import {
AuthContext, AuthContext,
JwtPayload, JwtPayload,
} from 'src/engine/core-modules/auth/types/auth-context.type'; } from 'src/engine/core-modules/auth/types/auth-context.type';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
@ -25,7 +25,7 @@ import { ApiKeyWorkspaceEntity } from 'src/modules/api-key/standard-objects/api-
@Injectable() @Injectable()
export class JwtAuthStrategy extends PassportStrategy(Strategy, 'jwt') { export class JwtAuthStrategy extends PassportStrategy(Strategy, 'jwt') {
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly jwtWrapperService: JwtWrapperService, private readonly jwtWrapperService: JwtWrapperService,
private readonly typeORMService: TypeORMService, private readonly typeORMService: TypeORMService,
private readonly dataSourceService: DataSourceService, private readonly dataSourceService: DataSourceService,

View File

@ -4,7 +4,7 @@ import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-microsoft'; import { Strategy } from 'passport-microsoft';
import { getMicrosoftApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes'; import { getMicrosoftApisOauthScopes } from 'src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
export type MicrosoftAPIScopeConfig = { export type MicrosoftAPIScopeConfig = {
isCalendarEnabled?: boolean; isCalendarEnabled?: boolean;
@ -16,14 +16,14 @@ export class MicrosoftAPIsOauthCommonStrategy extends PassportStrategy(
Strategy, Strategy,
'microsoft-apis', 'microsoft-apis',
) { ) {
constructor(environmentService: EnvironmentService) { constructor(twentyConfigService: TwentyConfigService) {
const scopes = getMicrosoftApisOauthScopes(); const scopes = getMicrosoftApisOauthScopes();
super({ super({
clientID: environmentService.get('AUTH_MICROSOFT_CLIENT_ID'), clientID: twentyConfigService.get('AUTH_MICROSOFT_CLIENT_ID'),
clientSecret: environmentService.get('AUTH_MICROSOFT_CLIENT_SECRET'), clientSecret: twentyConfigService.get('AUTH_MICROSOFT_CLIENT_SECRET'),
tenant: 'common', tenant: 'common',
callbackURL: environmentService.get('AUTH_MICROSOFT_APIS_CALLBACK_URL'), callbackURL: twentyConfigService.get('AUTH_MICROSOFT_APIS_CALLBACK_URL'),
scope: scopes, scope: scopes,
passReqToCallback: true, passReqToCallback: true,
}); });

View File

@ -4,7 +4,7 @@ import { VerifyCallback } from 'passport-google-oauth20';
import { MicrosoftAPIsOauthCommonStrategy } from 'src/engine/core-modules/auth/strategies/microsoft-apis-oauth-common.auth.strategy'; import { MicrosoftAPIsOauthCommonStrategy } from 'src/engine/core-modules/auth/strategies/microsoft-apis-oauth-common.auth.strategy';
import { MicrosoftAPIsRequest } from 'src/engine/core-modules/auth/types/microsoft-api-request.type'; import { MicrosoftAPIsRequest } from 'src/engine/core-modules/auth/types/microsoft-api-request.type';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
export type MicrosoftAPIScopeConfig = { export type MicrosoftAPIScopeConfig = {
isCalendarEnabled?: boolean; isCalendarEnabled?: boolean;
@ -12,8 +12,8 @@ export type MicrosoftAPIScopeConfig = {
@Injectable() @Injectable()
export class MicrosoftAPIsOauthExchangeCodeForTokenStrategy extends MicrosoftAPIsOauthCommonStrategy { export class MicrosoftAPIsOauthExchangeCodeForTokenStrategy extends MicrosoftAPIsOauthCommonStrategy {
constructor(environmentService: EnvironmentService) { constructor(twentyConfigService: TwentyConfigService) {
super(environmentService); super(twentyConfigService);
} }
async validate( async validate(

View File

@ -1,12 +1,12 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { MicrosoftAPIsOauthCommonStrategy } from 'src/engine/core-modules/auth/strategies/microsoft-apis-oauth-common.auth.strategy'; import { MicrosoftAPIsOauthCommonStrategy } from 'src/engine/core-modules/auth/strategies/microsoft-apis-oauth-common.auth.strategy';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class MicrosoftAPIsOauthRequestCodeStrategy extends MicrosoftAPIsOauthCommonStrategy { export class MicrosoftAPIsOauthRequestCodeStrategy extends MicrosoftAPIsOauthCommonStrategy {
constructor(environmentService: EnvironmentService) { constructor(twentyConfigService: TwentyConfigService) {
super(environmentService); super(twentyConfigService);
} }
authenticate(req: any, options: any) { authenticate(req: any, options: any) {

View File

@ -9,7 +9,7 @@ import {
AuthException, AuthException,
AuthExceptionCode, AuthExceptionCode,
} from 'src/engine/core-modules/auth/auth.exception'; } from 'src/engine/core-modules/auth/auth.exception';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
export type MicrosoftRequest = Omit< export type MicrosoftRequest = Omit<
Request, Request,
@ -29,11 +29,11 @@ export type MicrosoftRequest = Omit<
}; };
export class MicrosoftStrategy extends PassportStrategy(Strategy, 'microsoft') { export class MicrosoftStrategy extends PassportStrategy(Strategy, 'microsoft') {
constructor(environmentService: EnvironmentService) { constructor(twentyConfigService: TwentyConfigService) {
super({ super({
clientID: environmentService.get('AUTH_MICROSOFT_CLIENT_ID'), clientID: twentyConfigService.get('AUTH_MICROSOFT_CLIENT_ID'),
clientSecret: environmentService.get('AUTH_MICROSOFT_CLIENT_SECRET'), clientSecret: twentyConfigService.get('AUTH_MICROSOFT_CLIENT_SECRET'),
callbackURL: environmentService.get('AUTH_MICROSOFT_CALLBACK_URL'), callbackURL: twentyConfigService.get('AUTH_MICROSOFT_CALLBACK_URL'),
tenant: 'common', tenant: 'common',
scope: ['user.read'], scope: ['user.read'],
passReqToCallback: true, passReqToCallback: true,

View File

@ -2,16 +2,16 @@ import { Test, TestingModule } from '@nestjs/testing';
import { getRepositoryToken } from '@nestjs/typeorm'; import { getRepositoryToken } from '@nestjs/typeorm';
import { Request } from 'express'; import { Request } from 'express';
import { Repository } from 'typeorm';
import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; import { WorkspaceActivationStatus } from 'twenty-shared/workspace';
import { Repository } from 'typeorm';
import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity';
import { AuthException } from 'src/engine/core-modules/auth/auth.exception'; import { AuthException } from 'src/engine/core-modules/auth/auth.exception';
import { JwtAuthStrategy } from 'src/engine/core-modules/auth/strategies/jwt.auth.strategy'; import { JwtAuthStrategy } from 'src/engine/core-modules/auth/strategies/jwt.auth.strategy';
import { EmailService } from 'src/engine/core-modules/email/email.service'; import { EmailService } from 'src/engine/core-modules/email/email.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { SSOService } from 'src/engine/core-modules/sso/services/sso.service'; import { SSOService } from 'src/engine/core-modules/sso/services/sso.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
@ -22,7 +22,7 @@ import { AccessTokenService } from './access-token.service';
describe('AccessTokenService', () => { describe('AccessTokenService', () => {
let service: AccessTokenService; let service: AccessTokenService;
let jwtWrapperService: JwtWrapperService; let jwtWrapperService: JwtWrapperService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
let userRepository: Repository<User>; let userRepository: Repository<User>;
let workspaceRepository: Repository<Workspace>; let workspaceRepository: Repository<Workspace>;
let twentyORMGlobalManager: TwentyORMGlobalManager; let twentyORMGlobalManager: TwentyORMGlobalManager;
@ -49,7 +49,7 @@ describe('AccessTokenService', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -89,7 +89,7 @@ describe('AccessTokenService', () => {
service = module.get<AccessTokenService>(AccessTokenService); service = module.get<AccessTokenService>(AccessTokenService);
jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService); jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
userRepository = module.get<Repository<User>>( userRepository = module.get<Repository<User>>(
getRepositoryToken(User, 'core'), getRepositoryToken(User, 'core'),
); );
@ -123,7 +123,7 @@ describe('AccessTokenService', () => {
const mockWorkspaceMember = { id: 'workspace-member-id' }; const mockWorkspaceMember = { id: 'workspace-member-id' };
const mockToken = 'mock-token'; const mockToken = 'mock-token';
jest.spyOn(environmentService, 'get').mockReturnValue('1h'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('1h');
jest.spyOn(userRepository, 'findOne').mockResolvedValue(mockUser as User); jest.spyOn(userRepository, 'findOne').mockResolvedValue(mockUser as User);
jest jest
.spyOn(workspaceRepository, 'findOne') .spyOn(workspaceRepository, 'findOne')
@ -155,7 +155,7 @@ describe('AccessTokenService', () => {
}); });
it('should throw an error if user is not found', async () => { it('should throw an error if user is not found', async () => {
jest.spyOn(environmentService, 'get').mockReturnValue('1h'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('1h');
jest.spyOn(userRepository, 'findOne').mockResolvedValue(null); jest.spyOn(userRepository, 'findOne').mockResolvedValue(null);
await expect( await expect(

View File

@ -4,8 +4,8 @@ import { InjectRepository } from '@nestjs/typeorm';
import { addMilliseconds } from 'date-fns'; import { addMilliseconds } from 'date-fns';
import { Request } from 'express'; import { Request } from 'express';
import ms from 'ms'; import ms from 'ms';
import { Repository } from 'typeorm';
import { isWorkspaceActiveOrSuspended } from 'twenty-shared/workspace'; import { isWorkspaceActiveOrSuspended } from 'twenty-shared/workspace';
import { Repository } from 'typeorm';
import { import {
AuthException, AuthException,
@ -17,8 +17,8 @@ import {
AuthContext, AuthContext,
JwtPayload, JwtPayload,
} from 'src/engine/core-modules/auth/types/auth-context.type'; } from 'src/engine/core-modules/auth/types/auth-context.type';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
import { userValidator } from 'src/engine/core-modules/user/user.validate'; import { userValidator } from 'src/engine/core-modules/user/user.validate';
@ -32,7 +32,7 @@ export class AccessTokenService {
constructor( constructor(
private readonly jwtWrapperService: JwtWrapperService, private readonly jwtWrapperService: JwtWrapperService,
private readonly jwtStrategy: JwtAuthStrategy, private readonly jwtStrategy: JwtAuthStrategy,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
@InjectRepository(User, 'core') @InjectRepository(User, 'core')
private readonly userRepository: Repository<User>, private readonly userRepository: Repository<User>,
@InjectRepository(Workspace, 'core') @InjectRepository(Workspace, 'core')
@ -46,7 +46,7 @@ export class AccessTokenService {
userId: string, userId: string,
workspaceId: string, workspaceId: string,
): Promise<AuthToken> { ): Promise<AuthToken> {
const expiresIn = this.environmentService.get('ACCESS_TOKEN_EXPIRES_IN'); const expiresIn = this.twentyConfigService.get('ACCESS_TOKEN_EXPIRES_IN');
const expiresAt = addMilliseconds(new Date().getTime(), ms(expiresIn)); const expiresAt = addMilliseconds(new Date().getTime(), ms(expiresIn));

View File

@ -13,14 +13,14 @@ import {
EmailVerificationException, EmailVerificationException,
EmailVerificationExceptionCode, EmailVerificationExceptionCode,
} from 'src/engine/core-modules/email-verification/email-verification.exception'; } from 'src/engine/core-modules/email-verification/email-verification.exception';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { EmailVerificationTokenService } from './email-verification-token.service'; import { EmailVerificationTokenService } from './email-verification-token.service';
describe('EmailVerificationTokenService', () => { describe('EmailVerificationTokenService', () => {
let service: EmailVerificationTokenService; let service: EmailVerificationTokenService;
let appTokenRepository: Repository<AppToken>; let appTokenRepository: Repository<AppToken>;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
beforeEach(async () => { beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({ const module: TestingModule = await Test.createTestingModule({
@ -31,7 +31,7 @@ describe('EmailVerificationTokenService', () => {
useClass: Repository, useClass: Repository,
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -45,7 +45,7 @@ describe('EmailVerificationTokenService', () => {
appTokenRepository = module.get<Repository<AppToken>>( appTokenRepository = module.get<Repository<AppToken>>(
getRepositoryToken(AppToken, 'core'), getRepositoryToken(AppToken, 'core'),
); );
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
}); });
describe('generateToken', () => { describe('generateToken', () => {
@ -54,7 +54,7 @@ describe('EmailVerificationTokenService', () => {
const email = 'test@example.com'; const email = 'test@example.com';
const mockExpiresIn = '24h'; const mockExpiresIn = '24h';
jest.spyOn(environmentService, 'get').mockReturnValue(mockExpiresIn); jest.spyOn(twentyConfigService, 'get').mockReturnValue(mockExpiresIn);
jest.spyOn(appTokenRepository, 'create').mockReturnValue({} as AppToken); jest.spyOn(appTokenRepository, 'create').mockReturnValue({} as AppToken);
jest.spyOn(appTokenRepository, 'save').mockResolvedValue({} as AppToken); jest.spyOn(appTokenRepository, 'save').mockResolvedValue({} as AppToken);

View File

@ -16,18 +16,18 @@ import {
EmailVerificationException, EmailVerificationException,
EmailVerificationExceptionCode, EmailVerificationExceptionCode,
} from 'src/engine/core-modules/email-verification/email-verification.exception'; } from 'src/engine/core-modules/email-verification/email-verification.exception';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class EmailVerificationTokenService { export class EmailVerificationTokenService {
constructor( constructor(
@InjectRepository(AppToken, 'core') @InjectRepository(AppToken, 'core')
private readonly appTokenRepository: Repository<AppToken>, private readonly appTokenRepository: Repository<AppToken>,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
async generateToken(userId: string, email: string): Promise<AuthToken> { async generateToken(userId: string, email: string): Promise<AuthToken> {
const expiresIn = this.environmentService.get( const expiresIn = this.twentyConfigService.get(
'EMAIL_VERIFICATION_TOKEN_EXPIRES_IN', 'EMAIL_VERIFICATION_TOKEN_EXPIRES_IN',
); );
const expiresAt = addMilliseconds(new Date().getTime(), ms(expiresIn)); const expiresAt = addMilliseconds(new Date().getTime(), ms(expiresIn));

View File

@ -1,14 +1,14 @@
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { LoginTokenService } from './login-token.service'; import { LoginTokenService } from './login-token.service';
describe('LoginTokenService', () => { describe('LoginTokenService', () => {
let service: LoginTokenService; let service: LoginTokenService;
let jwtWrapperService: JwtWrapperService; let jwtWrapperService: JwtWrapperService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
beforeEach(async () => { beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({ const module: TestingModule = await Test.createTestingModule({
@ -24,7 +24,7 @@ describe('LoginTokenService', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -34,7 +34,7 @@ describe('LoginTokenService', () => {
service = module.get<LoginTokenService>(LoginTokenService); service = module.get<LoginTokenService>(LoginTokenService);
jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService); jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
}); });
it('should be defined', () => { it('should be defined', () => {
@ -52,7 +52,7 @@ describe('LoginTokenService', () => {
jest jest
.spyOn(jwtWrapperService, 'generateAppSecret') .spyOn(jwtWrapperService, 'generateAppSecret')
.mockReturnValue(mockSecret); .mockReturnValue(mockSecret);
jest.spyOn(environmentService, 'get').mockReturnValue(mockExpiresIn); jest.spyOn(twentyConfigService, 'get').mockReturnValue(mockExpiresIn);
jest.spyOn(jwtWrapperService, 'sign').mockReturnValue(mockToken); jest.spyOn(jwtWrapperService, 'sign').mockReturnValue(mockToken);
const result = await service.generateLoginToken(email, workspaceId); const result = await service.generateLoginToken(email, workspaceId);
@ -65,7 +65,7 @@ describe('LoginTokenService', () => {
'LOGIN', 'LOGIN',
workspaceId, workspaceId,
); );
expect(environmentService.get).toHaveBeenCalledWith( expect(twentyConfigService.get).toHaveBeenCalledWith(
'LOGIN_TOKEN_EXPIRES_IN', 'LOGIN_TOKEN_EXPIRES_IN',
); );
expect(jwtWrapperService.sign).toHaveBeenCalledWith( expect(jwtWrapperService.sign).toHaveBeenCalledWith(

View File

@ -4,14 +4,14 @@ import { addMilliseconds } from 'date-fns';
import ms from 'ms'; import ms from 'ms';
import { AuthToken } from 'src/engine/core-modules/auth/dto/token.entity'; import { AuthToken } from 'src/engine/core-modules/auth/dto/token.entity';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class LoginTokenService { export class LoginTokenService {
constructor( constructor(
private readonly jwtWrapperService: JwtWrapperService, private readonly jwtWrapperService: JwtWrapperService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
async generateLoginToken( async generateLoginToken(
@ -23,7 +23,7 @@ export class LoginTokenService {
workspaceId, workspaceId,
); );
const expiresIn = this.environmentService.get('LOGIN_TOKEN_EXPIRES_IN'); const expiresIn = this.twentyConfigService.get('LOGIN_TOKEN_EXPIRES_IN');
const expiresAt = addMilliseconds(new Date().getTime(), ms(expiresIn)); const expiresAt = addMilliseconds(new Date().getTime(), ms(expiresIn));
const jwtPayload = { const jwtPayload = {

View File

@ -5,8 +5,8 @@ import { Repository } from 'typeorm';
import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity';
import { AuthException } from 'src/engine/core-modules/auth/auth.exception'; import { AuthException } from 'src/engine/core-modules/auth/auth.exception';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
import { RefreshTokenService } from './refresh-token.service'; import { RefreshTokenService } from './refresh-token.service';
@ -14,7 +14,7 @@ import { RefreshTokenService } from './refresh-token.service';
describe('RefreshTokenService', () => { describe('RefreshTokenService', () => {
let service: RefreshTokenService; let service: RefreshTokenService;
let jwtWrapperService: JwtWrapperService; let jwtWrapperService: JwtWrapperService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
let appTokenRepository: Repository<AppToken>; let appTokenRepository: Repository<AppToken>;
let userRepository: Repository<User>; let userRepository: Repository<User>;
@ -32,7 +32,7 @@ describe('RefreshTokenService', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -50,7 +50,7 @@ describe('RefreshTokenService', () => {
service = module.get<RefreshTokenService>(RefreshTokenService); service = module.get<RefreshTokenService>(RefreshTokenService);
jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService); jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
appTokenRepository = module.get<Repository<AppToken>>( appTokenRepository = module.get<Repository<AppToken>>(
getRepositoryToken(AppToken, 'core'), getRepositoryToken(AppToken, 'core'),
); );
@ -91,7 +91,7 @@ describe('RefreshTokenService', () => {
.spyOn(appTokenRepository, 'findOneBy') .spyOn(appTokenRepository, 'findOneBy')
.mockResolvedValue(mockAppToken as AppToken); .mockResolvedValue(mockAppToken as AppToken);
jest.spyOn(userRepository, 'findOne').mockResolvedValue(mockUser as User); jest.spyOn(userRepository, 'findOne').mockResolvedValue(mockUser as User);
jest.spyOn(environmentService, 'get').mockReturnValue('1h'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('1h');
const result = await service.verifyRefreshToken(mockToken); const result = await service.verifyRefreshToken(mockToken);
@ -123,7 +123,7 @@ describe('RefreshTokenService', () => {
const mockToken = 'mock-refresh-token'; const mockToken = 'mock-refresh-token';
const mockExpiresIn = '7d'; const mockExpiresIn = '7d';
jest.spyOn(environmentService, 'get').mockReturnValue(mockExpiresIn); jest.spyOn(twentyConfigService, 'get').mockReturnValue(mockExpiresIn);
jest jest
.spyOn(jwtWrapperService, 'generateAppSecret') .spyOn(jwtWrapperService, 'generateAppSecret')
.mockReturnValue('mock-secret'); .mockReturnValue('mock-secret');
@ -153,7 +153,7 @@ describe('RefreshTokenService', () => {
}); });
it('should throw an error if expiration time is not set', async () => { it('should throw an error if expiration time is not set', async () => {
jest.spyOn(environmentService, 'get').mockReturnValue(undefined); jest.spyOn(twentyConfigService, 'get').mockReturnValue(undefined);
await expect( await expect(
service.generateRefreshToken('user-id', 'workspace-id'), service.generateRefreshToken('user-id', 'workspace-id'),

View File

@ -14,15 +14,15 @@ import {
AuthExceptionCode, AuthExceptionCode,
} from 'src/engine/core-modules/auth/auth.exception'; } from 'src/engine/core-modules/auth/auth.exception';
import { AuthToken } from 'src/engine/core-modules/auth/dto/token.entity'; import { AuthToken } from 'src/engine/core-modules/auth/dto/token.entity';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
@Injectable() @Injectable()
export class RefreshTokenService { export class RefreshTokenService {
constructor( constructor(
private readonly jwtWrapperService: JwtWrapperService, private readonly jwtWrapperService: JwtWrapperService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
@InjectRepository(AppToken, 'core') @InjectRepository(AppToken, 'core')
private readonly appTokenRepository: Repository<AppToken>, private readonly appTokenRepository: Repository<AppToken>,
@InjectRepository(User, 'core') @InjectRepository(User, 'core')
@ -30,7 +30,7 @@ export class RefreshTokenService {
) {} ) {}
async verifyRefreshToken(refreshToken: string) { async verifyRefreshToken(refreshToken: string) {
const coolDown = this.environmentService.get('REFRESH_TOKEN_COOL_DOWN'); const coolDown = this.twentyConfigService.get('REFRESH_TOKEN_COOL_DOWN');
await this.jwtWrapperService.verifyWorkspaceToken(refreshToken, 'REFRESH'); await this.jwtWrapperService.verifyWorkspaceToken(refreshToken, 'REFRESH');
const jwtPayload = await this.jwtWrapperService.decode(refreshToken); const jwtPayload = await this.jwtWrapperService.decode(refreshToken);
@ -109,7 +109,7 @@ export class RefreshTokenService {
'REFRESH', 'REFRESH',
workspaceId, workspaceId,
); );
const expiresIn = this.environmentService.get('REFRESH_TOKEN_EXPIRES_IN'); const expiresIn = this.twentyConfigService.get('REFRESH_TOKEN_EXPIRES_IN');
if (!expiresIn) { if (!expiresIn) {
throw new AuthException( throw new AuthException(

View File

@ -1,14 +1,14 @@
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { TransientTokenService } from './transient-token.service'; import { TransientTokenService } from './transient-token.service';
describe('TransientTokenService', () => { describe('TransientTokenService', () => {
let service: TransientTokenService; let service: TransientTokenService;
let jwtWrapperService: JwtWrapperService; let jwtWrapperService: JwtWrapperService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
beforeEach(async () => { beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({ const module: TestingModule = await Test.createTestingModule({
@ -24,7 +24,7 @@ describe('TransientTokenService', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -34,7 +34,7 @@ describe('TransientTokenService', () => {
service = module.get<TransientTokenService>(TransientTokenService); service = module.get<TransientTokenService>(TransientTokenService);
jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService); jwtWrapperService = module.get<JwtWrapperService>(JwtWrapperService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
}); });
it('should be defined', () => { it('should be defined', () => {
@ -49,7 +49,7 @@ describe('TransientTokenService', () => {
const mockExpiresIn = '15m'; const mockExpiresIn = '15m';
const mockToken = 'mock-token'; const mockToken = 'mock-token';
jest.spyOn(environmentService, 'get').mockImplementation((key) => { jest.spyOn(twentyConfigService, 'get').mockImplementation((key) => {
if (key === 'SHORT_TERM_TOKEN_EXPIRES_IN') return mockExpiresIn; if (key === 'SHORT_TERM_TOKEN_EXPIRES_IN') return mockExpiresIn;
return undefined; return undefined;
@ -66,7 +66,7 @@ describe('TransientTokenService', () => {
token: mockToken, token: mockToken,
expiresAt: expect.any(Date), expiresAt: expect.any(Date),
}); });
expect(environmentService.get).toHaveBeenCalledWith( expect(twentyConfigService.get).toHaveBeenCalledWith(
'SHORT_TERM_TOKEN_EXPIRES_IN', 'SHORT_TERM_TOKEN_EXPIRES_IN',
); );
expect(jwtWrapperService.sign).toHaveBeenCalledWith( expect(jwtWrapperService.sign).toHaveBeenCalledWith(

View File

@ -4,14 +4,14 @@ import { addMilliseconds } from 'date-fns';
import ms from 'ms'; import ms from 'ms';
import { AuthToken } from 'src/engine/core-modules/auth/dto/token.entity'; import { AuthToken } from 'src/engine/core-modules/auth/dto/token.entity';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service'; import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class TransientTokenService { export class TransientTokenService {
constructor( constructor(
private readonly jwtWrapperService: JwtWrapperService, private readonly jwtWrapperService: JwtWrapperService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
async generateTransientToken( async generateTransientToken(
@ -23,7 +23,7 @@ export class TransientTokenService {
'LOGIN', 'LOGIN',
workspaceId, workspaceId,
); );
const expiresIn = this.environmentService.get( const expiresIn = this.twentyConfigService.get(
'SHORT_TERM_TOKEN_EXPIRES_IN', 'SHORT_TERM_TOKEN_EXPIRES_IN',
); );

View File

@ -6,21 +6,21 @@ import { OnCustomBatchEvent } from 'src/engine/api/graphql/graphql-query-runner/
import { BILLING_FEATURE_USED } from 'src/engine/core-modules/billing/constants/billing-feature-used.constant'; import { BILLING_FEATURE_USED } from 'src/engine/core-modules/billing/constants/billing-feature-used.constant';
import { BillingUsageService } from 'src/engine/core-modules/billing/services/billing-usage.service'; import { BillingUsageService } from 'src/engine/core-modules/billing/services/billing-usage.service';
import { BillingUsageEvent } from 'src/engine/core-modules/billing/types/billing-usage-event.type'; import { BillingUsageEvent } from 'src/engine/core-modules/billing/types/billing-usage-event.type';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type';
@Injectable() @Injectable()
export class BillingFeatureUsedListener { export class BillingFeatureUsedListener {
constructor( constructor(
private readonly billingUsageService: BillingUsageService, private readonly billingUsageService: BillingUsageService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
@OnCustomBatchEvent(BILLING_FEATURE_USED) @OnCustomBatchEvent(BILLING_FEATURE_USED)
async handleBillingFeatureUsedEvent( async handleBillingFeatureUsedEvent(
payload: WorkspaceEventBatch<BillingUsageEvent>, payload: WorkspaceEventBatch<BillingUsageEvent>,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }

View File

@ -8,11 +8,11 @@ import {
UpdateSubscriptionQuantityJob, UpdateSubscriptionQuantityJob,
UpdateSubscriptionQuantityJobData, UpdateSubscriptionQuantityJobData,
} from 'src/engine/core-modules/billing/jobs/update-subscription-quantity.job'; } from 'src/engine/core-modules/billing/jobs/update-subscription-quantity.job';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event'; import { ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event';
import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator'; 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 { 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 { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event.type';
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
@ -21,7 +21,7 @@ export class BillingWorkspaceMemberListener {
constructor( constructor(
@InjectMessageQueue(MessageQueue.billingQueue) @InjectMessageQueue(MessageQueue.billingQueue)
private readonly messageQueueService: MessageQueueService, private readonly messageQueueService: MessageQueueService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
@OnDatabaseBatchEvent('workspaceMember', DatabaseEventAction.CREATED) @OnDatabaseBatchEvent('workspaceMember', DatabaseEventAction.CREATED)
@ -31,7 +31,7 @@ export class BillingWorkspaceMemberListener {
ObjectRecordCreateEvent<WorkspaceMemberWorkspaceEntity> ObjectRecordCreateEvent<WorkspaceMemberWorkspaceEntity>
>, >,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }

View File

@ -17,7 +17,7 @@ import { BillingSubscriptionItemService } from 'src/engine/core-modules/billing/
import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service'; import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service';
import { StripeBillingMeterEventService } from 'src/engine/core-modules/billing/stripe/services/stripe-billing-meter-event.service'; import { StripeBillingMeterEventService } from 'src/engine/core-modules/billing/stripe/services/stripe-billing-meter-event.service';
import { BillingUsageEvent } from 'src/engine/core-modules/billing/types/billing-usage-event.type'; import { BillingUsageEvent } from 'src/engine/core-modules/billing/types/billing-usage-event.type';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
@Injectable() @Injectable()
@ -28,12 +28,12 @@ export class BillingUsageService {
private readonly billingCustomerRepository: Repository<BillingCustomer>, private readonly billingCustomerRepository: Repository<BillingCustomer>,
private readonly billingSubscriptionService: BillingSubscriptionService, private readonly billingSubscriptionService: BillingSubscriptionService,
private readonly stripeBillingMeterEventService: StripeBillingMeterEventService, private readonly stripeBillingMeterEventService: StripeBillingMeterEventService,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly billingSubscriptionItemService: BillingSubscriptionItemService, private readonly billingSubscriptionItemService: BillingSubscriptionItemService,
) {} ) {}
async canFeatureBeUsed(workspaceId: string): Promise<boolean> { async canFeatureBeUsed(workspaceId: string): Promise<boolean> {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return true; return true;
} }

View File

@ -13,15 +13,15 @@ import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billin
import { BillingProductService } from 'src/engine/core-modules/billing/services/billing-product.service'; import { BillingProductService } from 'src/engine/core-modules/billing/services/billing-product.service';
import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service'; import { BillingSubscriptionService } from 'src/engine/core-modules/billing/services/billing-subscription.service';
import { getPlanKeyFromSubscription } from 'src/engine/core-modules/billing/utils/get-plan-key-from-subscription.util'; import { getPlanKeyFromSubscription } from 'src/engine/core-modules/billing/utils/get-plan-key-from-subscription.util';
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 { 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'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class BillingService { export class BillingService {
protected readonly logger = new Logger(BillingService.name); protected readonly logger = new Logger(BillingService.name);
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly billingSubscriptionService: BillingSubscriptionService, private readonly billingSubscriptionService: BillingSubscriptionService,
private readonly billingProductService: BillingProductService, private readonly billingProductService: BillingProductService,
private readonly featureFlagService: FeatureFlagService, private readonly featureFlagService: FeatureFlagService,
@ -30,7 +30,7 @@ export class BillingService {
) {} ) {}
isBillingEnabled() { isBillingEnabled() {
return this.environmentService.get('IS_BILLING_ENABLED'); return this.twentyConfigService.get('IS_BILLING_ENABLED');
} }
async hasWorkspaceAnySubscription(workspaceId: string) { async hasWorkspaceAnySubscription(workspaceId: string) {

View File

@ -6,7 +6,7 @@ import Stripe from 'stripe';
import { BillingMeterEventName } from 'src/engine/core-modules/billing/enums/billing-meter-event-names'; import { BillingMeterEventName } from 'src/engine/core-modules/billing/enums/billing-meter-event-names';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class StripeBillingMeterEventService { export class StripeBillingMeterEventService {
@ -14,14 +14,14 @@ export class StripeBillingMeterEventService {
private readonly stripe: Stripe; private readonly stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }

View File

@ -5,7 +5,7 @@ import { Injectable, Logger } from '@nestjs/common';
import Stripe from 'stripe'; import Stripe from 'stripe';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class StripeBillingMeterService { export class StripeBillingMeterService {
@ -13,14 +13,14 @@ export class StripeBillingMeterService {
private readonly stripe: Stripe; private readonly stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }

View File

@ -6,7 +6,7 @@ import Stripe from 'stripe';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class StripeBillingPortalService { export class StripeBillingPortalService {
@ -14,15 +14,15 @@ export class StripeBillingPortalService {
private readonly stripe: Stripe; private readonly stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly domainManagerService: DomainManagerService, private readonly domainManagerService: DomainManagerService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }

View File

@ -6,7 +6,7 @@ import Stripe from 'stripe';
import { BillingPlanKey } from 'src/engine/core-modules/billing/enums/billing-plan-key.enum'; import { BillingPlanKey } from 'src/engine/core-modules/billing/enums/billing-plan-key.enum';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { User } from 'src/engine/core-modules/user/user.entity'; import { User } from 'src/engine/core-modules/user/user.entity';
@Injectable() @Injectable()
@ -15,14 +15,14 @@ export class StripeCheckoutService {
private readonly stripe: Stripe; private readonly stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }
@ -57,7 +57,7 @@ export class StripeCheckoutService {
}, },
...(withTrialPeriod ...(withTrialPeriod
? { ? {
trial_period_days: this.environmentService.get( trial_period_days: this.twentyConfigService.get(
requirePaymentMethod requirePaymentMethod
? 'BILLING_FREE_TRIAL_WITH_CREDIT_CARD_DURATION_IN_DAYS' ? 'BILLING_FREE_TRIAL_WITH_CREDIT_CARD_DURATION_IN_DAYS'
: 'BILLING_FREE_TRIAL_WITHOUT_CREDIT_CARD_DURATION_IN_DAYS', : 'BILLING_FREE_TRIAL_WITHOUT_CREDIT_CARD_DURATION_IN_DAYS',

View File

@ -5,7 +5,7 @@ import { Injectable, Logger } from '@nestjs/common';
import Stripe from 'stripe'; import Stripe from 'stripe';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class StripeCustomerService { export class StripeCustomerService {
@ -13,14 +13,14 @@ export class StripeCustomerService {
private readonly stripe: Stripe; private readonly stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }

View File

@ -5,7 +5,7 @@ import { Injectable, Logger } from '@nestjs/common';
import Stripe from 'stripe'; import Stripe from 'stripe';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class StripePriceService { export class StripePriceService {
@ -13,14 +13,14 @@ export class StripePriceService {
private readonly stripe: Stripe; private readonly stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }

View File

@ -5,7 +5,7 @@ import { Injectable, Logger } from '@nestjs/common';
import Stripe from 'stripe'; import Stripe from 'stripe';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class StripeProductService { export class StripeProductService {
@ -13,14 +13,14 @@ export class StripeProductService {
private readonly stripe: Stripe; private readonly stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }

View File

@ -5,7 +5,7 @@ import { Injectable, Logger } from '@nestjs/common';
import Stripe from 'stripe'; import Stripe from 'stripe';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class StripeSubscriptionItemService { export class StripeSubscriptionItemService {
@ -13,14 +13,14 @@ export class StripeSubscriptionItemService {
private readonly stripe: Stripe; private readonly stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }

View File

@ -6,7 +6,7 @@ import Stripe from 'stripe';
import { BillingSubscriptionItem } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; import { BillingSubscriptionItem } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class StripeSubscriptionService { export class StripeSubscriptionService {
@ -14,14 +14,14 @@ export class StripeSubscriptionService {
private readonly stripe: Stripe; private readonly stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }

View File

@ -5,26 +5,26 @@ import { Injectable, Logger } from '@nestjs/common';
import Stripe from 'stripe'; import Stripe from 'stripe';
import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service'; import { StripeSDKService } from 'src/engine/core-modules/billing/stripe/stripe-sdk/services/stripe-sdk.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class StripeWebhookService { export class StripeWebhookService {
protected readonly logger = new Logger(StripeWebhookService.name); protected readonly logger = new Logger(StripeWebhookService.name);
private stripe: Stripe; private stripe: Stripe;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly stripeSDKService: StripeSDKService, private readonly stripeSDKService: StripeSDKService,
) { ) {
if (!this.environmentService.get('IS_BILLING_ENABLED')) { if (!this.twentyConfigService.get('IS_BILLING_ENABLED')) {
return; return;
} }
this.stripe = this.stripeSDKService.getStripe( this.stripe = this.stripeSDKService.getStripe(
this.environmentService.get('BILLING_STRIPE_API_KEY'), this.twentyConfigService.get('BILLING_STRIPE_API_KEY'),
); );
} }
constructEventFromPayload(signature: string, payload: Buffer) { constructEventFromPayload(signature: string, payload: Buffer) {
const webhookSecret = this.environmentService.get( const webhookSecret = this.twentyConfigService.get(
'BILLING_STRIPE_WEBHOOK_SECRET', 'BILLING_STRIPE_WEBHOOK_SECRET',
); );

View File

@ -3,13 +3,13 @@ import { CacheModuleOptions } from '@nestjs/common';
import { redisStore } from 'cache-manager-redis-yet'; import { redisStore } from 'cache-manager-redis-yet';
import { CacheStorageType } from 'src/engine/core-modules/cache-storage/types/cache-storage-type.enum'; import { CacheStorageType } from 'src/engine/core-modules/cache-storage/types/cache-storage-type.enum';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
export const cacheStorageModuleFactory = ( export const cacheStorageModuleFactory = (
environmentService: EnvironmentService, twentyConfigService: TwentyConfigService,
): CacheModuleOptions => { ): CacheModuleOptions => {
const cacheStorageType = CacheStorageType.Redis; const cacheStorageType = CacheStorageType.Redis;
const cacheStorageTtl = environmentService.get('CACHE_STORAGE_TTL'); const cacheStorageTtl = twentyConfigService.get('CACHE_STORAGE_TTL');
const cacheModuleOptions: CacheModuleOptions = { const cacheModuleOptions: CacheModuleOptions = {
isGlobal: true, isGlobal: true,
ttl: cacheStorageTtl * 1000, ttl: cacheStorageTtl * 1000,
@ -20,7 +20,7 @@ export const cacheStorageModuleFactory = (
return cacheModuleOptions; return cacheModuleOptions;
}*/ }*/
case CacheStorageType.Redis: { case CacheStorageType.Redis: {
const redisUrl = environmentService.get('REDIS_URL'); const redisUrl = twentyConfigService.get('REDIS_URL');
if (!redisUrl) { if (!redisUrl) {
throw new Error( throw new Error(

View File

@ -6,7 +6,7 @@ import { cacheStorageModuleFactory } from 'src/engine/core-modules/cache-storage
import { FlushCacheCommand } from 'src/engine/core-modules/cache-storage/commands/flush-cache.command'; import { FlushCacheCommand } from 'src/engine/core-modules/cache-storage/commands/flush-cache.command';
import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service'; import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service';
import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum'; import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Global() @Global()
@Module({ @Module({
@ -15,7 +15,7 @@ import { EnvironmentService } from 'src/engine/core-modules/environment/environm
isGlobal: true, isGlobal: true,
imports: [ConfigModule], imports: [ConfigModule],
useFactory: cacheStorageModuleFactory, useFactory: cacheStorageModuleFactory,
inject: [EnvironmentService], inject: [TwentyConfigService],
}), }),
], ],
providers: [ providers: [

View File

@ -2,14 +2,14 @@ import {
CaptchaDriverOptions, CaptchaDriverOptions,
CaptchaModuleOptions, CaptchaModuleOptions,
} from 'src/engine/core-modules/captcha/interfaces'; } from 'src/engine/core-modules/captcha/interfaces';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
export const captchaModuleFactory = ( export const captchaModuleFactory = (
environmentService: EnvironmentService, twentyConfigService: TwentyConfigService,
): CaptchaModuleOptions | undefined => { ): CaptchaModuleOptions | undefined => {
const driver = environmentService.get('CAPTCHA_DRIVER'); const driver = twentyConfigService.get('CAPTCHA_DRIVER');
const siteKey = environmentService.get('CAPTCHA_SITE_KEY'); const siteKey = twentyConfigService.get('CAPTCHA_SITE_KEY');
const secretKey = environmentService.get('CAPTCHA_SECRET_KEY'); const secretKey = twentyConfigService.get('CAPTCHA_SECRET_KEY');
if (!driver) { if (!driver) {
return; return;

View File

@ -1,7 +1,7 @@
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { ClientConfigResolver } from './client-config.resolver'; import { ClientConfigResolver } from './client-config.resolver';
@ -13,7 +13,7 @@ describe('ClientConfigResolver', () => {
providers: [ providers: [
ClientConfigResolver, ClientConfigResolver,
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: {}, useValue: {},
}, },
{ {

View File

@ -1,17 +1,17 @@
import { Query, Resolver } from '@nestjs/graphql'; import { Query, Resolver } from '@nestjs/graphql';
import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; import { NodeEnvironment } from 'src/engine/core-modules/twenty-config/interfaces/node-environment.interface';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { PUBLIC_FEATURE_FLAGS } from 'src/engine/core-modules/feature-flag/constants/public-feature-flag.const'; import { PUBLIC_FEATURE_FLAGS } from 'src/engine/core-modules/feature-flag/constants/public-feature-flag.const';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { ClientConfig } from './client-config.entity'; import { ClientConfig } from './client-config.entity';
@Resolver() @Resolver()
export class ClientConfigResolver { export class ClientConfigResolver {
constructor( constructor(
private environmentService: EnvironmentService, private twentyConfigService: TwentyConfigService,
private domainManagerService: DomainManagerService, private domainManagerService: DomainManagerService,
) {} ) {}
@ -19,17 +19,17 @@ export class ClientConfigResolver {
async clientConfig(): Promise<ClientConfig> { async clientConfig(): Promise<ClientConfig> {
const clientConfig: ClientConfig = { const clientConfig: ClientConfig = {
billing: { billing: {
isBillingEnabled: this.environmentService.get('IS_BILLING_ENABLED'), isBillingEnabled: this.twentyConfigService.get('IS_BILLING_ENABLED'),
billingUrl: this.environmentService.get('BILLING_PLAN_REQUIRED_LINK'), billingUrl: this.twentyConfigService.get('BILLING_PLAN_REQUIRED_LINK'),
trialPeriods: [ trialPeriods: [
{ {
duration: this.environmentService.get( duration: this.twentyConfigService.get(
'BILLING_FREE_TRIAL_WITH_CREDIT_CARD_DURATION_IN_DAYS', 'BILLING_FREE_TRIAL_WITH_CREDIT_CARD_DURATION_IN_DAYS',
), ),
isCreditCardRequired: true, isCreditCardRequired: true,
}, },
{ {
duration: this.environmentService.get( duration: this.twentyConfigService.get(
'BILLING_FREE_TRIAL_WITHOUT_CREDIT_CARD_DURATION_IN_DAYS', 'BILLING_FREE_TRIAL_WITHOUT_CREDIT_CARD_DURATION_IN_DAYS',
), ),
isCreditCardRequired: false, isCreditCardRequired: false,
@ -37,63 +37,64 @@ export class ClientConfigResolver {
], ],
}, },
authProviders: { authProviders: {
google: this.environmentService.get('AUTH_GOOGLE_ENABLED'), google: this.twentyConfigService.get('AUTH_GOOGLE_ENABLED'),
magicLink: false, magicLink: false,
password: this.environmentService.get('AUTH_PASSWORD_ENABLED'), password: this.twentyConfigService.get('AUTH_PASSWORD_ENABLED'),
microsoft: this.environmentService.get('AUTH_MICROSOFT_ENABLED'), microsoft: this.twentyConfigService.get('AUTH_MICROSOFT_ENABLED'),
sso: [], sso: [],
}, },
signInPrefilled: this.environmentService.get('SIGN_IN_PREFILLED'), signInPrefilled: this.twentyConfigService.get('SIGN_IN_PREFILLED'),
isMultiWorkspaceEnabled: this.environmentService.get( isMultiWorkspaceEnabled: this.twentyConfigService.get(
'IS_MULTIWORKSPACE_ENABLED', 'IS_MULTIWORKSPACE_ENABLED',
), ),
isEmailVerificationRequired: this.environmentService.get( isEmailVerificationRequired: this.twentyConfigService.get(
'IS_EMAIL_VERIFICATION_REQUIRED', 'IS_EMAIL_VERIFICATION_REQUIRED',
), ),
defaultSubdomain: this.environmentService.get('DEFAULT_SUBDOMAIN'), defaultSubdomain: this.twentyConfigService.get('DEFAULT_SUBDOMAIN'),
frontDomain: this.domainManagerService.getFrontUrl().hostname, frontDomain: this.domainManagerService.getFrontUrl().hostname,
debugMode: debugMode:
this.environmentService.get('NODE_ENV') === NodeEnvironment.development, this.twentyConfigService.get('NODE_ENV') ===
NodeEnvironment.development,
support: { support: {
supportDriver: this.environmentService.get('SUPPORT_DRIVER'), supportDriver: this.twentyConfigService.get('SUPPORT_DRIVER'),
supportFrontChatId: this.environmentService.get( supportFrontChatId: this.twentyConfigService.get(
'SUPPORT_FRONT_CHAT_ID', 'SUPPORT_FRONT_CHAT_ID',
), ),
}, },
sentry: { sentry: {
environment: this.environmentService.get('SENTRY_ENVIRONMENT'), environment: this.twentyConfigService.get('SENTRY_ENVIRONMENT'),
release: this.environmentService.get('SENTRY_RELEASE'), release: this.twentyConfigService.get('SENTRY_RELEASE'),
dsn: this.environmentService.get('SENTRY_FRONT_DSN'), dsn: this.twentyConfigService.get('SENTRY_FRONT_DSN'),
}, },
captcha: { captcha: {
provider: this.environmentService.get('CAPTCHA_DRIVER'), provider: this.twentyConfigService.get('CAPTCHA_DRIVER'),
siteKey: this.environmentService.get('CAPTCHA_SITE_KEY'), siteKey: this.twentyConfigService.get('CAPTCHA_SITE_KEY'),
}, },
chromeExtensionId: this.environmentService.get('CHROME_EXTENSION_ID'), chromeExtensionId: this.twentyConfigService.get('CHROME_EXTENSION_ID'),
api: { api: {
mutationMaximumAffectedRecords: this.environmentService.get( mutationMaximumAffectedRecords: this.twentyConfigService.get(
'MUTATION_MAXIMUM_AFFECTED_RECORDS', 'MUTATION_MAXIMUM_AFFECTED_RECORDS',
), ),
}, },
isAttachmentPreviewEnabled: this.environmentService.get( isAttachmentPreviewEnabled: this.twentyConfigService.get(
'IS_ATTACHMENT_PREVIEW_ENABLED', 'IS_ATTACHMENT_PREVIEW_ENABLED',
), ),
analyticsEnabled: this.environmentService.get('ANALYTICS_ENABLED'), analyticsEnabled: this.twentyConfigService.get('ANALYTICS_ENABLED'),
canManageFeatureFlags: canManageFeatureFlags:
this.environmentService.get('NODE_ENV') === this.twentyConfigService.get('NODE_ENV') ===
NodeEnvironment.development || NodeEnvironment.development ||
this.environmentService.get('IS_BILLING_ENABLED'), this.twentyConfigService.get('IS_BILLING_ENABLED'),
publicFeatureFlags: PUBLIC_FEATURE_FLAGS, publicFeatureFlags: PUBLIC_FEATURE_FLAGS,
isMicrosoftMessagingEnabled: this.environmentService.get( isMicrosoftMessagingEnabled: this.twentyConfigService.get(
'MESSAGING_PROVIDER_MICROSOFT_ENABLED', 'MESSAGING_PROVIDER_MICROSOFT_ENABLED',
), ),
isMicrosoftCalendarEnabled: this.environmentService.get( isMicrosoftCalendarEnabled: this.twentyConfigService.get(
'CALENDAR_PROVIDER_MICROSOFT_ENABLED', 'CALENDAR_PROVIDER_MICROSOFT_ENABLED',
), ),
isGoogleMessagingEnabled: this.environmentService.get( isGoogleMessagingEnabled: this.twentyConfigService.get(
'MESSAGING_PROVIDER_GMAIL_ENABLED', 'MESSAGING_PROVIDER_GMAIL_ENABLED',
), ),
isGoogleCalendarEnabled: this.environmentService.get( isGoogleCalendarEnabled: this.twentyConfigService.get(
'CALENDAR_PROVIDER_GOOGLE_ENABLED', 'CALENDAR_PROVIDER_GOOGLE_ENABLED',
), ),
}; };

View File

@ -14,8 +14,6 @@ import { CaptchaModule } from 'src/engine/core-modules/captcha/captcha.module';
import { captchaModuleFactory } from 'src/engine/core-modules/captcha/captcha.module-factory'; import { captchaModuleFactory } from 'src/engine/core-modules/captcha/captcha.module-factory';
import { EmailModule } from 'src/engine/core-modules/email/email.module'; import { EmailModule } from 'src/engine/core-modules/email/email.module';
import { emailModuleFactory } from 'src/engine/core-modules/email/email.module-factory'; import { emailModuleFactory } from 'src/engine/core-modules/email/email.module-factory';
import { EnvironmentModule } from 'src/engine/core-modules/environment/environment.module';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { ExceptionHandlerModule } from 'src/engine/core-modules/exception-handler/exception-handler.module'; import { ExceptionHandlerModule } from 'src/engine/core-modules/exception-handler/exception-handler.module';
import { exceptionHandlerModuleFactory } from 'src/engine/core-modules/exception-handler/exception-handler.module-factory'; import { exceptionHandlerModuleFactory } from 'src/engine/core-modules/exception-handler/exception-handler.module-factory';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
@ -42,6 +40,8 @@ import { serverlessModuleFactory } from 'src/engine/core-modules/serverless/serv
import { ServerlessModule } from 'src/engine/core-modules/serverless/serverless.module'; import { ServerlessModule } from 'src/engine/core-modules/serverless/serverless.module';
import { WorkspaceSSOModule } from 'src/engine/core-modules/sso/sso.module'; import { WorkspaceSSOModule } from 'src/engine/core-modules/sso/sso.module';
import { TelemetryModule } from 'src/engine/core-modules/telemetry/telemetry.module'; import { TelemetryModule } from 'src/engine/core-modules/telemetry/telemetry.module';
import { TwentyConfigModule } from 'src/engine/core-modules/twenty-config/twenty-config.module';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserModule } from 'src/engine/core-modules/user/user.module'; import { UserModule } from 'src/engine/core-modules/user/user.module';
import { WorkflowApiModule } from 'src/engine/core-modules/workflow/workflow-api.module'; import { WorkflowApiModule } from 'src/engine/core-modules/workflow/workflow-api.module';
import { WorkspaceInvitationModule } from 'src/engine/core-modules/workspace-invitation/workspace-invitation.module'; import { WorkspaceInvitationModule } from 'src/engine/core-modules/workspace-invitation/workspace-invitation.module';
@ -79,31 +79,31 @@ import { FileModule } from './file/file.module';
AdminPanelModule, AdminPanelModule,
LabModule, LabModule,
RoleModule, RoleModule,
EnvironmentModule.forRoot({}), TwentyConfigModule,
RedisClientModule, RedisClientModule,
FileStorageModule.forRootAsync({ FileStorageModule.forRootAsync({
useFactory: fileStorageModuleFactory, useFactory: fileStorageModuleFactory,
inject: [EnvironmentService], inject: [TwentyConfigService],
}), }),
LoggerModule.forRootAsync({ LoggerModule.forRootAsync({
useFactory: loggerModuleFactory, useFactory: loggerModuleFactory,
inject: [EnvironmentService], inject: [TwentyConfigService],
}), }),
MessageQueueModule.registerAsync({ MessageQueueModule.registerAsync({
useFactory: messageQueueModuleFactory, useFactory: messageQueueModuleFactory,
inject: [EnvironmentService, RedisClientService], inject: [TwentyConfigService, RedisClientService],
}), }),
ExceptionHandlerModule.forRootAsync({ ExceptionHandlerModule.forRootAsync({
useFactory: exceptionHandlerModuleFactory, useFactory: exceptionHandlerModuleFactory,
inject: [EnvironmentService, HttpAdapterHost], inject: [TwentyConfigService, HttpAdapterHost],
}), }),
EmailModule.forRoot({ EmailModule.forRoot({
useFactory: emailModuleFactory, useFactory: emailModuleFactory,
inject: [EnvironmentService], inject: [TwentyConfigService],
}), }),
CaptchaModule.forRoot({ CaptchaModule.forRoot({
useFactory: captchaModuleFactory, useFactory: captchaModuleFactory,
inject: [EnvironmentService], inject: [TwentyConfigService],
}), }),
EventEmitterModule.forRoot({ EventEmitterModule.forRoot({
wildcard: true, wildcard: true,
@ -111,15 +111,15 @@ import { FileModule } from './file/file.module';
CacheStorageModule, CacheStorageModule,
LLMChatModelModule.forRoot({ LLMChatModelModule.forRoot({
useFactory: llmChatModelModuleFactory, useFactory: llmChatModelModuleFactory,
inject: [EnvironmentService], inject: [TwentyConfigService],
}), }),
LLMTracingModule.forRoot({ LLMTracingModule.forRoot({
useFactory: llmTracingModuleFactory, useFactory: llmTracingModuleFactory,
inject: [EnvironmentService], inject: [TwentyConfigService],
}), }),
ServerlessModule.forRootAsync({ ServerlessModule.forRootAsync({
useFactory: serverlessModuleFactory, useFactory: serverlessModuleFactory,
inject: [EnvironmentService, FileStorageService], inject: [TwentyConfigService, FileStorageService],
}), }),
SearchModule, SearchModule,
], ],

View File

@ -1,22 +1,22 @@
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { getRepositoryToken } from '@nestjs/typeorm'; import { getRepositoryToken } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Request, Response } from 'express'; import { Request, Response } from 'express';
import { Repository } from 'typeorm';
import { CloudflareController } from 'src/engine/core-modules/domain-manager/controllers/cloudflare.controller'; import { CloudflareController } from 'src/engine/core-modules/domain-manager/controllers/cloudflare.controller';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { HttpExceptionHandlerService } from 'src/engine/core-modules/exception-handler/http-exception-handler.service';
import { CustomDomainValidRecords } from 'src/engine/core-modules/domain-manager/dtos/custom-domain-valid-records'; import { CustomDomainValidRecords } from 'src/engine/core-modules/domain-manager/dtos/custom-domain-valid-records';
import { CustomDomainService } from 'src/engine/core-modules/domain-manager/services/custom-domain.service'; import { CustomDomainService } from 'src/engine/core-modules/domain-manager/services/custom-domain.service';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service';
import { HttpExceptionHandlerService } from 'src/engine/core-modules/exception-handler/http-exception-handler.service';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
describe('CloudflareController - customHostnameWebhooks', () => { describe('CloudflareController - customHostnameWebhooks', () => {
let controller: CloudflareController; let controller: CloudflareController;
let WorkspaceRepository: Repository<Workspace>; let WorkspaceRepository: Repository<Workspace>;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
let domainManagerService: DomainManagerService; let domainManagerService: DomainManagerService;
let customDomainService: CustomDomainService; let customDomainService: CustomDomainService;
@ -56,7 +56,7 @@ describe('CloudflareController - customHostnameWebhooks', () => {
}, },
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -66,7 +66,7 @@ describe('CloudflareController - customHostnameWebhooks', () => {
controller = module.get<CloudflareController>(CloudflareController); controller = module.get<CloudflareController>(CloudflareController);
WorkspaceRepository = module.get(getRepositoryToken(Workspace, 'core')); WorkspaceRepository = module.get(getRepositoryToken(Workspace, 'core'));
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
domainManagerService = domainManagerService =
module.get<DomainManagerService>(DomainManagerService); module.get<DomainManagerService>(DomainManagerService);
customDomainService = module.get<CustomDomainService>(CustomDomainService); customDomainService = module.get<CustomDomainService>(CustomDomainService);
@ -83,7 +83,7 @@ describe('CloudflareController - customHostnameWebhooks', () => {
send: sendMock, send: sendMock,
} as unknown as Response; } as unknown as Response;
jest.spyOn(environmentService, 'get').mockReturnValue('correct-secret'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('correct-secret');
await controller.customHostnameWebhooks(req, res); await controller.customHostnameWebhooks(req, res);
@ -102,7 +102,7 @@ describe('CloudflareController - customHostnameWebhooks', () => {
send: sendMock, send: sendMock,
} as unknown as Response; } as unknown as Response;
jest.spyOn(environmentService, 'get').mockReturnValue('correct-secret'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('correct-secret');
jest jest
.spyOn(customDomainService, 'getCustomDomainDetails') .spyOn(customDomainService, 'getCustomDomainDetails')
.mockResolvedValue({ .mockResolvedValue({
@ -147,7 +147,7 @@ describe('CloudflareController - customHostnameWebhooks', () => {
send: sendMock, send: sendMock,
} as unknown as Response; } as unknown as Response;
jest.spyOn(environmentService, 'get').mockReturnValue('correct-secret'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('correct-secret');
jest.spyOn(WorkspaceRepository, 'findOneBy').mockResolvedValue({ jest.spyOn(WorkspaceRepository, 'findOneBy').mockResolvedValue({
customDomain: 'notfound.com', customDomain: 'notfound.com',
isCustomDomainEnabled: true, isCustomDomainEnabled: true,
@ -180,7 +180,7 @@ describe('CloudflareController - customHostnameWebhooks', () => {
send: sendMock, send: sendMock,
} as unknown as Response; } as unknown as Response;
jest.spyOn(environmentService, 'get').mockReturnValue('correct-secret'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('correct-secret');
jest.spyOn(WorkspaceRepository, 'findOneBy').mockResolvedValue({ jest.spyOn(WorkspaceRepository, 'findOneBy').mockResolvedValue({
customDomain: 'nothing-change.com', customDomain: 'nothing-change.com',
isCustomDomainEnabled: true, isCustomDomainEnabled: true,

View File

@ -4,17 +4,17 @@ import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { timingSafeEqual } from 'crypto'; import { timingSafeEqual } from 'crypto';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class CloudflareSecretMatchGuard implements CanActivate { export class CloudflareSecretMatchGuard implements CanActivate {
constructor(private readonly environmentService: EnvironmentService) {} constructor(private readonly twentyConfigService: TwentyConfigService) {}
canActivate(context: ExecutionContext): boolean { canActivate(context: ExecutionContext): boolean {
try { try {
const request = context.switchToHttp().getRequest<Request>(); const request = context.switchToHttp().getRequest<Request>();
const cloudflareWebhookSecret = this.environmentService.get( const cloudflareWebhookSecret = this.twentyConfigService.get(
'CLOUDFLARE_WEBHOOK_SECRET', 'CLOUDFLARE_WEBHOOK_SECRET',
); );

View File

@ -2,25 +2,25 @@ import { ExecutionContext } from '@nestjs/common';
import * as crypto from 'crypto'; import * as crypto from 'crypto';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { CloudflareSecretMatchGuard } from './cloudflare-secret.guard'; import { CloudflareSecretMatchGuard } from './cloudflare-secret.guard';
describe('CloudflareSecretMatchGuard.canActivate', () => { describe('CloudflareSecretMatchGuard.canActivate', () => {
let guard: CloudflareSecretMatchGuard; let guard: CloudflareSecretMatchGuard;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
beforeEach(() => { beforeEach(() => {
environmentService = { twentyConfigService = {
get: jest.fn(), get: jest.fn(),
} as unknown as EnvironmentService; } as unknown as TwentyConfigService;
guard = new CloudflareSecretMatchGuard(environmentService); guard = new CloudflareSecretMatchGuard(twentyConfigService);
}); });
it('should return true when the webhook secret matches', () => { it('should return true when the webhook secret matches', () => {
const mockRequest = { headers: { 'cf-webhook-auth': 'valid-secret' } }; const mockRequest = { headers: { 'cf-webhook-auth': 'valid-secret' } };
jest.spyOn(environmentService, 'get').mockReturnValue('valid-secret'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('valid-secret');
const mockContext = { const mockContext = {
switchToHttp: () => ({ switchToHttp: () => ({
@ -36,7 +36,7 @@ describe('CloudflareSecretMatchGuard.canActivate', () => {
it('should return true when env is not set', () => { it('should return true when env is not set', () => {
const mockRequest = { headers: { 'cf-webhook-auth': 'valid-secret' } }; const mockRequest = { headers: { 'cf-webhook-auth': 'valid-secret' } };
jest.spyOn(environmentService, 'get').mockReturnValue(undefined); jest.spyOn(twentyConfigService, 'get').mockReturnValue(undefined);
const mockContext = { const mockContext = {
switchToHttp: () => ({ switchToHttp: () => ({
@ -52,7 +52,7 @@ describe('CloudflareSecretMatchGuard.canActivate', () => {
it('should return false if an error occurs', () => { it('should return false if an error occurs', () => {
const mockRequest = { headers: {} }; const mockRequest = { headers: {} };
jest.spyOn(environmentService, 'get').mockReturnValue('valid-secret'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('valid-secret');
const mockContext = { const mockContext = {
switchToHttp: () => ({ switchToHttp: () => ({

View File

@ -1,18 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { CustomHostnameCreateResponse } from 'cloudflare/resources/custom-hostnames/custom-hostnames';
import Cloudflare from 'cloudflare'; import Cloudflare from 'cloudflare';
import { CustomHostnameCreateResponse } from 'cloudflare/resources/custom-hostnames/custom-hostnames';
import { DomainManagerException } from 'src/engine/core-modules/domain-manager/domain-manager.exception';
import { CustomDomainService } from 'src/engine/core-modules/domain-manager/services/custom-domain.service'; import { CustomDomainService } from 'src/engine/core-modules/domain-manager/services/custom-domain.service';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { DomainManagerException } from 'src/engine/core-modules/domain-manager/domain-manager.exception';
jest.mock('cloudflare'); jest.mock('cloudflare');
describe('CustomDomainService', () => { describe('CustomDomainService', () => {
let customDomainService: CustomDomainService; let customDomainService: CustomDomainService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
let domainManagerService: DomainManagerService; let domainManagerService: DomainManagerService;
beforeEach(async () => { beforeEach(async () => {
@ -20,7 +20,7 @@ describe('CustomDomainService', () => {
providers: [ providers: [
CustomDomainService, CustomDomainService,
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -35,7 +35,7 @@ describe('CustomDomainService', () => {
}).compile(); }).compile();
customDomainService = module.get<CustomDomainService>(CustomDomainService); customDomainService = module.get<CustomDomainService>(CustomDomainService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
domainManagerService = domainManagerService =
module.get<DomainManagerService>(DomainManagerService); module.get<DomainManagerService>(DomainManagerService);
@ -52,11 +52,11 @@ describe('CustomDomainService', () => {
it('should initialize cloudflareClient when CLOUDFLARE_API_KEY is defined', () => { it('should initialize cloudflareClient when CLOUDFLARE_API_KEY is defined', () => {
const mockApiKey = 'test-api-key'; const mockApiKey = 'test-api-key';
jest.spyOn(environmentService, 'get').mockReturnValue(mockApiKey); jest.spyOn(twentyConfigService, 'get').mockReturnValue(mockApiKey);
const instance = new CustomDomainService(environmentService, {} as any); const instance = new CustomDomainService(twentyConfigService, {} as any);
expect(environmentService.get).toHaveBeenCalledWith('CLOUDFLARE_API_KEY'); expect(twentyConfigService.get).toHaveBeenCalledWith('CLOUDFLARE_API_KEY');
expect(Cloudflare).toHaveBeenCalledWith({ apiToken: mockApiKey }); expect(Cloudflare).toHaveBeenCalledWith({ apiToken: mockApiKey });
expect(instance.cloudflareClient).toBeDefined(); expect(instance.cloudflareClient).toBeDefined();
}); });
@ -89,7 +89,7 @@ describe('CustomDomainService', () => {
jest jest
.spyOn(customDomainService, 'getCustomDomainDetails') .spyOn(customDomainService, 'getCustomDomainDetails')
.mockResolvedValueOnce(undefined); .mockResolvedValueOnce(undefined);
jest.spyOn(environmentService, 'get').mockReturnValue('test-zone-id'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('test-zone-id');
(customDomainService as any).cloudflareClient = cloudflareMock; (customDomainService as any).cloudflareClient = cloudflareMock;
await customDomainService.registerCustomDomain(customDomain); await customDomainService.registerCustomDomain(customDomain);
@ -111,7 +111,7 @@ describe('CustomDomainService', () => {
}, },
}; };
jest.spyOn(environmentService, 'get').mockReturnValue('test-zone-id'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('test-zone-id');
(customDomainService as any).cloudflareClient = cloudflareMock; (customDomainService as any).cloudflareClient = cloudflareMock;
const result = const result =
@ -137,7 +137,7 @@ describe('CustomDomainService', () => {
}, },
}; };
jest.spyOn(environmentService, 'get').mockReturnValue('test-zone-id'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('test-zone-id');
jest jest
.spyOn(domainManagerService, 'getFrontUrl') .spyOn(domainManagerService, 'getFrontUrl')
@ -175,7 +175,7 @@ describe('CustomDomainService', () => {
}, },
}; };
jest.spyOn(environmentService, 'get').mockReturnValue('test-zone-id'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('test-zone-id');
jest jest
.spyOn(domainManagerService, 'getFrontUrl') .spyOn(domainManagerService, 'getFrontUrl')
.mockReturnValue(new URL('https://front.domain')); .mockReturnValue(new URL('https://front.domain'));
@ -199,7 +199,7 @@ describe('CustomDomainService', () => {
}, },
}; };
jest.spyOn(environmentService, 'get').mockReturnValue('test-zone-id'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('test-zone-id');
(customDomainService as any).cloudflareClient = cloudflareMock; (customDomainService as any).cloudflareClient = cloudflareMock;
await expect( await expect(
@ -249,7 +249,7 @@ describe('CustomDomainService', () => {
}, },
}; };
jest.spyOn(environmentService, 'get').mockReturnValue('test-zone-id'); jest.spyOn(twentyConfigService, 'get').mockReturnValue('test-zone-id');
(customDomainService as any).cloudflareClient = cloudflareMock; (customDomainService as any).cloudflareClient = cloudflareMock;
await expect( await expect(

View File

@ -9,21 +9,21 @@ import {
DomainManagerExceptionCode, DomainManagerExceptionCode,
} from 'src/engine/core-modules/domain-manager/domain-manager.exception'; } from 'src/engine/core-modules/domain-manager/domain-manager.exception';
import { CustomDomainValidRecords } from 'src/engine/core-modules/domain-manager/dtos/custom-domain-valid-records'; import { CustomDomainValidRecords } from 'src/engine/core-modules/domain-manager/dtos/custom-domain-valid-records';
import { domainManagerValidator } from 'src/engine/core-modules/domain-manager/validator/cloudflare.validate';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service';
import { domainManagerValidator } from 'src/engine/core-modules/domain-manager/validator/cloudflare.validate';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable() @Injectable()
export class CustomDomainService { export class CustomDomainService {
cloudflareClient?: Cloudflare; cloudflareClient?: Cloudflare;
constructor( constructor(
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
private readonly domainManagerService: DomainManagerService, private readonly domainManagerService: DomainManagerService,
) { ) {
if (this.environmentService.get('CLOUDFLARE_API_KEY')) { if (this.twentyConfigService.get('CLOUDFLARE_API_KEY')) {
this.cloudflareClient = new Cloudflare({ this.cloudflareClient = new Cloudflare({
apiToken: this.environmentService.get('CLOUDFLARE_API_KEY'), apiToken: this.twentyConfigService.get('CLOUDFLARE_API_KEY'),
}); });
} }
} }
@ -39,7 +39,7 @@ export class CustomDomainService {
} }
return await this.cloudflareClient.customHostnames.create({ return await this.cloudflareClient.customHostnames.create({
zone_id: this.environmentService.get('CLOUDFLARE_ZONE_ID'), zone_id: this.twentyConfigService.get('CLOUDFLARE_ZONE_ID'),
hostname: customDomain, hostname: customDomain,
ssl: { ssl: {
method: 'txt', method: 'txt',
@ -63,7 +63,7 @@ export class CustomDomainService {
domainManagerValidator.isCloudflareInstanceDefined(this.cloudflareClient); domainManagerValidator.isCloudflareInstanceDefined(this.cloudflareClient);
const response = await this.cloudflareClient.customHostnames.list({ const response = await this.cloudflareClient.customHostnames.list({
zone_id: this.environmentService.get('CLOUDFLARE_ZONE_ID'), zone_id: this.twentyConfigService.get('CLOUDFLARE_ZONE_ID'),
hostname: customDomain, hostname: customDomain,
}); });
@ -163,7 +163,7 @@ export class CustomDomainService {
if (customHostname) { if (customHostname) {
await this.cloudflareClient.customHostnames.delete(customHostname.id, { await this.cloudflareClient.customHostnames.delete(customHostname.id, {
zone_id: this.environmentService.get('CLOUDFLARE_ZONE_ID'), zone_id: this.twentyConfigService.get('CLOUDFLARE_ZONE_ID'),
}); });
} }
} catch (err) { } catch (err) {
@ -175,7 +175,7 @@ export class CustomDomainService {
domainManagerValidator.isCloudflareInstanceDefined(this.cloudflareClient); domainManagerValidator.isCloudflareInstanceDefined(this.cloudflareClient);
await this.cloudflareClient.customHostnames.delete(customHostnameId, { await this.cloudflareClient.customHostnames.delete(customHostnameId, {
zone_id: this.environmentService.get('CLOUDFLARE_ZONE_ID'), zone_id: this.twentyConfigService.get('CLOUDFLARE_ZONE_ID'),
}); });
} }

View File

@ -3,7 +3,7 @@ import { getRepositoryToken } from '@nestjs/typeorm';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { DomainManagerService } from './domain-manager.service'; import { DomainManagerService } from './domain-manager.service';
@ -12,7 +12,7 @@ describe('DomainManagerService', () => {
describe('getWorkspaceUrls', () => { describe('getWorkspaceUrls', () => {
it('should return a URL containing the correct customDomain if customDomain is provided', () => { it('should return a URL containing the correct customDomain if customDomain is provided', () => {
jest jest
.spyOn(environmentService, 'get') .spyOn(twentyConfigService, 'get')
.mockImplementation((key: string) => { .mockImplementation((key: string) => {
const env = { const env = {
FRONTEND_URL: 'https://example.com', FRONTEND_URL: 'https://example.com',
@ -35,7 +35,7 @@ describe('DomainManagerService', () => {
it('should return a URL containing the correct subdomain if customDomain is not provided but subdomain is', () => { it('should return a URL containing the correct subdomain if customDomain is not provided but subdomain is', () => {
jest jest
.spyOn(environmentService, 'get') .spyOn(twentyConfigService, 'get')
.mockImplementation((key: string) => { .mockImplementation((key: string) => {
const env = { const env = {
FRONTEND_URL: 'https://example.com', FRONTEND_URL: 'https://example.com',
@ -58,7 +58,7 @@ describe('DomainManagerService', () => {
}); });
}); });
let domainManagerService: DomainManagerService; let domainManagerService: DomainManagerService;
let environmentService: EnvironmentService; let twentyConfigService: TwentyConfigService;
beforeEach(async () => { beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({ const module: TestingModule = await Test.createTestingModule({
@ -69,7 +69,7 @@ describe('DomainManagerService', () => {
useClass: Repository, useClass: Repository,
}, },
{ {
provide: EnvironmentService, provide: TwentyConfigService,
useValue: { useValue: {
get: jest.fn(), get: jest.fn(),
}, },
@ -79,13 +79,13 @@ describe('DomainManagerService', () => {
domainManagerService = domainManagerService =
module.get<DomainManagerService>(DomainManagerService); module.get<DomainManagerService>(DomainManagerService);
environmentService = module.get<EnvironmentService>(EnvironmentService); twentyConfigService = module.get<TwentyConfigService>(TwentyConfigService);
}); });
describe('buildBaseUrl', () => { describe('buildBaseUrl', () => {
it('should build the base URL from environment variables', () => { it('should build the base URL from environment variables', () => {
jest jest
.spyOn(environmentService, 'get') .spyOn(twentyConfigService, 'get')
.mockImplementation((key: string) => { .mockImplementation((key: string) => {
const env = { const env = {
FRONTEND_URL: 'https://example.com', FRONTEND_URL: 'https://example.com',
@ -101,7 +101,7 @@ describe('DomainManagerService', () => {
it('should append default subdomain if multiworkspace is enabled', () => { it('should append default subdomain if multiworkspace is enabled', () => {
jest jest
.spyOn(environmentService, 'get') .spyOn(twentyConfigService, 'get')
.mockImplementation((key: string) => { .mockImplementation((key: string) => {
const env = { const env = {
FRONTEND_URL: 'https://example.com', FRONTEND_URL: 'https://example.com',
@ -121,7 +121,7 @@ describe('DomainManagerService', () => {
describe('buildWorkspaceURL', () => { describe('buildWorkspaceURL', () => {
it('should build workspace URL with given subdomain', () => { it('should build workspace URL with given subdomain', () => {
jest jest
.spyOn(environmentService, 'get') .spyOn(twentyConfigService, 'get')
.mockImplementation((key: string) => { .mockImplementation((key: string) => {
const env = { const env = {
FRONTEND_URL: 'https://example.com', FRONTEND_URL: 'https://example.com',
@ -145,7 +145,7 @@ describe('DomainManagerService', () => {
it('should set the pathname if provided', () => { it('should set the pathname if provided', () => {
jest jest
.spyOn(environmentService, 'get') .spyOn(twentyConfigService, 'get')
.mockImplementation((key: string) => { .mockImplementation((key: string) => {
const env = { const env = {
FRONTEND_URL: 'https://example.com', FRONTEND_URL: 'https://example.com',
@ -168,7 +168,7 @@ describe('DomainManagerService', () => {
it('should set the search parameters if provided', () => { it('should set the search parameters if provided', () => {
jest jest
.spyOn(environmentService, 'get') .spyOn(twentyConfigService, 'get')
.mockImplementation((key: string) => { .mockImplementation((key: string) => {
const env = { const env = {
FRONTEND_URL: 'https://example.com', FRONTEND_URL: 'https://example.com',

View File

@ -10,7 +10,7 @@ import { CustomDomainValidRecords } from 'src/engine/core-modules/domain-manager
import { generateRandomSubdomain } from 'src/engine/core-modules/domain-manager/utils/generate-random-subdomain'; import { generateRandomSubdomain } from 'src/engine/core-modules/domain-manager/utils/generate-random-subdomain';
import { getSubdomainFromEmail } from 'src/engine/core-modules/domain-manager/utils/get-subdomain-from-email'; import { getSubdomainFromEmail } from 'src/engine/core-modules/domain-manager/utils/get-subdomain-from-email';
import { getSubdomainNameFromDisplayName } from 'src/engine/core-modules/domain-manager/utils/get-subdomain-name-from-display-name'; import { getSubdomainNameFromDisplayName } from 'src/engine/core-modules/domain-manager/utils/get-subdomain-name-from-display-name';
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate'; import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
@ -19,13 +19,13 @@ export class DomainManagerService {
constructor( constructor(
@InjectRepository(Workspace, 'core') @InjectRepository(Workspace, 'core')
private readonly workspaceRepository: Repository<Workspace>, private readonly workspaceRepository: Repository<Workspace>,
private readonly environmentService: EnvironmentService, private readonly twentyConfigService: TwentyConfigService,
) {} ) {}
getFrontUrl() { getFrontUrl() {
return new URL( return new URL(
this.environmentService.get('FRONTEND_URL') ?? this.twentyConfigService.get('FRONTEND_URL') ??
this.environmentService.get('SERVER_URL'), this.twentyConfigService.get('SERVER_URL'),
); );
} }
@ -33,10 +33,10 @@ export class DomainManagerService {
const baseUrl = this.getFrontUrl(); const baseUrl = this.getFrontUrl();
if ( if (
this.environmentService.get('IS_MULTIWORKSPACE_ENABLED') && this.twentyConfigService.get('IS_MULTIWORKSPACE_ENABLED') &&
this.environmentService.get('DEFAULT_SUBDOMAIN') this.twentyConfigService.get('DEFAULT_SUBDOMAIN')
) { ) {
baseUrl.hostname = `${this.environmentService.get('DEFAULT_SUBDOMAIN')}.${baseUrl.hostname}`; baseUrl.hostname = `${this.twentyConfigService.get('DEFAULT_SUBDOMAIN')}.${baseUrl.hostname}`;
} }
return baseUrl; return baseUrl;
@ -122,7 +122,7 @@ export class DomainManagerService {
} }
isDefaultSubdomain(subdomain: string) { isDefaultSubdomain(subdomain: string) {
return subdomain === this.environmentService.get('DEFAULT_SUBDOMAIN'); return subdomain === this.twentyConfigService.get('DEFAULT_SUBDOMAIN');
} }
computeRedirectErrorUrl( computeRedirectErrorUrl(
@ -139,7 +139,7 @@ export class DomainManagerService {
} }
private async getDefaultWorkspace() { private async getDefaultWorkspace() {
if (this.environmentService.get('IS_MULTIWORKSPACE_ENABLED')) { if (this.twentyConfigService.get('IS_MULTIWORKSPACE_ENABLED')) {
throw new Error( throw new Error(
'Default workspace does not exist when multi-workspace is enabled', 'Default workspace does not exist when multi-workspace is enabled',
); );
@ -171,7 +171,7 @@ export class DomainManagerService {
} }
async getWorkspaceByOriginOrDefaultWorkspace(origin: string) { async getWorkspaceByOriginOrDefaultWorkspace(origin: string) {
if (!this.environmentService.get('IS_MULTIWORKSPACE_ENABLED')) { if (!this.twentyConfigService.get('IS_MULTIWORKSPACE_ENABLED')) {
return this.getDefaultWorkspace(); return this.getDefaultWorkspace();
} }
@ -222,7 +222,7 @@ export class DomainManagerService {
private getTwentyWorkspaceUrl(subdomain: string) { private getTwentyWorkspaceUrl(subdomain: string) {
const url = this.getFrontUrl(); const url = this.getFrontUrl();
url.hostname = this.environmentService.get('IS_MULTIWORKSPACE_ENABLED') url.hostname = this.twentyConfigService.get('IS_MULTIWORKSPACE_ENABLED')
? `${subdomain}.${url.hostname}` ? `${subdomain}.${url.hostname}`
: url.hostname; : url.hostname;
@ -234,7 +234,7 @@ export class DomainManagerService {
) { ) {
if (!workspace) { if (!workspace) {
return { return {
subdomain: this.environmentService.get('DEFAULT_SUBDOMAIN'), subdomain: this.twentyConfigService.get('DEFAULT_SUBDOMAIN'),
customDomain: null, customDomain: null,
}; };
} }

Some files were not shown because too many files have changed in this diff Show More