Skip to content

Commit 47f0958

Browse files
abailly-akamaimpolotsk-akamaiaaleksee-akamai
authored
feat: [feature-branch/UIE 9568] - Support & Implementation of the new entities by permission endpoint (#13086)
* UIE-9570 * UIE-9570 cleanup * UIE-9570 cleanup * UIE-9570 username from profile * UIE-9571 - Replace useQueryWithPermissions in CustomFirewallFields * UIE-9572 * Cloud version 1.155.0, API v4 version 0.153.0, Utilities version 0.12.0, Queries version 0.17.0 * UIE-9574 - Replace useQueryWithPermissions in RestoreToLinodeDrawer * UIE-9573 * UIE-9576 * UIE-9575 - Replace useQueryWithPermissions in AddFirewallForm * UIE-9577 * UIE-9578 - Replace useQueryWithPermissions in SubnetAssignLinodesDrawer * UIE-9579 - Replace useQueryWithPermissions in SubnetUnassignLinodesDrawer * UIE-9580 * fix test failues * Revert "Cloud version 1.155.0, API v4 version 0.153.0, Utilities version 0.12.0, Queries version 0.17.0" This reverts commit 2c1f4e9. * feat: [UIE-9667] - filter out linodes in AttachVolumeDrawer * adjust types + fetch all * fix some tests + cleanup * hook refactor * fix AddFirewallForm.tsx * run time fix * missing page params --------- Co-authored-by: mpolotsk <[email protected]> Co-authored-by: Anastasiia Alekseenko <[email protected]>
1 parent fcb8b3c commit 47f0958

39 files changed

+898
-1051
lines changed

packages/api-v4/src/iam/iam.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import { BETA_API_ROOT } from '../constants';
2-
import Request, { setData, setMethod, setURL } from '../request';
2+
import Request, {
3+
setData,
4+
setMethod,
5+
setParams,
6+
setURL,
7+
setXFilter,
8+
} from '../request';
39

10+
import type { Filter, Params, ResourcePage } from '../types';
411
import type {
512
AccessType,
613
EntityByPermission,
@@ -9,7 +16,6 @@ import type {
916
PermissionType,
1017
} from './types';
1118
import type { EntityType } from 'src/entities/types';
12-
1319
/**
1420
* getUserRoles
1521
*
@@ -93,6 +99,8 @@ export const getUserEntityPermissions = (
9399
username: string,
94100
entityType: AccessType,
95101
entityId: number | string,
102+
params?: Params,
103+
filter?: Filter,
96104
) =>
97105
Request<PermissionType[]>(
98106
setURL(
@@ -101,6 +109,8 @@ export const getUserEntityPermissions = (
101109
)}/permissions/${entityType}/${entityId}`,
102110
),
103111
setMethod('GET'),
112+
setParams(params),
113+
setXFilter(filter),
104114
);
105115

106116
/**
@@ -109,7 +119,10 @@ export const getUserEntityPermissions = (
109119
* Returns the available entities for a given permission.
110120
*/
111121
export interface GetEntitiesByPermissionParams {
122+
enabled?: boolean;
112123
entityType: EntityType;
124+
filter?: Filter;
125+
params?: Params;
113126
permission: PermissionType;
114127
username: string | undefined;
115128
}
@@ -118,10 +131,14 @@ export const getUserEntitiesByPermission = ({
118131
username,
119132
entityType,
120133
permission,
134+
params,
135+
filter,
121136
}: GetEntitiesByPermissionParams) =>
122-
Request<EntityByPermission[]>(
137+
Request<ResourcePage<EntityByPermission>>(
123138
setURL(
124139
`${BETA_API_ROOT}/iam/users/${username}/entities/${entityType}?permission=${permission}`,
125140
),
126141
setMethod('GET'),
142+
setParams(params),
143+
setXFilter(filter),
127144
);

packages/api-v4/src/iam/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ export interface Roles {
457457
permissions: PermissionType[];
458458
}
459459
export interface EntityByPermission {
460-
id: number;
460+
id: number | string;
461461
label: string;
462462
type: EntityType;
463463
}

packages/manager/src/components/SelectFirewallPanel/SelectFirewallPanel.test.tsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,10 @@ const queryMocks = vi.hoisted(() => ({
1717
usePermissions: vi.fn(() => ({
1818
data: { delete_firewall: true, update_firewall: true },
1919
})),
20-
useQueryWithPermissions: vi.fn().mockReturnValue({
21-
data: [],
22-
isLoading: false,
23-
isError: false,
24-
}),
2520
}));
2621

2722
vi.mock('src/features/IAM/hooks/usePermissions', () => ({
2823
usePermissions: queryMocks.usePermissions,
29-
useQueryWithPermissions: queryMocks.useQueryWithPermissions,
3024
}));
3125

3226
describe('SelectFirewallPanel', () => {

packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.test.tsx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,14 @@ const props = {
1616
};
1717

1818
const queryMocks = vi.hoisted(() => ({
19+
useAllFirewallsQuery: vi.fn().mockReturnValue({}),
1920
useParams: vi.fn().mockReturnValue({}),
20-
useQueryWithPermissions: vi.fn().mockReturnValue({
21-
data: [],
22-
isLoading: false,
23-
isError: false,
24-
}),
21+
useGetAllUserEntitiesByPermission: vi.fn().mockReturnValue({}),
2522
}));
2623

27-
vi.mock('src/features/IAM/hooks/usePermissions', () => ({
28-
useQueryWithPermissions: queryMocks.useQueryWithPermissions,
24+
vi.mock('src/features/IAM/hooks/useGetAllUserEntitiesByPermission', () => ({
25+
useGetAllUserEntitiesByPermission:
26+
queryMocks.useGetAllUserEntitiesByPermission,
2927
}));
3028

3129
vi.mock('@tanstack/react-router', async () => {
@@ -36,9 +34,27 @@ vi.mock('@tanstack/react-router', async () => {
3634
};
3735
});
3836

37+
vi.mock('@linode/queries', async () => {
38+
const actual = await vi.importActual('@linode/queries');
39+
return {
40+
...actual,
41+
useAllFirewallsQuery: queryMocks.useAllFirewallsQuery,
42+
};
43+
});
44+
3945
describe('AddLinodeDrawer', () => {
4046
beforeEach(() => {
4147
queryMocks.useParams.mockReturnValue({ id: '1' });
48+
queryMocks.useGetAllUserEntitiesByPermission.mockReturnValue({
49+
data: [],
50+
isLoading: false,
51+
error: null,
52+
});
53+
queryMocks.useAllFirewallsQuery.mockReturnValue({
54+
data: [],
55+
isLoading: false,
56+
error: null,
57+
});
4258
});
4359

4460
it('should contain helper text', () => {

packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddLinodeDrawer.tsx

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {
22
linodeQueries,
33
useAddFirewallDeviceMutation,
44
useAllFirewallsQuery,
5-
useAllLinodesQuery,
65
} from '@linode/queries';
76
import { LinodeSelect } from '@linode/shared';
87
import {
@@ -21,7 +20,7 @@ import * as React from 'react';
2120
import { Link } from 'src/components/Link';
2221
import { SupportLink } from 'src/components/SupportLink';
2322
import { getRestrictedResourceText } from 'src/features/Account/utils';
24-
import { useQueryWithPermissions } from 'src/features/IAM/hooks/usePermissions';
23+
import { useGetAllUserEntitiesByPermission } from 'src/features/IAM/hooks/useGetAllUserEntitiesByPermission';
2524
import { getLinodeInterfaceType } from 'src/features/Linodes/LinodesDetail/LinodeNetworking/LinodeInterfaces/utilities';
2625
import { getAPIErrorOrDefault } from 'src/utilities/errorUtils';
2726
import { useIsLinodeInterfacesEnabled } from 'src/utilities/linodes';
@@ -59,13 +58,16 @@ export const AddLinodeDrawer = (props: Props) => {
5958

6059
const firewall = data?.find((firewall) => firewall.id === Number(id));
6160

62-
const { data: availableLinodes, isLoading: availableLinodesLoading } =
63-
useQueryWithPermissions<Linode>(
64-
useAllLinodesQuery({}, {}, open),
65-
'linode',
66-
['update_linode'],
67-
open
68-
);
61+
const {
62+
data: availableLinodes,
63+
filter: availableLinodesFilter,
64+
isLoading: availableLinodesLoading,
65+
error: availableLinodesError,
66+
} = useGetAllUserEntitiesByPermission<Linode>({
67+
entityType: 'linode',
68+
permission: 'update_linode',
69+
enabled: open,
70+
});
6971

7072
const linodesUsingLinodeInterfaces =
7173
availableLinodes?.filter((l) => l.interface_generation === 'linode') ?? [];
@@ -338,7 +340,10 @@ export const AddLinodeDrawer = (props: Props) => {
338340
if (error) {
339341
setLocalError('Could not load firewall data');
340342
}
341-
}, [error]);
343+
if (availableLinodesError) {
344+
setLocalError('Could not load linode data');
345+
}
346+
}, [error, availableLinodesError]);
342347

343348
return (
344349
<Drawer
@@ -365,6 +370,7 @@ export const AddLinodeDrawer = (props: Props) => {
365370
disabled={
366371
isLoadingAllFirewalls || availableLinodesLoading || disabled
367372
}
373+
filter={availableLinodesFilter}
368374
helperText={helperText}
369375
loading={isLoadingAllFirewalls || availableLinodesLoading}
370376
multiple

packages/manager/src/features/Firewalls/FirewallDetail/Devices/AddNodebalancerDrawer.test.tsx

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,12 @@ const queryMocks = vi.hoisted(() => ({
2222
create_firewall_device: true,
2323
},
2424
})),
25-
useQueryWithPermissions: vi.fn().mockReturnValue({
26-
data: [],
27-
isLoading: false,
28-
isError: false,
29-
}),
25+
useGetAllUserEntitiesByPermission: vi.fn().mockReturnValue({}),
26+
useAllFirewallsQuery: vi.fn().mockReturnValue({}),
3027
}));
3128

3229
vi.mock('src/features/IAM/hooks/usePermissions', () => ({
3330
usePermissions: queryMocks.userPermissions,
34-
useQueryWithPermissions: queryMocks.useQueryWithPermissions,
3531
}));
3632

3733
vi.mock('@tanstack/react-router', async () => {
@@ -42,9 +38,32 @@ vi.mock('@tanstack/react-router', async () => {
4238
};
4339
});
4440

41+
vi.mock('src/features/IAM/hooks/useGetAllUserEntitiesByPermission', () => ({
42+
useGetAllUserEntitiesByPermission:
43+
queryMocks.useGetAllUserEntitiesByPermission,
44+
}));
45+
46+
vi.mock('@linode/queries', async () => {
47+
const actual = await vi.importActual('@linode/queries');
48+
return {
49+
...actual,
50+
useAllFirewallsQuery: queryMocks.useAllFirewallsQuery,
51+
};
52+
});
53+
4554
describe('AddNodeBalancerDrawer', () => {
4655
beforeEach(() => {
4756
queryMocks.useParams.mockReturnValue({ id: '1' });
57+
queryMocks.useGetAllUserEntitiesByPermission.mockReturnValue({
58+
data: [],
59+
isLoading: false,
60+
error: null,
61+
});
62+
queryMocks.useAllFirewallsQuery.mockReturnValue({
63+
data: [],
64+
isLoading: false,
65+
error: null,
66+
});
4867
});
4968

5069
it('should contain helper text', () => {

packages/manager/src/features/Firewalls/FirewallDetail/Devices/FirewallDeviceLanding.test.tsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,6 @@ const queryMocks = vi.hoisted(() => ({
2323
create_firewall_device: false,
2424
},
2525
})),
26-
useQueryWithPermissions: vi.fn().mockReturnValue({
27-
data: [],
28-
isLoading: false,
29-
isError: false,
30-
}),
3126
}));
3227

3328
vi.mock('@tanstack/react-router', async () => {
@@ -51,7 +46,6 @@ vi.mock('src/hooks/useOrderV2', async () => {
5146

5247
vi.mock('src/features/IAM/hooks/usePermissions', () => ({
5348
usePermissions: queryMocks.usePermissions,
54-
useQueryWithPermissions: queryMocks.useQueryWithPermissions,
5549
}));
5650

5751
const baseProps = (

packages/manager/src/features/Firewalls/FirewallLanding/CreateFirewallDrawer.test.tsx

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,29 @@ import userEvent from '@testing-library/user-event';
33
import * as React from 'react';
44

55
import { accountFactory } from 'src/factories';
6-
import { http, HttpResponse, server } from 'src/mocks/testServer';
76
import { renderWithTheme } from 'src/utilities/testHelpers';
87

98
import { CreateFirewallDrawer } from './CreateFirewallDrawer';
109

1110
const queryMocks = vi.hoisted(() => ({
12-
userPermissions: vi.fn(() => ({
11+
useAccount: vi.fn().mockReturnValue({}),
12+
usePermissions: vi.fn().mockReturnValue({
1313
data: { create_firewall: true },
14-
})),
15-
useQueryWithPermissions: vi.fn().mockReturnValue({
16-
data: [],
1714
isLoading: false,
18-
isError: false,
15+
error: null,
1916
}),
2017
}));
2118

19+
vi.mock('@linode/queries', async () => {
20+
const actual = await vi.importActual('@linode/queries');
21+
return {
22+
...actual,
23+
useAccount: queryMocks.useAccount,
24+
};
25+
});
26+
2227
vi.mock('src/features/IAM/hooks/usePermissions', () => ({
23-
usePermissions: queryMocks.userPermissions,
24-
useQueryWithPermissions: queryMocks.useQueryWithPermissions,
28+
usePermissions: queryMocks.usePermissions,
2529
}));
2630

2731
const props = {
@@ -80,12 +84,14 @@ describe('Create Firewall Drawer', () => {
8084
});
8185

8286
it('shows custom firewall radio group if Linode Interfaces is enabled and can toggle radio group', async () => {
83-
const account = accountFactory.build({
84-
capabilities: ['Linode Interfaces'],
87+
queryMocks.useAccount.mockReturnValue({
88+
data: accountFactory.build({
89+
capabilities: ['Linode Interfaces'],
90+
}),
91+
isLoading: false,
92+
error: null,
8593
});
8694

87-
server.use(http.get('*/v4*/account', () => HttpResponse.json(account)));
88-
8995
const { getByLabelText, findByTestId } = renderWithTheme(
9096
<CreateFirewallDrawer {...props} />,
9197
{
@@ -119,8 +125,10 @@ describe('Create Firewall Drawer', () => {
119125
});
120126

121127
it('enables the submit button if the user has create_firewall permission', () => {
122-
queryMocks.userPermissions.mockReturnValue({
128+
queryMocks.usePermissions.mockReturnValue({
123129
data: { create_firewall: true },
130+
isLoading: false,
131+
error: null,
124132
});
125133

126134
renderWithTheme(<CreateFirewallDrawer {...props} />);
@@ -129,8 +137,10 @@ describe('Create Firewall Drawer', () => {
129137
});
130138

131139
it('disables the submit button if the user does not have create_firewall permission', () => {
132-
queryMocks.userPermissions.mockReturnValue({
140+
queryMocks.usePermissions.mockReturnValue({
133141
data: { create_firewall: false },
142+
isLoading: false,
143+
error: null,
134144
});
135145

136146
renderWithTheme(<CreateFirewallDrawer {...props} />);

packages/manager/src/features/Firewalls/FirewallLanding/CustomFirewallFields.test.tsx

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,6 @@ import { CustomFirewallFields } from './CustomFirewallFields';
66

77
import type { LinodeCreateFormEventOptions } from 'src/utilities/analytics/types';
88

9-
const queryMocks = vi.hoisted(() => ({
10-
useQueryWithPermissions: vi.fn().mockReturnValue({
11-
data: [],
12-
isLoading: false,
13-
isError: false,
14-
}),
15-
}));
16-
17-
vi.mock('src/features/IAM/hooks/usePermissions', () => ({
18-
...vi.importActual('src/features/IAM/hooks/usePermissions'),
19-
useQueryWithPermissions: queryMocks.useQueryWithPermissions,
20-
}));
21-
229
const props = {
2310
createFlow: undefined,
2411
firewallFormEventOptions: {

0 commit comments

Comments
 (0)