Skip to content

Commit 68ab1da

Browse files
committed
feat: restrictions for users without IsViewerAllowed role
1 parent d73717a commit 68ab1da

File tree

10 files changed

+73
-15
lines changed

10 files changed

+73
-15
lines changed

src/components/VDiskPopup/VDiskPopup.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ import {createVDiskDeveloperUILink} from '../../utils/developerUI/developerUI';
1313
import {isFullVDiskData} from '../../utils/disks/helpers';
1414
import type {PreparedVDisk, UnavailableDonor} from '../../utils/disks/types';
1515
import {useTypedSelector} from '../../utils/hooks';
16-
import {useIsUserAllowedToMakeChanges} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
16+
import {
17+
useIsUserAllowedToMakeChanges,
18+
useIsViewerUser,
19+
} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
1720
import {bytesToGB, bytesToSpeed} from '../../utils/utils';
1821
import type {InfoViewerItem} from '../InfoViewer';
1922
import {InfoViewer} from '../InfoViewer';
@@ -221,6 +224,7 @@ interface VDiskPopupProps {
221224

222225
export const VDiskPopup = ({data}: VDiskPopupProps) => {
223226
const isFullData = isFullVDiskData(data);
227+
const isViewerUser = useIsViewerUser();
224228

225229
const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
226230

@@ -257,7 +261,7 @@ export const VDiskPopup = ({data}: VDiskPopupProps) => {
257261
<div className={b()}>
258262
{data.DonorMode && <Label className={b('donor-label')}>Donor</Label>}
259263
<InfoViewer title="VDisk" info={vdiskInfo} size="s" />
260-
{pdiskInfo && <InfoViewer title="PDisk" info={pdiskInfo} size="s" />}
264+
{pdiskInfo && isViewerUser && <InfoViewer title="PDisk" info={pdiskInfo} size="s" />}
261265
{donorsInfo.length > 0 && <InfoViewer title="Donors" info={donorsInfo} size="s" />}
262266
</div>
263267
);

src/components/nodesColumns/constants.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ export function isMonitoringUserNodesColumn(columnId: string): boolean {
4343
return MONITORING_USER_COLUMNS_IDS.includes(columnId as NodesColumnId);
4444
}
4545

46+
// Columns, that should displayed only for users with isViewerAllowed:true
47+
const VIEWER_USER_COLUMNS_IDS: NodesColumnId[] = ['LoadAverage'];
48+
export function isViewerUserNodesColumn(columnId: string): boolean {
49+
return VIEWER_USER_COLUMNS_IDS.some((el) => el === columnId);
50+
}
51+
4652
// This code is running when module is initialized and correct language may not be set yet
4753
// get functions guarantee that i18n fields will be inited on render with current render language
4854
export const NODES_COLUMNS_TITLES = {

src/containers/Nodes/Nodes.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
import React from 'react';
22

33
import type {Column} from '../../components/PaginatedTable';
4-
import {isMonitoringUserNodesColumn} from '../../components/nodesColumns/constants';
4+
import {
5+
isMonitoringUserNodesColumn,
6+
isViewerUserNodesColumn,
7+
} from '../../components/nodesColumns/constants';
58
import type {NodesColumnId} from '../../components/nodesColumns/constants';
69
import type {NodesPreparedEntity} from '../../store/reducers/nodes/types';
710
import type {AdditionalNodesProps} from '../../types/additionalProps';
811
import type {NodesGroupByField} from '../../types/api/nodes';
9-
import {useIsUserAllowedToMakeChanges} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
12+
import {
13+
useIsUserAllowedToMakeChanges,
14+
useIsViewerUser,
15+
} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
1016

1117
import {PaginatedNodes} from './PaginatedNodes';
1218
import {getNodesColumns} from './columns/columns';
@@ -45,13 +51,20 @@ export function Nodes({
4551
groupByParams = ALL_NODES_GROUP_BY_PARAMS,
4652
}: NodesProps) {
4753
const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
54+
const isViewerUser = useIsViewerUser();
4855

4956
const preparedColumns = React.useMemo(() => {
5057
if (isUserAllowedToMakeChanges) {
5158
return columns;
5259
}
53-
return columns.filter((column) => !isMonitoringUserNodesColumn(column.name));
54-
}, [columns, isUserAllowedToMakeChanges]);
60+
const filteredColumns = columns.filter(
61+
(column) => !isMonitoringUserNodesColumn(column.name),
62+
);
63+
if (isViewerUser) {
64+
return filteredColumns;
65+
}
66+
return filteredColumns.filter((column) => !isViewerUserNodesColumn(column.name));
67+
}, [columns, isUserAllowedToMakeChanges, isViewerUser]);
5568

5669
return (
5770
<PaginatedNodes

src/containers/Nodes/NodesControls/NodesControls.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
} from '../../../store/reducers/capabilities/hooks';
1414
import {useProblemFilter} from '../../../store/reducers/settings/hooks';
1515
import type {NodesGroupByField} from '../../../types/api/nodes';
16+
import {useIsViewerUser} from '../../../utils/hooks/useIsUserAllowedToMakeChanges';
1617
import {PeerRoleFilter} from '../PeerRoleFilter/PeerRoleFilter';
1718
import {getNodesGroupByOptions} from '../columns/constants';
1819
import i18n from '../i18n';
@@ -58,12 +59,13 @@ export function NodesControls({
5859
handleGroupByParamChange,
5960
} = useNodesPageQueryParams(groupByParams);
6061
const {problemFilter, handleProblemFilterChange} = useProblemFilter();
62+
const isViewerUser = useIsViewerUser();
6163

6264
const systemStateGroupingAvailable = useViewerNodesHandlerHasGroupingBySystemState();
6365
const groupByoptions = getNodesGroupByOptions(groupByParams, systemStateGroupingAvailable);
6466

6567
const networStatsAvailable = useViewerNodesHandlerHasNetworkStats();
66-
const shouldDisplayPeerRoleFilter = withPeerRoleFilter && networStatsAvailable;
68+
const shouldDisplayPeerRoleFilter = withPeerRoleFilter && networStatsAvailable && isViewerUser;
6769

6870
const handleGroupBySelectUpdate = (value: string[]) => {
6971
handleGroupByParamChange(value[0]);

src/containers/Nodes/useNodesPageQueryParams.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {StringParam, useQueryParams} from 'use-query-params';
22

33
import {useViewerNodesHandlerHasGroupingBySystemState} from '../../store/reducers/capabilities/hooks';
44
import type {NodesGroupByField, NodesPeerRole} from '../../types/api/nodes';
5+
import {useIsViewerUser} from '../../utils/hooks/useIsUserAllowedToMakeChanges';
56
import type {NodesUptimeFilterValues} from '../../utils/nodes';
67
import {nodesUptimeFilterValuesSchema} from '../../utils/nodes';
78

@@ -16,9 +17,13 @@ export function useNodesPageQueryParams(groupByParams: NodesGroupByField[] | und
1617
nodesGroupBy: StringParam,
1718
});
1819

20+
const isViewerUser = useIsViewerUser();
21+
1922
const uptimeFilter = nodesUptimeFilterValuesSchema.parse(queryParams.uptimeFilter);
2023
const searchValue = queryParams.search ?? '';
21-
const peerRoleFilter = parseNodesPeerRoleFilter(queryParams.peerRole);
24+
const peerRoleFilter = isViewerUser
25+
? parseNodesPeerRoleFilter(queryParams.peerRole)
26+
: 'database';
2227

2328
const systemStateGroupingAvailable = useViewerNodesHandlerHasGroupingBySystemState();
2429
const groupByParam = parseNodesGroupByParam(

src/containers/Storage/PaginatedStorageGroupsTable/columns/constants.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ export const DEFAULT_STORAGE_GROUPS_COLUMNS: StorageGroupsColumnId[] = [
5555
'VDisks',
5656
];
5757

58+
// Columns, that should displayed only for users with isViewerAllowed:true
59+
const VIEWER_USER_COLUMNS_IDS: StorageGroupsColumnId[] = ['DiskSpace'];
60+
export function isViewerGroupsColumn(columnId: string): boolean {
61+
return VIEWER_USER_COLUMNS_IDS.some((el) => el === columnId);
62+
}
63+
5864
export const REQUIRED_STORAGE_GROUPS_COLUMNS: StorageGroupsColumnId[] = ['GroupId'];
5965

6066
// This code is running when module is initialized and correct language may not be set yet

src/containers/Storage/PaginatedStorageGroupsTable/columns/hooks.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import React from 'react';
22

33
import {VISIBLE_ENTITIES} from '../../../../store/reducers/storage/constants';
4-
import {useIsUserAllowedToMakeChanges} from '../../../../utils/hooks/useIsUserAllowedToMakeChanges';
4+
import {
5+
useIsUserAllowedToMakeChanges,
6+
useIsViewerUser,
7+
} from '../../../../utils/hooks/useIsUserAllowedToMakeChanges';
58
import {useSelectedColumns} from '../../../../utils/hooks/useSelectedColumns';
69

710
import {getStorageGroupsColumns} from './columns';
@@ -12,6 +15,7 @@ import {
1215
STORAGE_GROUPS_COLUMNS_TITLES,
1316
STORAGE_GROUPS_SELECTED_COLUMNS_LS_KEY,
1417
isMonitoringUserGroupsColumn,
18+
isViewerGroupsColumn,
1519
} from './constants';
1620
import type {GetStorageGroupsColumnsParams} from './types';
1721

@@ -20,15 +24,22 @@ export function useStorageGroupsSelectedColumns({
2024
viewContext,
2125
}: GetStorageGroupsColumnsParams) {
2226
const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
27+
const isViewerUser = useIsViewerUser();
2328

2429
const columns = React.useMemo(() => {
2530
const allColumns = getStorageGroupsColumns({viewContext});
2631

2732
if (isUserAllowedToMakeChanges) {
2833
return allColumns;
2934
}
30-
return allColumns.filter((column) => !isMonitoringUserGroupsColumn(column.name));
31-
}, [isUserAllowedToMakeChanges, viewContext]);
35+
const filteredColumns = allColumns.filter(
36+
(column) => !isMonitoringUserGroupsColumn(column.name),
37+
);
38+
if (isViewerUser) {
39+
return filteredColumns;
40+
}
41+
return filteredColumns.filter((column) => !isViewerGroupsColumn(column.name));
42+
}, [isUserAllowedToMakeChanges, viewContext, isViewerUser]);
3243

3344
const requiredColumns = React.useMemo(() => {
3445
if (visibleEntities === VISIBLE_ENTITIES.missing) {

src/containers/Tenant/Diagnostics/Diagnostics.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type {AdditionalNodesProps, AdditionalTenantsProps} from '../../../types/
1717
import {uiFactory} from '../../../uiFactory/uiFactory';
1818
import {cn} from '../../../utils/cn';
1919
import {useScrollPosition, useTypedDispatch, useTypedSelector} from '../../../utils/hooks';
20+
import {useIsViewerUser} from '../../../utils/hooks/useIsUserAllowedToMakeChanges';
2021
import {Heatmap} from '../../Heatmap';
2122
import {Nodes} from '../../Nodes/Nodes';
2223
import {Operations} from '../../Operations';
@@ -63,11 +64,13 @@ function Diagnostics(props: DiagnosticsProps) {
6364

6465
const hasFeatureFlags = useFeatureFlagsAvailable();
6566
const hasTopicData = useTopicDataAvailable();
67+
const isViewerUser = useIsViewerUser();
6668
const pages = getPagesByType(type, subType, {
6769
hasFeatureFlags,
6870
hasTopicData,
6971
isTopLevel: path === database,
7072
hasBackups: typeof uiFactory.renderBackups === 'function' && Boolean(controlPlane),
73+
hasConfigs: isViewerUser,
7174
});
7275
let activeTab = pages.find((el) => el.id === diagnosticsTab);
7376
if (!activeTab) {

src/containers/Tenant/Diagnostics/DiagnosticsPages.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,23 +176,27 @@ export const getPagesByType = (
176176
hasTopicData?: boolean;
177177
isTopLevel?: boolean;
178178
hasBackups?: boolean;
179+
hasConfigs?: boolean;
179180
},
180181
) => {
181182
const subTypePages = subType ? pathSubTypeToPages[subType] : undefined;
182183
const typePages = type ? pathTypeToPages[type] : undefined;
183184
let pages = subTypePages || typePages || DIR_PAGES;
184185

185186
if (isTopicEntityType(type) && !options?.hasTopicData) {
186-
return pages?.filter((item) => item.id !== TENANT_DIAGNOSTICS_TABS_IDS.topicData);
187+
pages = pages?.filter((item) => item.id !== TENANT_DIAGNOSTICS_TABS_IDS.topicData);
187188
}
188189
if (isDatabaseEntityType(type) || options?.isTopLevel) {
189190
pages = DATABASE_PAGES;
190191
if (!options?.hasFeatureFlags) {
191-
return pages.filter((item) => item.id !== TENANT_DIAGNOSTICS_TABS_IDS.configs);
192+
pages = pages.filter((item) => item.id !== TENANT_DIAGNOSTICS_TABS_IDS.configs);
192193
}
193194
}
194195
if (!options?.hasBackups) {
195-
return pages.filter((item) => item.id !== TENANT_DIAGNOSTICS_TABS_IDS.backups);
196+
pages = pages.filter((item) => item.id !== TENANT_DIAGNOSTICS_TABS_IDS.backups);
197+
}
198+
if (!options?.hasConfigs) {
199+
pages = pages.filter((item) => item.id !== TENANT_DIAGNOSTICS_TABS_IDS.configs);
196200
}
197201
return pages;
198202
};

src/store/reducers/cluster/cluster.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type {TClusterInfo} from '../../../types/api/cluster';
1010
import type {TTabletStateInfo} from '../../../types/api/tablet';
1111
import {CLUSTER_DEFAULT_TITLE, DEFAULT_CLUSTER_TAB_KEY} from '../../../utils/constants';
1212
import {useClusterNameFromQuery} from '../../../utils/hooks/useDatabaseFromQuery';
13+
import {useIsViewerUser} from '../../../utils/hooks/useIsUserAllowedToMakeChanges';
1314
import {isQueryErrorResponse} from '../../../utils/query';
1415
import type {RootState} from '../../defaultStore';
1516
import {api} from '../api';
@@ -139,8 +140,11 @@ export const clusterApi = api.injectEndpoints({
139140

140141
export function useClusterBaseInfo() {
141142
const clusterNameFromQuery = useClusterNameFromQuery();
143+
const isViewerUser = useIsViewerUser();
142144

143-
const {currentData} = clusterApi.useGetClusterBaseInfoQuery(clusterNameFromQuery ?? skipToken);
145+
const {currentData} = clusterApi.useGetClusterBaseInfoQuery(clusterNameFromQuery ?? skipToken, {
146+
skip: !isViewerUser,
147+
});
144148

145149
const {solomon: monitoring, name, title, trace_view: traceView, ...data} = currentData || {};
146150

0 commit comments

Comments
 (0)