From 50bd91262ffd958869b73349ed74def2c791f28c Mon Sep 17 00:00:00 2001 From: Marie <51697796+ijreilly@users.noreply.github.com> Date: Fri, 21 Feb 2025 17:04:30 +0100 Subject: [PATCH] [permissions] Rename enum SettingsFeatures --> SettingsPermissions (#10389) --- .../src/generated-metadata/graphql.ts | 4 +-- .../twenty-front/src/generated/graphql.tsx | 8 +++--- .../modules/app/components/SettingsRoutes.tsx | 10 +++---- .../hooks/useRecordGroupActions.ts | 4 +-- .../SettingsProtectedRouteWrapper.tsx | 4 +-- .../useSettingsNavigationItems.test.tsx | 26 +++++++++---------- .../hooks/useSettingsNavigationItems.tsx | 20 +++++++------- .../roles/hooks/useHasSettingsPermission.ts | 4 +-- .../roles/hooks/useSettingsPermissionMap.ts | 6 ++--- .../roles/components/RolePermissions.tsx | 16 ++++++------ .../src/testing/mock-data/users.ts | 4 +-- ...jects-permissions-requirements.constant.ts | 6 ++--- .../interfaces/base-resolver-service.ts | 4 +-- .../engine/core-modules/auth/auth.resolver.ts | 4 +-- .../core-modules/billing/billing.resolver.ts | 8 +++--- .../engine/core-modules/lab/lab.resolver.ts | 4 +-- .../engine/core-modules/sso/sso.resolver.ts | 4 +-- .../user-workspace/user-workspace.entity.ts | 13 ++++++---- .../engine/core-modules/user/user.resolver.ts | 15 ++++++----- .../workspace/services/workspace.service.ts | 6 ++--- .../workspace/workspace.resolver.ts | 6 ++--- .../guards/settings-permissions.guard.ts | 4 +-- .../field-metadata/field-metadata.resolver.ts | 8 +++--- .../object-metadata/object-metadata.module.ts | 4 +-- .../object-metadata.resolver.ts | 6 ++--- .../permissions/permissions.service.ts | 13 ++++++---- .../relation-metadata.module.ts | 4 +-- .../relation-metadata.resolver.ts | 4 +-- .../metadata-modules/role/role.resolver.ts | 4 +-- ...ingsFeatures.ts => SettingsPermissions.ts} | 2 +- packages/twenty-shared/src/constants/index.ts | 3 ++- 31 files changed, 119 insertions(+), 109 deletions(-) rename packages/twenty-shared/src/constants/{SettingsFeatures.ts => SettingsPermissions.ts} (86%) diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 20e559294..2df446d44 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -1804,7 +1804,7 @@ export enum ServerlessFunctionSyncStatus { READY = 'READY' } -export enum SettingsFeatures { +export enum SettingsPermissions { ADMIN_PANEL = 'ADMIN_PANEL', API_KEYS_AND_WEBHOOKS = 'API_KEYS_AND_WEBHOOKS', DATA_MODEL = 'DATA_MODEL', @@ -2130,7 +2130,7 @@ export type UserWorkspace = { deletedAt?: Maybe; id: Scalars['UUID']['output']; objectRecordsPermissions?: Maybe>; - settingsPermissions?: Maybe>; + settingsPermissions?: Maybe>; updatedAt: Scalars['DateTime']['output']; user: User; userId: Scalars['String']['output']; diff --git a/packages/twenty-front/src/generated/graphql.tsx b/packages/twenty-front/src/generated/graphql.tsx index daeacf30e..a5f5a80b8 100644 --- a/packages/twenty-front/src/generated/graphql.tsx +++ b/packages/twenty-front/src/generated/graphql.tsx @@ -1604,7 +1604,7 @@ export enum ServerlessFunctionSyncStatus { READY = 'READY' } -export enum SettingsFeatures { +export enum SettingsPermissions { ADMIN_PANEL = 'ADMIN_PANEL', API_KEYS_AND_WEBHOOKS = 'API_KEYS_AND_WEBHOOKS', DATA_MODEL = 'DATA_MODEL', @@ -1916,7 +1916,7 @@ export type UserWorkspace = { deletedAt?: Maybe; id: Scalars['UUID']; objectRecordsPermissions?: Maybe>; - settingsPermissions?: Maybe>; + settingsPermissions?: Maybe>; updatedAt: Scalars['DateTime']; user: User; userId: Scalars['String']; @@ -2434,7 +2434,7 @@ export type GetSsoIdentityProvidersQueryVariables = Exact<{ [key: string]: never export type GetSsoIdentityProvidersQuery = { __typename?: 'Query', getSSOIdentityProviders: Array<{ __typename?: 'FindAvailableSSOIDPOutput', type: IdentityProviderType, id: string, name: string, issuer: string, status: SsoIdentityProviderStatus }> }; -export type UserQueryFragmentFragment = { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, analyticsTinybirdJwts?: { __typename?: 'AnalyticsTinybirdJwtMap', getWebhookAnalytics: string, getPageviewsAnalytics: string, getUsersAnalytics: string, getServerlessFunctionDuration: string, getServerlessFunctionSuccessRate: string, getServerlessFunctionErrorCount: string } | null, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, currentUserWorkspace?: { __typename?: 'UserWorkspace', settingsPermissions?: Array | null, objectRecordsPermissions?: Array | null } | null, currentWorkspace?: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, isGoogleAuthEnabled: boolean, isMicrosoftAuthEnabled: boolean, isPasswordAuthEnabled: boolean, subdomain: string, hasValidEnterpriseKey: boolean, customDomain?: string | null, metadataVersion: number, workspaceMembersCount?: number | null, workspaceUrls: { __typename?: 'workspaceUrls', subdomainUrl: string, customUrl?: string | null }, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: FeatureFlagKey, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null, billingSubscriptions: Array<{ __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus }> } | null, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, subdomain: string, customDomain?: string | null, workspaceUrls: { __typename?: 'workspaceUrls', subdomainUrl: string, customUrl?: string | null } } | null }> }; +export type UserQueryFragmentFragment = { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, analyticsTinybirdJwts?: { __typename?: 'AnalyticsTinybirdJwtMap', getWebhookAnalytics: string, getPageviewsAnalytics: string, getUsersAnalytics: string, getServerlessFunctionDuration: string, getServerlessFunctionSuccessRate: string, getServerlessFunctionErrorCount: string } | null, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, currentUserWorkspace?: { __typename?: 'UserWorkspace', settingsPermissions?: Array | null, objectRecordsPermissions?: Array | null } | null, currentWorkspace?: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, isGoogleAuthEnabled: boolean, isMicrosoftAuthEnabled: boolean, isPasswordAuthEnabled: boolean, subdomain: string, hasValidEnterpriseKey: boolean, customDomain?: string | null, metadataVersion: number, workspaceMembersCount?: number | null, workspaceUrls: { __typename?: 'workspaceUrls', subdomainUrl: string, customUrl?: string | null }, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: FeatureFlagKey, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null, billingSubscriptions: Array<{ __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus }> } | null, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, subdomain: string, customDomain?: string | null, workspaceUrls: { __typename?: 'workspaceUrls', subdomainUrl: string, customUrl?: string | null } } | null }> }; export type DeleteUserAccountMutationVariables = Exact<{ [key: string]: never; }>; @@ -2451,7 +2451,7 @@ export type UploadProfilePictureMutation = { __typename?: 'Mutation', uploadProf export type GetCurrentUserQueryVariables = Exact<{ [key: string]: never; }>; -export type GetCurrentUserQuery = { __typename?: 'Query', currentUser: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, analyticsTinybirdJwts?: { __typename?: 'AnalyticsTinybirdJwtMap', getWebhookAnalytics: string, getPageviewsAnalytics: string, getUsersAnalytics: string, getServerlessFunctionDuration: string, getServerlessFunctionSuccessRate: string, getServerlessFunctionErrorCount: string } | null, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, currentUserWorkspace?: { __typename?: 'UserWorkspace', settingsPermissions?: Array | null, objectRecordsPermissions?: Array | null } | null, currentWorkspace?: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, isGoogleAuthEnabled: boolean, isMicrosoftAuthEnabled: boolean, isPasswordAuthEnabled: boolean, subdomain: string, hasValidEnterpriseKey: boolean, customDomain?: string | null, metadataVersion: number, workspaceMembersCount?: number | null, workspaceUrls: { __typename?: 'workspaceUrls', subdomainUrl: string, customUrl?: string | null }, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: FeatureFlagKey, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null, billingSubscriptions: Array<{ __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus }> } | null, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, subdomain: string, customDomain?: string | null, workspaceUrls: { __typename?: 'workspaceUrls', subdomainUrl: string, customUrl?: string | null } } | null }> } }; +export type GetCurrentUserQuery = { __typename?: 'Query', currentUser: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, analyticsTinybirdJwts?: { __typename?: 'AnalyticsTinybirdJwtMap', getWebhookAnalytics: string, getPageviewsAnalytics: string, getUsersAnalytics: string, getServerlessFunctionDuration: string, getServerlessFunctionSuccessRate: string, getServerlessFunctionErrorCount: string } | null, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, userEmail: string, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, currentUserWorkspace?: { __typename?: 'UserWorkspace', settingsPermissions?: Array | null, objectRecordsPermissions?: Array | null } | null, currentWorkspace?: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, isGoogleAuthEnabled: boolean, isMicrosoftAuthEnabled: boolean, isPasswordAuthEnabled: boolean, subdomain: string, hasValidEnterpriseKey: boolean, customDomain?: string | null, metadataVersion: number, workspaceMembersCount?: number | null, workspaceUrls: { __typename?: 'workspaceUrls', subdomainUrl: string, customUrl?: string | null }, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: FeatureFlagKey, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null, billingSubscriptions: Array<{ __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus }> } | null, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, subdomain: string, customDomain?: string | null, workspaceUrls: { __typename?: 'workspaceUrls', subdomainUrl: string, customUrl?: string | null } } | null }> } }; export type ActivateWorkflowVersionMutationVariables = Exact<{ workflowVersionId: Scalars['String']; diff --git a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx index ba75a4c9b..754374597 100644 --- a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx +++ b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx @@ -4,7 +4,7 @@ import { Route, Routes } from 'react-router-dom'; import { SettingsProtectedRouteWrapper } from '@/settings/components/SettingsProtectedRouteWrapper'; import { SettingsSkeletonLoader } from '@/settings/components/SettingsSkeletonLoader'; import { SettingsPath } from '@/types/SettingsPath'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { FeatureFlagKey } from '~/generated-metadata/graphql'; const SettingsAccountsCalendars = lazy(() => @@ -308,7 +308,7 @@ export const SettingsRoutes = ({ } > @@ -323,7 +323,7 @@ export const SettingsRoutes = ({ } > @@ -341,7 +341,7 @@ export const SettingsRoutes = ({ } @@ -437,7 +437,7 @@ export const SettingsRoutes = ({ } > diff --git a/packages/twenty-front/src/modules/object-record/record-group/hooks/useRecordGroupActions.ts b/packages/twenty-front/src/modules/object-record/record-group/hooks/useRecordGroupActions.ts index 63e92664d..96ff04e7e 100644 --- a/packages/twenty-front/src/modules/object-record/record-group/hooks/useRecordGroupActions.ts +++ b/packages/twenty-front/src/modules/object-record/record-group/hooks/useRecordGroupActions.ts @@ -12,7 +12,7 @@ import { ViewType } from '@/views/types/ViewType'; import { useCallback, useContext } from 'react'; import { useLocation } from 'react-router-dom'; import { useSetRecoilState } from 'recoil'; -import { isDefined, SettingsFeatures } from 'twenty-shared'; +import { isDefined, SettingsPermissions } from 'twenty-shared'; import { IconEyeOff, IconSettings } from 'twenty-ui'; import { useNavigateSettings } from '~/hooks/useNavigateSettings'; @@ -71,7 +71,7 @@ export const useRecordGroupActions = ({ ]); const hasAccessToDataModelSettings = useHasSettingsPermission( - SettingsFeatures.DATA_MODEL, + SettingsPermissions.DATA_MODEL, ); const recordGroupActions: RecordGroupAction[] = []; diff --git a/packages/twenty-front/src/modules/settings/components/SettingsProtectedRouteWrapper.tsx b/packages/twenty-front/src/modules/settings/components/SettingsProtectedRouteWrapper.tsx index afc3fbd7b..b6137a56e 100644 --- a/packages/twenty-front/src/modules/settings/components/SettingsProtectedRouteWrapper.tsx +++ b/packages/twenty-front/src/modules/settings/components/SettingsProtectedRouteWrapper.tsx @@ -3,12 +3,12 @@ import { SettingsPath } from '@/types/SettingsPath'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { ReactNode } from 'react'; import { Navigate, Outlet } from 'react-router-dom'; -import { FeatureFlagKey, SettingsFeatures } from '~/generated/graphql'; +import { FeatureFlagKey, SettingsPermissions } from '~/generated/graphql'; import { getSettingsPath } from '~/utils/navigation/getSettingsPath'; type SettingsProtectedRouteWrapperProps = { children?: ReactNode; - settingsPermission?: SettingsFeatures; + settingsPermission?: SettingsPermissions; requiredFeatureFlag?: FeatureFlagKey; }; diff --git a/packages/twenty-front/src/modules/settings/hooks/__tests__/useSettingsNavigationItems.test.tsx b/packages/twenty-front/src/modules/settings/hooks/__tests__/useSettingsNavigationItems.test.tsx index 82a99aba2..cd19fcc0f 100644 --- a/packages/twenty-front/src/modules/settings/hooks/__tests__/useSettingsNavigationItems.test.tsx +++ b/packages/twenty-front/src/modules/settings/hooks/__tests__/useSettingsNavigationItems.test.tsx @@ -4,7 +4,7 @@ import { renderHook } from '@testing-library/react'; import { ReactNode } from 'react'; import { MemoryRouter } from 'react-router-dom'; import { MutableSnapshot, RecoilRoot } from 'recoil'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { Billing, FeatureFlagKey, OnboardingStatus } from '~/generated/graphql'; import { currentUserState } from '@/auth/states/currentUserState'; @@ -56,12 +56,12 @@ jest.mock('@/workspace/hooks/useFeatureFlagsMap', () => ({ describe('useSettingsNavigationItems', () => { it('should hide workspace settings when no permissions', () => { (useSettingsPermissionMap as jest.Mock).mockImplementation(() => ({ - [SettingsFeatures.WORKSPACE]: false, - [SettingsFeatures.WORKSPACE_USERS]: false, - [SettingsFeatures.DATA_MODEL]: false, - [SettingsFeatures.API_KEYS_AND_WEBHOOKS]: false, - [SettingsFeatures.ROLES]: false, - [SettingsFeatures.SECURITY]: false, + [SettingsPermissions.WORKSPACE]: false, + [SettingsPermissions.WORKSPACE_USERS]: false, + [SettingsPermissions.DATA_MODEL]: false, + [SettingsPermissions.API_KEYS_AND_WEBHOOKS]: false, + [SettingsPermissions.ROLES]: false, + [SettingsPermissions.SECURITY]: false, })); const { result } = renderHook(() => useSettingsNavigationItems(), { @@ -77,12 +77,12 @@ describe('useSettingsNavigationItems', () => { it('should show workspace settings when has permissions', () => { (useSettingsPermissionMap as jest.Mock).mockImplementation(() => ({ - [SettingsFeatures.WORKSPACE]: true, - [SettingsFeatures.WORKSPACE_USERS]: true, - [SettingsFeatures.DATA_MODEL]: true, - [SettingsFeatures.API_KEYS_AND_WEBHOOKS]: true, - [SettingsFeatures.ROLES]: true, - [SettingsFeatures.SECURITY]: true, + [SettingsPermissions.WORKSPACE]: true, + [SettingsPermissions.WORKSPACE_USERS]: true, + [SettingsPermissions.DATA_MODEL]: true, + [SettingsPermissions.API_KEYS_AND_WEBHOOKS]: true, + [SettingsPermissions.ROLES]: true, + [SettingsPermissions.SECURITY]: true, })); const { result } = renderHook(() => useSettingsNavigationItems(), { diff --git a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx index 726885555..8b08879a0 100644 --- a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx +++ b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx @@ -20,7 +20,7 @@ import { } from 'twenty-ui'; import { SettingsPath } from '@/types/SettingsPath'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { FeatureFlagKey } from '~/generated-metadata/graphql'; import { currentUserState } from '@/auth/states/currentUserState'; @@ -105,20 +105,20 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => { label: t`General`, path: SettingsPath.Workspace, Icon: IconSettings, - isHidden: !permissionMap[SettingsFeatures.WORKSPACE], + isHidden: !permissionMap[SettingsPermissions.WORKSPACE], }, { label: t`Members`, path: SettingsPath.WorkspaceMembersPage, Icon: IconUsers, - isHidden: !permissionMap[SettingsFeatures.WORKSPACE_USERS], + isHidden: !permissionMap[SettingsPermissions.WORKSPACE_USERS], }, { label: t`Billing`, path: SettingsPath.Billing, Icon: IconCurrencyDollar, isHidden: - !isBillingEnabled || !permissionMap[SettingsFeatures.WORKSPACE], + !isBillingEnabled || !permissionMap[SettingsPermissions.WORKSPACE], }, { label: t`Roles`, @@ -126,26 +126,26 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => { Icon: IconLock, isHidden: !featureFlags[FeatureFlagKey.IsPermissionsEnabled] || - !permissionMap[SettingsFeatures.ROLES], + !permissionMap[SettingsPermissions.ROLES], }, { label: t`Data model`, path: SettingsPath.Objects, Icon: IconHierarchy2, - isHidden: !permissionMap[SettingsFeatures.DATA_MODEL], + isHidden: !permissionMap[SettingsPermissions.DATA_MODEL], }, { label: t`Integrations`, path: SettingsPath.Integrations, Icon: IconApps, - isHidden: !permissionMap[SettingsFeatures.API_KEYS_AND_WEBHOOKS], + isHidden: !permissionMap[SettingsPermissions.API_KEYS_AND_WEBHOOKS], }, { label: t`Security`, path: SettingsPath.Security, Icon: IconKey, isAdvanced: true, - isHidden: !permissionMap[SettingsFeatures.SECURITY], + isHidden: !permissionMap[SettingsPermissions.SECURITY], }, ], }, @@ -158,7 +158,7 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => { path: SettingsPath.Developers, Icon: IconCode, isAdvanced: true, - isHidden: !permissionMap[SettingsFeatures.API_KEYS_AND_WEBHOOKS], + isHidden: !permissionMap[SettingsPermissions.API_KEYS_AND_WEBHOOKS], }, { label: t`Functions`, @@ -184,7 +184,7 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => { Icon: IconFlask, isHidden: !labPublicFeatureFlags.length || - !permissionMap[SettingsFeatures.WORKSPACE], + !permissionMap[SettingsPermissions.WORKSPACE], }, { label: t`Releases`, diff --git a/packages/twenty-front/src/modules/settings/roles/hooks/useHasSettingsPermission.ts b/packages/twenty-front/src/modules/settings/roles/hooks/useHasSettingsPermission.ts index 222a8611f..e531ad039 100644 --- a/packages/twenty-front/src/modules/settings/roles/hooks/useHasSettingsPermission.ts +++ b/packages/twenty-front/src/modules/settings/roles/hooks/useHasSettingsPermission.ts @@ -1,9 +1,9 @@ import { currentUserWorkspaceState } from '@/auth/states/currentUserWorkspaceState'; import { useRecoilValue } from 'recoil'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; export const useHasSettingsPermission = ( - settingsPermission?: SettingsFeatures, + settingsPermission?: SettingsPermissions, ) => { const currentUserWorkspace = useRecoilValue(currentUserWorkspaceState); diff --git a/packages/twenty-front/src/modules/settings/roles/hooks/useSettingsPermissionMap.ts b/packages/twenty-front/src/modules/settings/roles/hooks/useSettingsPermissionMap.ts index f15851088..9222c5ba2 100644 --- a/packages/twenty-front/src/modules/settings/roles/hooks/useSettingsPermissionMap.ts +++ b/packages/twenty-front/src/modules/settings/roles/hooks/useSettingsPermissionMap.ts @@ -1,12 +1,12 @@ import { currentUserWorkspaceState } from '@/auth/states/currentUserWorkspaceState'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { useRecoilValue } from 'recoil'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { FeatureFlagKey } from '~/generated-metadata/graphql'; import { buildRecordFromKeysWithSameValue } from '~/utils/array/buildRecordFromKeysWithSameValue'; export const useSettingsPermissionMap = (): Record< - SettingsFeatures, + SettingsPermissions, boolean > => { const currentUserWorkspace = useRecoilValue(currentUserWorkspaceState); @@ -19,7 +19,7 @@ export const useSettingsPermissionMap = (): Record< currentUserWorkspace?.settingsPermissions; const initialPermissions = buildRecordFromKeysWithSameValue( - Object.values(SettingsFeatures), + Object.values(SettingsPermissions), !isPermissionEnabled, ); diff --git a/packages/twenty-front/src/pages/settings/roles/components/RolePermissions.tsx b/packages/twenty-front/src/pages/settings/roles/components/RolePermissions.tsx index 746256319..ddf270b4f 100644 --- a/packages/twenty-front/src/pages/settings/roles/components/RolePermissions.tsx +++ b/packages/twenty-front/src/pages/settings/roles/components/RolePermissions.tsx @@ -8,7 +8,7 @@ import { IconTrashX, Section, } from 'twenty-ui'; -import { Role, SettingsFeatures } from '~/generated-metadata/graphql'; +import { Role, SettingsPermissions } from '~/generated-metadata/graphql'; import { RolePermissionsObjectsTableHeader } from '~/pages/settings/roles/components/RolePermissionsObjectsTableHeader'; import { RolePermissionsSettingsTableHeader } from '~/pages/settings/roles/components/RolePermissionsSettingsTableHeader'; import { RolePermissionsSettingsTableRow } from '~/pages/settings/roles/components/RolePermissionsSettingsTableRow'; @@ -63,43 +63,43 @@ export const RolePermissions = ({ role }: RolePermissionsProps) => { const settingsPermissionsConfig = [ { - key: SettingsFeatures.API_KEYS_AND_WEBHOOKS, + key: SettingsPermissions.API_KEYS_AND_WEBHOOKS, label: 'API Keys and Webhooks', type: 'Developer', value: role.canUpdateAllSettings, }, { - key: SettingsFeatures.ROLES, + key: SettingsPermissions.ROLES, label: 'Roles', type: 'Members', value: role.canUpdateAllSettings, }, { - key: SettingsFeatures.WORKSPACE, + key: SettingsPermissions.WORKSPACE, label: 'Workspace Settings', type: 'General', value: role.canUpdateAllSettings, }, { - key: SettingsFeatures.WORKSPACE_USERS, + key: SettingsPermissions.WORKSPACE_USERS, label: 'Workspace Users', type: 'Members', value: role.canUpdateAllSettings, }, { - key: SettingsFeatures.DATA_MODEL, + key: SettingsPermissions.DATA_MODEL, label: 'Data Model', type: 'Data Model', value: role.canUpdateAllSettings, }, { - key: SettingsFeatures.ADMIN_PANEL, + key: SettingsPermissions.ADMIN_PANEL, label: 'Admin Panel', type: 'Admin Panel', value: role.canUpdateAllSettings, }, { - key: SettingsFeatures.SECURITY, + key: SettingsPermissions.SECURITY, label: 'Security Settings', type: 'Security', value: role.canUpdateAllSettings, diff --git a/packages/twenty-front/src/testing/mock-data/users.ts b/packages/twenty-front/src/testing/mock-data/users.ts index b279adec7..49487b37a 100644 --- a/packages/twenty-front/src/testing/mock-data/users.ts +++ b/packages/twenty-front/src/testing/mock-data/users.ts @@ -3,7 +3,7 @@ import { WorkspaceMember } from '@/workspace-member/types/WorkspaceMember'; import { FeatureFlagKey, OnboardingStatus, - SettingsFeatures, + SettingsPermissions, SubscriptionInterval, SubscriptionStatus, User, @@ -129,7 +129,7 @@ export const mockedUserData: MockedUser = { workspaceMember: mockedWorkspaceMemberData, currentWorkspace: mockCurrentWorkspace, currentUserWorkspace: { - settingsPermissions: [SettingsFeatures.WORKSPACE_USERS], + settingsPermissions: [SettingsPermissions.WORKSPACE_USERS], }, locale: 'en', workspaces: [{ workspace: mockCurrentWorkspace }], diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/constants/system-objects-permissions-requirements.constant.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/constants/system-objects-permissions-requirements.constant.ts index 8833cee77..bc49b6532 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/constants/system-objects-permissions-requirements.constant.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/constants/system-objects-permissions-requirements.constant.ts @@ -1,6 +1,6 @@ -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; export const SYSTEM_OBJECTS_PERMISSIONS_REQUIREMENTS = { - apiKey: SettingsFeatures.API_KEYS_AND_WEBHOOKS, - webhook: SettingsFeatures.API_KEYS_AND_WEBHOOKS, + apiKey: SettingsPermissions.API_KEYS_AND_WEBHOOKS, + webhook: SettingsPermissions.API_KEYS_AND_WEBHOOKS, } as const; diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service.ts index 47e3f1bbe..14f9c73ff 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service.ts @@ -5,7 +5,7 @@ import { capitalize, isObjectRecordUnderObjectRecordsPermissions, PermissionsOnAllObjectRecords, - SettingsFeatures, + SettingsPermissions, } from 'twenty-shared'; import { DataSource, ObjectLiteral } from 'typeorm'; @@ -208,7 +208,7 @@ export abstract class GraphqlQueryBaseResolverService< ); } - const permissionRequired: SettingsFeatures = + const permissionRequired: SettingsPermissions = SYSTEM_OBJECTS_PERMISSIONS_REQUIREMENTS[ objectMetadataItemWithFieldMaps.nameSingular ]; diff --git a/packages/twenty-server/src/engine/core-modules/auth/auth.resolver.ts b/packages/twenty-server/src/engine/core-modules/auth/auth.resolver.ts index 081ee2ffa..1803ebb07 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/auth.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/auth.resolver.ts @@ -2,7 +2,7 @@ import { UseFilters, UseGuards } from '@nestjs/common'; import { Args, Context, Mutation, Query, Resolver } from '@nestjs/graphql'; import { InjectRepository } from '@nestjs/typeorm'; -import { SettingsFeatures, SOURCE_LOCALE } from 'twenty-shared'; +import { SettingsPermissions, SOURCE_LOCALE } from 'twenty-shared'; import { Repository } from 'typeorm'; import omit from 'lodash.omit'; @@ -342,7 +342,7 @@ export class AuthResolver { @UseGuards( WorkspaceAuthGuard, - SettingsPermissionsGuard(SettingsFeatures.API_KEYS_AND_WEBHOOKS), + SettingsPermissionsGuard(SettingsPermissions.API_KEYS_AND_WEBHOOKS), ) @Mutation(() => ApiKeyToken) async generateApiKeyToken( diff --git a/packages/twenty-server/src/engine/core-modules/billing/billing.resolver.ts b/packages/twenty-server/src/engine/core-modules/billing/billing.resolver.ts index ada797d43..eaba30e55 100644 --- a/packages/twenty-server/src/engine/core-modules/billing/billing.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/billing/billing.resolver.ts @@ -4,7 +4,7 @@ import { UseFilters, UseGuards } from '@nestjs/common'; import { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; import { GraphQLError } from 'graphql'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { BillingCheckoutSessionInput } from 'src/engine/core-modules/billing/dtos/inputs/billing-checkout-session.input'; import { BillingProductInput } from 'src/engine/core-modules/billing/dtos/inputs/billing-product.input'; @@ -71,7 +71,7 @@ export class BillingResolver { @Query(() => BillingSessionOutput) @UseGuards( WorkspaceAuthGuard, - SettingsPermissionsGuard(SettingsFeatures.WORKSPACE), + SettingsPermissionsGuard(SettingsPermissions.WORKSPACE), ) async billingPortalSession( @AuthWorkspace() workspace: Workspace, @@ -158,7 +158,7 @@ export class BillingResolver { @Mutation(() => BillingUpdateOutput) @UseGuards( WorkspaceAuthGuard, - SettingsPermissionsGuard(SettingsFeatures.WORKSPACE), + SettingsPermissionsGuard(SettingsPermissions.WORKSPACE), ) async updateBillingSubscription(@AuthWorkspace() workspace: Workspace) { await this.billingSubscriptionService.applyBillingSubscription(workspace); @@ -202,7 +202,7 @@ export class BillingResolver { await this.permissionsService.userHasWorkspaceSettingPermission({ userWorkspaceId, workspaceId, - _setting: SettingsFeatures.WORKSPACE, + _setting: SettingsPermissions.WORKSPACE, }); if (!userHasPermission) { diff --git a/packages/twenty-server/src/engine/core-modules/lab/lab.resolver.ts b/packages/twenty-server/src/engine/core-modules/lab/lab.resolver.ts index 45c1ced71..698b84f6d 100644 --- a/packages/twenty-server/src/engine/core-modules/lab/lab.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/lab/lab.resolver.ts @@ -1,7 +1,7 @@ import { UseFilters, UseGuards } from '@nestjs/common'; import { Args, Mutation, Resolver } from '@nestjs/graphql'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { AuthGraphqlApiExceptionFilter } from 'src/engine/core-modules/auth/filters/auth-graphql-api-exception.filter'; import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; @@ -15,7 +15,7 @@ import { PermissionsGraphqlApiExceptionFilter } from 'src/engine/metadata-module @Resolver() @UseFilters(AuthGraphqlApiExceptionFilter, PermissionsGraphqlApiExceptionFilter) -@UseGuards(SettingsPermissionsGuard(SettingsFeatures.WORKSPACE)) +@UseGuards(SettingsPermissionsGuard(SettingsPermissions.WORKSPACE)) export class LabResolver { constructor(private labService: LabService) {} diff --git a/packages/twenty-server/src/engine/core-modules/sso/sso.resolver.ts b/packages/twenty-server/src/engine/core-modules/sso/sso.resolver.ts index 975b92b30..fa955703e 100644 --- a/packages/twenty-server/src/engine/core-modules/sso/sso.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/sso/sso.resolver.ts @@ -3,7 +3,7 @@ import { UseFilters, UseGuards } from '@nestjs/common'; import { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { EnterpriseFeaturesEnabledGuard } from 'src/engine/core-modules/auth/guards/enterprise-features-enabled.guard'; import { DeleteSsoInput } from 'src/engine/core-modules/sso/dtos/delete-sso.input'; @@ -26,7 +26,7 @@ import { PermissionsGraphqlApiExceptionFilter } from 'src/engine/metadata-module @Resolver() @UseFilters(PermissionsGraphqlApiExceptionFilter) -@UseGuards(SettingsPermissionsGuard(SettingsFeatures.SECURITY)) +@UseGuards(SettingsPermissionsGuard(SettingsPermissions.SECURITY)) export class SSOResolver { constructor(private readonly sSOService: SSOService) {} diff --git a/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.entity.ts b/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.entity.ts index 6872f4c5d..94222b4b5 100644 --- a/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.entity.ts @@ -1,7 +1,10 @@ import { Field, ObjectType, registerEnumType } from '@nestjs/graphql'; import { IDField } from '@ptc-org/nestjs-query-graphql'; -import { PermissionsOnAllObjectRecords, SettingsFeatures } from 'twenty-shared'; +import { + PermissionsOnAllObjectRecords, + SettingsPermissions, +} from 'twenty-shared'; import { Column, CreateDateColumn, @@ -21,8 +24,8 @@ import { TwoFactorMethod } from 'src/engine/core-modules/two-factor-method/two-f import { User } from 'src/engine/core-modules/user/user.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -registerEnumType(SettingsFeatures, { - name: 'SettingsFeatures', +registerEnumType(SettingsPermissions, { + name: 'SettingsPermissions', }); registerEnumType(PermissionsOnAllObjectRecords, { @@ -77,8 +80,8 @@ export class UserWorkspace { ) twoFactorMethods: Relation; - @Field(() => [SettingsFeatures], { nullable: true }) - settingsPermissions?: SettingsFeatures[]; + @Field(() => [SettingsPermissions], { nullable: true }) + settingsPermissions?: SettingsPermissions[]; @Field(() => [PermissionsOnAllObjectRecords], { nullable: true }) objectRecordsPermissions?: PermissionsOnAllObjectRecords[]; diff --git a/packages/twenty-server/src/engine/core-modules/user/user.resolver.ts b/packages/twenty-server/src/engine/core-modules/user/user.resolver.ts index 037bb2853..36d63dd76 100644 --- a/packages/twenty-server/src/engine/core-modules/user/user.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/user/user.resolver.ts @@ -13,7 +13,10 @@ import crypto from 'crypto'; import { GraphQLJSONObject } from 'graphql-type-json'; import { FileUpload, GraphQLUpload } from 'graphql-upload'; -import { PermissionsOnAllObjectRecords, SettingsFeatures } from 'twenty-shared'; +import { + PermissionsOnAllObjectRecords, + SettingsPermissions, +} from 'twenty-shared'; import { In, Repository } from 'typeorm'; import { SupportDriver } from 'src/engine/core-modules/environment/interfaces/support.interface'; @@ -119,17 +122,17 @@ export class UserResolver { workspaceId: workspace.id, }); - const permittedFeatures: SettingsFeatures[] = ( - Object.keys(settingsPermissions) as SettingsFeatures[] + const grantedSettingsPermissions: SettingsPermissions[] = ( + Object.keys(settingsPermissions) as SettingsPermissions[] ).filter((feature) => settingsPermissions[feature] === true); - const permittedObjectRecordsPermissions = ( + const grantedObjectRecordsPermissions = ( Object.keys(objectRecordsPermissions) as PermissionsOnAllObjectRecords[] ).filter((permission) => objectRecordsPermissions[permission] === true); - currentUserWorkspace.settingsPermissions = permittedFeatures; + currentUserWorkspace.settingsPermissions = grantedSettingsPermissions; currentUserWorkspace.objectRecordsPermissions = - permittedObjectRecordsPermissions; + grantedObjectRecordsPermissions; user.currentUserWorkspace = currentUserWorkspace; } diff --git a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts index 2fc40f9f3..283e1761e 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/services/workspace.service.ts @@ -6,7 +6,7 @@ import assert from 'assert'; import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm'; import { isDefined, - SettingsFeatures, + SettingsPermissions, WorkspaceActivationStatus, } from 'twenty-shared'; import { Repository } from 'typeorm'; @@ -416,7 +416,7 @@ export class WorkspaceService extends TypeOrmQueryService { const userHasPermission = await this.permissionsService.userHasWorkspaceSettingPermission({ userWorkspaceId, - _setting: SettingsFeatures.SECURITY, + _setting: SettingsPermissions.SECURITY, workspaceId: workspaceId, }); @@ -452,7 +452,7 @@ export class WorkspaceService extends TypeOrmQueryService { await this.permissionsService.userHasWorkspaceSettingPermission({ userWorkspaceId, workspaceId, - _setting: SettingsFeatures.WORKSPACE, + _setting: SettingsPermissions.WORKSPACE, }); if (!userHasPermission) { diff --git a/packages/twenty-server/src/engine/core-modules/workspace/workspace.resolver.ts b/packages/twenty-server/src/engine/core-modules/workspace/workspace.resolver.ts index b616d7324..b49818d95 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/workspace.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/workspace.resolver.ts @@ -12,7 +12,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import assert from 'assert'; import { FileUpload, GraphQLUpload } from 'graphql-upload'; -import { isDefined, SettingsFeatures } from 'twenty-shared'; +import { isDefined, SettingsPermissions } from 'twenty-shared'; import { Repository } from 'typeorm'; import { FileFolder } from 'src/engine/core-modules/file/interfaces/file-folder.interface'; @@ -123,7 +123,7 @@ export class WorkspaceResolver { @Mutation(() => String) @UseGuards( WorkspaceAuthGuard, - SettingsPermissionsGuard(SettingsFeatures.WORKSPACE), + SettingsPermissionsGuard(SettingsPermissions.WORKSPACE), ) async uploadWorkspaceLogo( @AuthWorkspace() { id }: Workspace, @@ -167,7 +167,7 @@ export class WorkspaceResolver { @Mutation(() => Workspace) @UseGuards( WorkspaceAuthGuard, - SettingsPermissionsGuard(SettingsFeatures.WORKSPACE), + SettingsPermissionsGuard(SettingsPermissions.WORKSPACE), ) async deleteCurrentWorkspace(@AuthWorkspace() { id }: Workspace) { return this.workspaceService.deleteWorkspace(id); diff --git a/packages/twenty-server/src/engine/guards/settings-permissions.guard.ts b/packages/twenty-server/src/engine/guards/settings-permissions.guard.ts index 01251682e..f83e1bd73 100644 --- a/packages/twenty-server/src/engine/guards/settings-permissions.guard.ts +++ b/packages/twenty-server/src/engine/guards/settings-permissions.guard.ts @@ -7,7 +7,7 @@ import { } from '@nestjs/common'; import { GqlExecutionContext } from '@nestjs/graphql'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; 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'; @@ -19,7 +19,7 @@ import { import { PermissionsService } from 'src/engine/metadata-modules/permissions/permissions.service'; export const SettingsPermissionsGuard = ( - requiredPermission: SettingsFeatures, + requiredPermission: SettingsPermissions, ): Type => { @Injectable() class SettingsPermissionsMixin implements CanActivate { diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts index 43441176c..225ea1752 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts @@ -13,7 +13,7 @@ import { Resolver, } from '@nestjs/graphql'; -import { FieldMetadataType, SettingsFeatures } from 'twenty-shared'; +import { FieldMetadataType, SettingsPermissions } from 'twenty-shared'; 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'; @@ -72,7 +72,7 @@ export class FieldMetadataResolver { ); } - @UseGuards(SettingsPermissionsGuard(SettingsFeatures.DATA_MODEL)) + @UseGuards(SettingsPermissionsGuard(SettingsPermissions.DATA_MODEL)) @Mutation(() => FieldMetadataDTO) async createOneField( @Args('input') input: CreateOneFieldMetadataInput, @@ -88,7 +88,7 @@ export class FieldMetadataResolver { } } - @UseGuards(SettingsPermissionsGuard(SettingsFeatures.DATA_MODEL)) + @UseGuards(SettingsPermissionsGuard(SettingsPermissions.DATA_MODEL)) @Mutation(() => FieldMetadataDTO) async updateOneField( @Args('input') input: UpdateOneFieldMetadataInput, @@ -104,7 +104,7 @@ export class FieldMetadataResolver { } } - @UseGuards(SettingsPermissionsGuard(SettingsFeatures.DATA_MODEL)) + @UseGuards(SettingsPermissionsGuard(SettingsPermissions.DATA_MODEL)) @Mutation(() => FieldMetadataDTO) async deleteOneField( @Args('input') input: DeleteOneFieldInput, diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.module.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.module.ts index cebe7bd9e..1397c4e6b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.module.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.module.ts @@ -7,7 +7,7 @@ import { PagingStrategies, } from '@ptc-org/nestjs-query-graphql'; import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { TypeORMModule } from 'src/database/typeorm/typeorm.module'; import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; @@ -78,7 +78,7 @@ import { UpdateObjectPayload } from './dtos/update-object.input'; }, create: { many: { disabled: true }, - guards: [SettingsPermissionsGuard(SettingsFeatures.DATA_MODEL)], + guards: [SettingsPermissionsGuard(SettingsPermissions.DATA_MODEL)], }, update: { disabled: true }, delete: { disabled: true }, diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts index 7b4f11b2d..575e5f716 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts @@ -8,7 +8,7 @@ import { Resolver, } from '@nestjs/graphql'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { I18nContext } from 'src/engine/core-modules/i18n/types/i18n-context.type'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; @@ -73,7 +73,7 @@ export class ObjectMetadataResolver { ); } - @UseGuards(SettingsPermissionsGuard(SettingsFeatures.DATA_MODEL)) + @UseGuards(SettingsPermissionsGuard(SettingsPermissions.DATA_MODEL)) @Mutation(() => ObjectMetadataDTO) async deleteOneObject( @Args('input') input: DeleteOneObjectInput, @@ -89,7 +89,7 @@ export class ObjectMetadataResolver { } } - @UseGuards(SettingsPermissionsGuard(SettingsFeatures.DATA_MODEL)) + @UseGuards(SettingsPermissionsGuard(SettingsPermissions.DATA_MODEL)) @Mutation(() => ObjectMetadataDTO) async updateOneObject( @Args('input') input: UpdateOneObjectInput, diff --git a/packages/twenty-server/src/engine/metadata-modules/permissions/permissions.service.ts b/packages/twenty-server/src/engine/metadata-modules/permissions/permissions.service.ts index cb508a70c..f0f860de6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/permissions/permissions.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/permissions/permissions.service.ts @@ -1,6 +1,9 @@ import { Injectable } from '@nestjs/common'; -import { PermissionsOnAllObjectRecords, SettingsFeatures } from 'twenty-shared'; +import { + PermissionsOnAllObjectRecords, + SettingsPermissions, +} from 'twenty-shared'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { @@ -25,7 +28,7 @@ export class PermissionsService { userWorkspaceId: string; workspaceId: string; }): Promise<{ - settingsPermissions: Record; + settingsPermissions: Record; objectRecordsPermissions: Record; }> { const [roleOfUserWorkspace] = await this.userRoleService @@ -41,12 +44,12 @@ export class PermissionsService { hasPermissionOnSettingFeature = true; } - const settingsPermissionsMap = Object.keys(SettingsFeatures).reduce( + const settingsPermissionsMap = Object.keys(SettingsPermissions).reduce( (acc, feature) => ({ ...acc, [feature]: hasPermissionOnSettingFeature, }), - {} as Record, + {} as Record, ); const objectRecordsPermissionsMap: Record< @@ -76,7 +79,7 @@ export class PermissionsService { }: { userWorkspaceId: string; workspaceId: string; - _setting: SettingsFeatures; + _setting: SettingsPermissions; }): Promise { const [roleOfUserWorkspace] = await this.userRoleService .getRolesByUserWorkspaces({ diff --git a/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.module.ts b/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.module.ts index 4afcca605..7024cc642 100644 --- a/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.module.ts +++ b/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.module.ts @@ -5,7 +5,7 @@ import { PagingStrategies, } from '@ptc-org/nestjs-query-graphql'; import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; import { SettingsPermissionsGuard } from 'src/engine/guards/settings-permissions.guard'; @@ -57,7 +57,7 @@ import { RelationMetadataDTO } from './dtos/relation-metadata.dto'; pagingStrategy: PagingStrategies.CURSOR, create: { many: { disabled: true }, - guards: [SettingsPermissionsGuard(SettingsFeatures.DATA_MODEL)], + guards: [SettingsPermissionsGuard(SettingsPermissions.DATA_MODEL)], }, update: { disabled: true }, delete: { disabled: true }, diff --git a/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.resolver.ts index 8d57dd55b..aa777aa72 100644 --- a/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/relation-metadata/relation-metadata.resolver.ts @@ -1,7 +1,7 @@ import { UseFilters, UseGuards } from '@nestjs/common'; import { Args, Mutation, Resolver } from '@nestjs/graphql'; -import { SettingsFeatures } from 'twenty-shared'; +import { SettingsPermissions } from 'twenty-shared'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; @@ -21,7 +21,7 @@ export class RelationMetadataResolver { private readonly relationMetadataService: RelationMetadataService, ) {} - @UseGuards(SettingsPermissionsGuard(SettingsFeatures.DATA_MODEL)) + @UseGuards(SettingsPermissionsGuard(SettingsPermissions.DATA_MODEL)) @Mutation(() => RelationMetadataDTO) async deleteOneRelation( @Args('input') input: DeleteOneRelationInput, diff --git a/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts index a766817d8..686853c63 100644 --- a/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/role/role.resolver.ts @@ -8,7 +8,7 @@ import { Resolver, } from '@nestjs/graphql'; -import { isDefined, SettingsFeatures } from 'twenty-shared'; +import { isDefined, SettingsPermissions } from 'twenty-shared'; import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service'; import { WorkspaceMember } from 'src/engine/core-modules/user/dtos/workspace-member.dto'; @@ -22,7 +22,7 @@ import { UserRoleService } from 'src/engine/metadata-modules/user-role/user-role import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; @Resolver(() => RoleDTO) -@UseGuards(SettingsPermissionsGuard(SettingsFeatures.ROLES)) +@UseGuards(SettingsPermissionsGuard(SettingsPermissions.ROLES)) @UseFilters(PermissionsGraphqlApiExceptionFilter) export class RoleResolver { constructor( diff --git a/packages/twenty-shared/src/constants/SettingsFeatures.ts b/packages/twenty-shared/src/constants/SettingsPermissions.ts similarity index 86% rename from packages/twenty-shared/src/constants/SettingsFeatures.ts rename to packages/twenty-shared/src/constants/SettingsPermissions.ts index ebb31874f..23e33e485 100644 --- a/packages/twenty-shared/src/constants/SettingsFeatures.ts +++ b/packages/twenty-shared/src/constants/SettingsPermissions.ts @@ -1,4 +1,4 @@ -export enum SettingsFeatures { +export enum SettingsPermissions { API_KEYS_AND_WEBHOOKS = 'API_KEYS_AND_WEBHOOKS', WORKSPACE = 'WORKSPACE', WORKSPACE_USERS = 'WORKSPACE_USERS', diff --git a/packages/twenty-shared/src/constants/index.ts b/packages/twenty-shared/src/constants/index.ts index 766e0a2e0..e35128125 100644 --- a/packages/twenty-shared/src/constants/index.ts +++ b/packages/twenty-shared/src/constants/index.ts @@ -1,6 +1,7 @@ export * from './FieldForTotalCountAggregateOperation'; export * from './PermissionsOnAllObjectRecords'; -export * from './SettingsFeatures'; +export * from './SettingsPermissions'; export * from './StandardObjectRecordsUnderObjectRecordsPermissions'; export * from './TwentyCompaniesBaseUrl'; export * from './TwentyIconsBaseUrl'; +