Skip to content

Commit 9983af1

Browse files
corya-akamaiConal Ryan
andauthored
feat: [UIE-8999] - IAM RBAC Adjust the parameters to useQueryWithPermissions and return errors (#12560)
* feat: [UIE-8999] - IAM RBAC add parameters to the userQueryWithPermission hook, return errors and loading indicators * Changeset * Better API * Fix test --------- Co-authored-by: Conal Ryan <[email protected]>
1 parent c771de5 commit 9983af1

File tree

5 files changed

+52
-26
lines changed

5 files changed

+52
-26
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@linode/manager": Upcoming Features
3+
---
4+
5+
Modified the query parameter to allow varying use cases. Return any errors from the API along with isLoading, isError values. ([#12560](https://github.com/linode/manager/pull/12560))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export const CustomFirewallFields = (props: CustomFirewallProps) => {
6666
const { data: profile } = useProfile();
6767

6868
const { data: permissableLinodes, hasFiltered: hasFilteredLinodes } =
69-
useQueryWithPermissions<Linode>(useAllLinodesQuery, 'linode', [
69+
useQueryWithPermissions<Linode>(useAllLinodesQuery(), 'linode', [
7070
'apply_linode_firewalls',
7171
]);
7272

packages/manager/src/features/IAM/hooks/usePermissions.ts

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ import type {
2323
AccountEntity,
2424
APIError,
2525
EntityType,
26-
Filter,
2726
GrantType,
28-
Params,
2927
Profile,
3028
} from '@linode/api-v4';
3129
import type { UseQueryResult } from '@linode/queries';
@@ -92,31 +90,41 @@ export const useEntitiesPermissions = <T extends EntityBase>(
9290
})),
9391
});
9492

95-
const isLoading = queries.some((query) => query.isLoading);
96-
const isError = queries.some((query) => query.isError);
9793
const data = queries.map((query) => query.data);
94+
const error = queries.map((query) => query.error);
95+
const isError = queries.some((query) => query.isError);
96+
const isLoading = queries.some((query) => query.isLoading);
9897

99-
return { data, isLoading, isError };
98+
return { data, error, isError, isLoading };
10099
};
101100

101+
export type QueryWithPermissionsResult<T> = {
102+
data: T[];
103+
error: APIError[] | null;
104+
hasFiltered: boolean;
105+
isError: boolean;
106+
isLoading: boolean;
107+
} & Omit<
108+
UseQueryResult<T[], APIError[]>,
109+
'data' | 'error' | 'isError' | 'isLoading'
110+
>;
111+
102112
export const useQueryWithPermissions = <T extends EntityBase>(
103-
query: (
104-
params?: Params,
105-
filter?: Filter,
106-
enabled?: boolean
107-
) => UseQueryResult<T[], APIError[]>,
113+
useQueryResult: UseQueryResult<T[], APIError[]>,
108114
entityType: EntityType,
109115
permissionsToCheck: PermissionType[]
110-
): { data: T[]; hasFiltered: boolean } => {
111-
const { data: allEntities } = query();
116+
): QueryWithPermissionsResult<T> => {
117+
const {
118+
data: allEntities,
119+
error: allEntitiesError,
120+
isLoading: areEntitiesLoading,
121+
isError: isEntitiesError,
122+
...restQueryResult
123+
} = useQueryResult;
112124
const { data: profile } = useProfile();
113125
const { isIAMEnabled } = useIsIAMEnabled();
114-
const { data: entityPermissions } = useEntitiesPermissions<T>(
115-
allEntities,
116-
entityType,
117-
profile,
118-
isIAMEnabled
119-
);
126+
const { data: entityPermissions, isLoading: areEntityPermissionsLoading } =
127+
useEntitiesPermissions<T>(allEntities, entityType, profile, isIAMEnabled);
120128
const { data: grants } = useGrants(!isIAMEnabled);
121129

122130
const entityPermissionsMap = isIAMEnabled
@@ -138,6 +146,10 @@ export const useQueryWithPermissions = <T extends EntityBase>(
138146

139147
return {
140148
data: entities || [],
149+
error: allEntitiesError,
141150
hasFiltered: allEntities?.length !== entities?.length,
151+
isError: isEntitiesError,
152+
isLoading: areEntitiesLoading || areEntityPermissionsLoading,
153+
...restQueryResult,
142154
} as const;
143155
};

packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/LinodeBackups.test.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ const queryMocks = vi.hoisted(() => ({
1919
restore_linode_backup: true,
2020
},
2121
})),
22+
useQueryWithPermissions: vi.fn().mockReturnValue({
23+
data: [],
24+
isLoading: false,
25+
isError: false,
26+
}),
2227
}));
2328

2429
vi.mock('@tanstack/react-router', async () => {
@@ -31,6 +36,7 @@ vi.mock('@tanstack/react-router', async () => {
3136

3237
vi.mock('src/features/IAM/hooks/usePermissions', () => ({
3338
usePermissions: queryMocks.userPermissions,
39+
useQueryWithPermissions: queryMocks.useQueryWithPermissions,
3440
}));
3541

3642
describe('LinodeBackups', () => {

packages/manager/src/features/Linodes/LinodesDetail/LinodeBackup/RestoreToLinodeDrawer.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ import { useFormik } from 'formik';
1717
import { useSnackbar } from 'notistack';
1818
import * as React from 'react';
1919

20+
import { useQueryWithPermissions } from 'src/features/IAM/hooks/usePermissions';
2021
import { useEventsPollingActions } from 'src/queries/events/events';
2122
import { getErrorMap } from 'src/utilities/errorUtils';
2223

23-
import type { LinodeBackup } from '@linode/api-v4/lib/linodes';
24+
import type { Linode, LinodeBackup } from '@linode/api-v4/lib/linodes';
25+
2426
interface Props {
2527
backup: LinodeBackup | undefined;
2628
linodeId: number;
@@ -35,19 +37,20 @@ export const RestoreToLinodeDrawer = (props: Props) => {
3537

3638
const { checkForNewEvents } = useEventsPollingActions();
3739

38-
// TODO - UIE-8999 - this query must be included with the useQueryWithPermissions hook
39-
const {
40-
data: linodes,
41-
error: linodeError,
42-
isLoading: linodesLoading,
43-
} = useAllLinodesQuery(
40+
const query = useAllLinodesQuery(
4441
{},
4542
{
4643
region: linode?.region,
4744
},
4845
open && linode !== undefined
4946
);
5047

48+
const {
49+
data: linodes,
50+
error: linodeError,
51+
isLoading: linodesLoading,
52+
} = useQueryWithPermissions<Linode>(query, 'linode', ['update_linode']);
53+
5154
const {
5255
error,
5356
isPending,

0 commit comments

Comments
 (0)