Skip to content

Commit 4c94fc2

Browse files
authored
[permissions V2] Remove feature flag (#12790)
1 parent b6787c6 commit 4c94fc2

File tree

22 files changed

+103
-411
lines changed

22 files changed

+103
-411
lines changed

packages/twenty-front/src/generated-metadata/graphql.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,6 @@ export enum FeatureFlagKey {
691691
IS_AIRTABLE_INTEGRATION_ENABLED = 'IS_AIRTABLE_INTEGRATION_ENABLED',
692692
IS_AI_ENABLED = 'IS_AI_ENABLED',
693693
IS_JSON_FILTER_ENABLED = 'IS_JSON_FILTER_ENABLED',
694-
IS_PERMISSIONS_V2_ENABLED = 'IS_PERMISSIONS_V2_ENABLED',
695694
IS_POSTGRESQL_INTEGRATION_ENABLED = 'IS_POSTGRESQL_INTEGRATION_ENABLED',
696695
IS_STRIPE_INTEGRATION_ENABLED = 'IS_STRIPE_INTEGRATION_ENABLED',
697696
IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED'

packages/twenty-front/src/generated/graphql.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,6 @@ export enum FeatureFlagKey {
647647
IS_AIRTABLE_INTEGRATION_ENABLED = 'IS_AIRTABLE_INTEGRATION_ENABLED',
648648
IS_AI_ENABLED = 'IS_AI_ENABLED',
649649
IS_JSON_FILTER_ENABLED = 'IS_JSON_FILTER_ENABLED',
650-
IS_PERMISSIONS_V2_ENABLED = 'IS_PERMISSIONS_V2_ENABLED',
651650
IS_POSTGRESQL_INTEGRATION_ENABLED = 'IS_POSTGRESQL_INTEGRATION_ENABLED',
652651
IS_STRIPE_INTEGRATION_ENABLED = 'IS_STRIPE_INTEGRATION_ENABLED',
653652
IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED'

packages/twenty-front/src/modules/settings/roles/components/SettingsRolesList.tsx

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@ import { SettingsRolesTableRow } from '@/settings/roles/components/SettingsRoles
77
import { settingsAllRolesSelector } from '@/settings/roles/states/settingsAllRolesSelector';
88
import { SettingsPath } from '@/types/SettingsPath';
99
import { TableCell } from '@/ui/layout/table/components/TableCell';
10-
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
1110
import { useRecoilValue } from 'recoil';
1211
import { H2Title, IconPlus } from 'twenty-ui/display';
1312
import { Button } from 'twenty-ui/input';
1413
import { Section } from 'twenty-ui/layout';
15-
import { FeatureFlagKey } from '~/generated/graphql';
1614
import { useNavigateSettings } from '~/hooks/useNavigateSettings';
1715
import { sortByAscString } from '~/utils/array/sortByAscString';
1816

@@ -35,9 +33,6 @@ const StyledNoRoles = styled(TableCell)`
3533

3634
export const SettingsRolesList = () => {
3735
const navigateSettings = useNavigateSettings();
38-
const isPermissionsV2Enabled = useIsFeatureEnabled(
39-
FeatureFlagKey.IS_PERMISSIONS_V2_ENABLED,
40-
);
4136

4237
const settingsAllRoles = useRecoilValue(settingsAllRolesSelector);
4338

@@ -69,8 +64,6 @@ export const SettingsRolesList = () => {
6964
title={t`Create Role`}
7065
variant="secondary"
7166
size="small"
72-
soon={!isPermissionsV2Enabled}
73-
disabled={!isPermissionsV2Enabled}
7467
onClick={() => navigateSettings(SettingsPath.RoleCreate)}
7568
/>
7669
</StyledCreateRoleSection>

packages/twenty-front/src/modules/settings/roles/role-permissions/components/SettingsRolePermissions.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { SettingsRolePermissionsObjectLevelSection } from '@/settings/roles/role-permissions/object-level-permissions/components/SettingsRolePermissionsObjectLevelSection';
22
import { SettingsRolePermissionsObjectsSection } from '@/settings/roles/role-permissions/objects-permissions/components/SettingsRolePermissionsObjectsSection';
33
import { SettingsRolePermissionsSettingsSection } from '@/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection';
4-
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
54
import styled from '@emotion/styled';
6-
import { FeatureFlagKey } from '~/generated-metadata/graphql';
75

86
const StyledRolePermissionsContainer = styled.div`
97
display: flex;
@@ -22,17 +20,13 @@ export const SettingsRolePermissions = ({
2220
isEditable,
2321
isCreateMode,
2422
}: SettingsRolePermissionsProps) => {
25-
const isPermissionsV2Enabled = useIsFeatureEnabled(
26-
FeatureFlagKey.IS_PERMISSIONS_V2_ENABLED,
27-
);
28-
2923
return (
3024
<StyledRolePermissionsContainer>
3125
<SettingsRolePermissionsObjectsSection
3226
roleId={roleId}
3327
isEditable={isEditable}
3428
/>
35-
{isPermissionsV2Enabled && !isCreateMode && (
29+
{!isCreateMode && (
3630
<SettingsRolePermissionsObjectLevelSection
3731
roleId={roleId}
3832
isEditable={isEditable}

packages/twenty-front/src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsSection.tsx

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { SettingsRolePermissionsSettingsTableHeader } from '@/settings/roles/rol
33
import { SettingsRolePermissionsSettingsTableRow } from '@/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsTableRow';
44
import { SettingsRolePermissionsSettingPermission } from '@/settings/roles/role-permissions/settings-permissions/types/SettingsRolePermissionsSettingPermission';
55
import { settingsDraftRoleFamilyState } from '@/settings/roles/states/settingsDraftRoleFamilyState';
6-
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
76
import styled from '@emotion/styled';
87
import { t } from '@lingui/core/macro';
98
import { useRecoilState } from 'recoil';
@@ -18,10 +17,7 @@ import {
1817
IconUsers,
1918
} from 'twenty-ui/display';
2019
import { AnimatedExpandableContainer, Card, Section } from 'twenty-ui/layout';
21-
import {
22-
FeatureFlagKey,
23-
SettingPermissionType,
24-
} from '~/generated-metadata/graphql';
20+
import { SettingPermissionType } from '~/generated-metadata/graphql';
2521

2622
const StyledTable = styled.div`
2723
border-bottom: 1px solid ${({ theme }) => theme.border.color.light};
@@ -45,10 +41,6 @@ export const SettingsRolePermissionsSettingsSection = ({
4541
roleId,
4642
isEditable,
4743
}: SettingsRolePermissionsSettingsSectionProps) => {
48-
const isPermissionsV2Enabled = useIsFeatureEnabled(
49-
FeatureFlagKey.IS_PERMISSIONS_V2_ENABLED,
50-
);
51-
5244
const [settingsDraftRole, setSettingsDraftRole] = useRecoilState(
5345
settingsDraftRoleFamilyState(roleId),
5446
);
@@ -102,23 +94,21 @@ export const SettingsRolePermissionsSettingsSection = ({
10294
return (
10395
<Section>
10496
<H2Title title={t`Settings`} description={t`Settings permissions`} />
105-
{isPermissionsV2Enabled && (
106-
<StyledCard rounded>
107-
<SettingsOptionCardContentToggle
108-
Icon={IconSettings}
109-
title={t`Settings All Access`}
110-
description={t`Ability to edit all settings`}
111-
checked={settingsDraftRole.canUpdateAllSettings}
112-
disabled={!isEditable}
113-
onChange={() => {
114-
setSettingsDraftRole({
115-
...settingsDraftRole,
116-
canUpdateAllSettings: !settingsDraftRole.canUpdateAllSettings,
117-
});
118-
}}
119-
/>
120-
</StyledCard>
121-
)}
97+
<StyledCard rounded>
98+
<SettingsOptionCardContentToggle
99+
Icon={IconSettings}
100+
title={t`Settings All Access`}
101+
description={t`Ability to edit all settings`}
102+
checked={settingsDraftRole.canUpdateAllSettings}
103+
disabled={!isEditable}
104+
onChange={() => {
105+
setSettingsDraftRole({
106+
...settingsDraftRole,
107+
canUpdateAllSettings: !settingsDraftRole.canUpdateAllSettings,
108+
});
109+
}}
110+
/>
111+
</StyledCard>
122112
<AnimatedExpandableContainer
123113
isExpanded={!settingsDraftRole.canUpdateAllSettings}
124114
dimension="height"

packages/twenty-front/src/modules/settings/roles/role-permissions/settings-permissions/components/SettingsRolePermissionsSettingsTableRow.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@ import { SettingsRolePermissionsSettingPermission } from '@/settings/roles/role-
22
import { settingsDraftRoleFamilyState } from '@/settings/roles/states/settingsDraftRoleFamilyState';
33
import { TableCell } from '@/ui/layout/table/components/TableCell';
44
import { TableRow } from '@/ui/layout/table/components/TableRow';
5-
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
65
import { useTheme } from '@emotion/react';
76
import styled from '@emotion/styled';
87
import { useRecoilState } from 'recoil';
98
import { Checkbox } from 'twenty-ui/input';
109
import { v4 } from 'uuid';
11-
import { FeatureFlagKey } from '~/generated-metadata/graphql';
1210

1311
const StyledTableRow = styled(TableRow)<{ isDisabled: boolean }>`
1412
cursor: ${({ isDisabled }) => (isDisabled ? 'default' : 'pointer')};
@@ -57,9 +55,6 @@ export const SettingsRolePermissionsSettingsTableRow = ({
5755
const [settingsDraftRole, setSettingsDraftRole] = useRecoilState(
5856
settingsDraftRoleFamilyState(roleId),
5957
);
60-
const isPermissionsV2Enabled = useIsFeatureEnabled(
61-
FeatureFlagKey.IS_PERMISSIONS_V2_ENABLED,
62-
);
6358
const canUpdateAllSettings = settingsDraftRole.canUpdateAllSettings;
6459

6560
const isSettingPermissionEnabled =
@@ -68,8 +63,7 @@ export const SettingsRolePermissionsSettingsTableRow = ({
6863
) ?? false;
6964

7065
const isChecked = isSettingPermissionEnabled || canUpdateAllSettings;
71-
const isDisabled =
72-
!isEditable || canUpdateAllSettings || !isPermissionsV2Enabled;
66+
const isDisabled = !isEditable || canUpdateAllSettings;
7367

7468
const handleChange = (value: boolean) => {
7569
const currentPermissions = settingsDraftRole.settingPermissions ?? [];

packages/twenty-front/src/modules/settings/roles/role/components/SettingsRole.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,13 @@ import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBa
1818
import { TabList } from '@/ui/layout/tab-list/components/TabList';
1919
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
2020
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
21-
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
2221
import { getOperationName } from '@apollo/client/utilities';
2322
import { t } from '@lingui/core/macro';
2423
import { useRecoilState, useRecoilValue } from 'recoil';
2524
import { isDefined } from 'twenty-shared/utils';
2625
import { IconLockOpen, IconSettings, IconUserPlus } from 'twenty-ui/display';
2726
import { v4 } from 'uuid';
2827
import {
29-
FeatureFlagKey,
3028
Role,
3129
useCreateOneRoleMutation,
3230
useUpdateOneRoleMutation,
@@ -60,10 +58,6 @@ export const SettingsRole = ({ roleId, isCreateMode }: SettingsRoleProps) => {
6058
SETTINGS_ROLE_DETAIL_TABS.COMPONENT_INSTANCE_ID + '-' + roleId,
6159
);
6260

63-
const isPermissionsV2Enabled = useIsFeatureEnabled(
64-
FeatureFlagKey.IS_PERMISSIONS_V2_ENABLED,
65-
);
66-
6761
const navigateSettings = useNavigateSettings();
6862

6963
const [createRole] = useCreateOneRoleMutation();
@@ -91,7 +85,7 @@ export const SettingsRole = ({ roleId, isCreateMode }: SettingsRoleProps) => {
9185
return <></>;
9286
}
9387

94-
const isRoleEditable = isPermissionsV2Enabled && settingsDraftRole.isEditable;
88+
const isRoleEditable = settingsDraftRole.isEditable;
9589

9690
const tabs = [
9791
{

packages/twenty-server/src/engine/api/graphql/graphql-query-runner/interfaces/base-resolver-service.ts

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { workspaceQueryRunnerGraphqlApiExceptionHandler } from 'src/engine/api/g
2626
import { WorkspaceQueryHookService } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/workspace-query-hook.service';
2727
import { RESOLVER_METHOD_NAMES } from 'src/engine/api/graphql/workspace-resolver-builder/constants/resolver-method-names';
2828
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
29+
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
2930
import { SettingPermissionType } from 'src/engine/metadata-modules/permissions/constants/setting-permission-type.constants';
3031
import {
3132
PermissionsException,
@@ -37,7 +38,6 @@ import { UserRoleService } from 'src/engine/metadata-modules/user-role/user-role
3738
import { WorkspaceDataSource } from 'src/engine/twenty-orm/datasource/workspace.datasource';
3839
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
3940
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
40-
import { workspaceValidator } from 'src/engine/core-modules/workspace/workspace.validate';
4141

4242
export type GraphqlQueryResolverExecutionArgs<Input extends ResolverArgs> = {
4343
args: Input;
@@ -98,18 +98,8 @@ export abstract class GraphqlQueryBaseResolverService<
9898

9999
const featureFlagsMap = workspaceDataSource.featureFlagMap;
100100

101-
const isPermissionsV2Enabled =
102-
featureFlagsMap[FeatureFlagKey.IS_PERMISSIONS_V2_ENABLED];
103-
104101
if (objectMetadataItemWithFieldMaps.isSystem === true) {
105102
await this.validateSettingsPermissionsOnObjectOrThrow(options);
106-
} else {
107-
if (!isPermissionsV2Enabled)
108-
await this.validateObjectRecordPermissionsOrThrow({
109-
objectMetadataId: objectMetadataItemWithFieldMaps.id,
110-
operationName,
111-
options,
112-
});
113103
}
114104

115105
const hookedArgs =
@@ -228,39 +218,6 @@ export abstract class GraphqlQueryBaseResolverService<
228218
}
229219
}
230220

231-
private async validateObjectRecordPermissionsOrThrow({
232-
objectMetadataId,
233-
operationName,
234-
options,
235-
}: {
236-
objectMetadataId: string;
237-
operationName: WorkspaceResolverBuilderMethodNames;
238-
options: WorkspaceQueryRunnerOptions;
239-
}) {
240-
const requiredPermission =
241-
this.getRequiredPermissionForMethod(operationName);
242-
243-
const workspace = options.authContext.workspace;
244-
245-
workspaceValidator.assertIsDefinedOrThrow(workspace);
246-
247-
const userHasPermission =
248-
await this.permissionsService.userHasObjectRecordsPermission({
249-
userWorkspaceId: options.authContext.userWorkspaceId,
250-
requiredPermission,
251-
workspaceId: workspace.id,
252-
isExecutedByApiKey: isDefined(options.authContext.apiKey),
253-
objectMetadataId,
254-
});
255-
256-
if (!userHasPermission) {
257-
throw new PermissionsException(
258-
PermissionsExceptionMessage.PERMISSION_DENIED,
259-
PermissionsExceptionCode.PERMISSION_DENIED,
260-
);
261-
}
262-
}
263-
264221
private getRequiredPermissionForMethod(
265222
operationName: WorkspaceResolverBuilderMethodNames,
266223
) {

packages/twenty-server/src/engine/core-modules/feature-flag/enums/feature-flag-key.enum.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,5 @@ export enum FeatureFlagKey {
44
IS_STRIPE_INTEGRATION_ENABLED = 'IS_STRIPE_INTEGRATION_ENABLED',
55
IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED',
66
IS_JSON_FILTER_ENABLED = 'IS_JSON_FILTER_ENABLED',
7-
IS_PERMISSIONS_V2_ENABLED = 'IS_PERMISSIONS_V2_ENABLED',
87
IS_AI_ENABLED = 'IS_AI_ENABLED',
98
}

packages/twenty-server/src/engine/core-modules/feature-flag/services/feature-flag.service.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,6 @@ export class FeatureFlagService {
7373
},
7474
);
7575

76-
if (keys.includes(FeatureFlagKey.IS_PERMISSIONS_V2_ENABLED)) {
77-
await this.workspacePermissionsCacheService.recomputeRolesPermissionsCache(
78-
{ workspaceId, ignoreLock: true },
79-
);
80-
}
81-
8276
await this.workspaceFeatureFlagsMapCacheService.recomputeFeatureFlagsMapCache(
8377
{
8478
workspaceId,
@@ -144,12 +138,6 @@ export class FeatureFlagService {
144138
},
145139
);
146140

147-
if (featureFlag === FeatureFlagKey.IS_PERMISSIONS_V2_ENABLED) {
148-
await this.workspacePermissionsCacheService.recomputeRolesPermissionsCache(
149-
{ workspaceId, ignoreLock: true },
150-
);
151-
}
152-
153141
return result;
154142
}
155143
}

packages/twenty-server/src/engine/metadata-modules/permissions/permissions.module.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Module } from '@nestjs/common';
22
import { TypeOrmModule } from '@nestjs/typeorm';
33

4-
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
54
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
65
import { PermissionsService } from 'src/engine/metadata-modules/permissions/permissions.service';
76
import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity';
@@ -12,7 +11,6 @@ import { WorkspacePermissionsCacheModule } from 'src/engine/metadata-modules/wor
1211
@Module({
1312
imports: [
1413
TypeOrmModule.forFeature([RoleEntity, UserWorkspaceRoleEntity], 'core'),
15-
FeatureFlagModule,
1614
TypeOrmModule.forFeature([UserWorkspace], 'core'),
1715
UserRoleModule,
1816
WorkspacePermissionsCacheModule,

0 commit comments

Comments
 (0)