Skip to content

Commit 557adab

Browse files
chore(site): remove template ACL XService (#10332)
1 parent 21f8731 commit 557adab

File tree

5 files changed

+128
-401
lines changed

5 files changed

+128
-401
lines changed

site/src/api/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ export const getTemplateACL = async (
947947
export const updateTemplateACL = async (
948948
templateId: string,
949949
data: TypesGen.UpdateTemplateACL,
950-
): Promise<TypesGen.TemplateACL> => {
950+
): Promise<{ message: string }> => {
951951
const response = await axios.patch(
952952
`/api/v2/templates/${templateId}/acl`,
953953
data,

site/src/api/queries/templates.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@ import {
66
type TemplateVersion,
77
CreateTemplateRequest,
88
ProvisionerJob,
9+
TemplateRole,
910
} from "api/typesGenerated";
10-
import { type QueryClient, type QueryOptions } from "react-query";
11+
import {
12+
MutationOptions,
13+
type QueryClient,
14+
type QueryOptions,
15+
} from "react-query";
1116
import { delay } from "utils/delay";
1217

1318
export const templateByNameKey = (orgId: string, name: string) => [
@@ -36,6 +41,53 @@ export const templates = (orgId: string) => {
3641
};
3742
};
3843

44+
export const templateACL = (templateId: string) => {
45+
return {
46+
queryKey: ["templateAcl", templateId],
47+
queryFn: () => API.getTemplateACL(templateId),
48+
};
49+
};
50+
51+
export const setUserRole = (
52+
queryClient: QueryClient,
53+
): MutationOptions<
54+
Awaited<ReturnType<typeof API.updateTemplateACL>>,
55+
unknown,
56+
{ templateId: string; userId: string; role: TemplateRole }
57+
> => {
58+
return {
59+
mutationFn: ({ templateId, userId, role }) =>
60+
API.updateTemplateACL(templateId, {
61+
user_perms: {
62+
[userId]: role,
63+
},
64+
}),
65+
onSuccess: async (_res, { templateId }) => {
66+
await queryClient.invalidateQueries(["templateAcl", templateId]);
67+
},
68+
};
69+
};
70+
71+
export const setGroupRole = (
72+
queryClient: QueryClient,
73+
): MutationOptions<
74+
Awaited<ReturnType<typeof API.updateTemplateACL>>,
75+
unknown,
76+
{ templateId: string; groupId: string; role: TemplateRole }
77+
> => {
78+
return {
79+
mutationFn: ({ templateId, groupId, role }) =>
80+
API.updateTemplateACL(templateId, {
81+
group_perms: {
82+
[groupId]: role,
83+
},
84+
}),
85+
onSuccess: async (_res, { templateId }) => {
86+
await queryClient.invalidateQueries(["templateAcl", templateId]);
87+
},
88+
};
89+
};
90+
3991
export const templateExamples = (orgId: string) => {
4092
return {
4193
queryKey: [...getTemplatesQueryKey(orgId), "examples"],

site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx

Lines changed: 68 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,36 @@
11
import Button from "@mui/material/Button";
22
import Link from "@mui/material/Link";
33
import ArrowRightAltOutlined from "@mui/icons-material/ArrowRightAltOutlined";
4-
import { useMachine } from "@xstate/react";
54
import { Paywall } from "components/Paywall/Paywall";
65
import { Stack } from "components/Stack/Stack";
76
import { useFeatureVisibility } from "hooks/useFeatureVisibility";
87
import { useOrganizationId } from "hooks/useOrganizationId";
98
import { FC } from "react";
109
import { Helmet } from "react-helmet-async";
1110
import { pageTitle } from "utils/page";
12-
import { templateACLMachine } from "xServices/template/templateACLXService";
1311
import { useTemplateSettings } from "../TemplateSettingsLayout";
1412
import { TemplatePermissionsPageView } from "./TemplatePermissionsPageView";
1513
import { docs } from "utils/docs";
14+
import { useMutation, useQuery, useQueryClient } from "react-query";
15+
import { setGroupRole, setUserRole, templateACL } from "api/queries/templates";
16+
import { displaySuccess } from "components/GlobalSnackbar/utils";
1617

1718
export const TemplatePermissionsPage: FC<
1819
React.PropsWithChildren<unknown>
1920
> = () => {
2021
const organizationId = useOrganizationId();
2122
const { template, permissions } = useTemplateSettings();
2223
const { template_rbac: isTemplateRBACEnabled } = useFeatureVisibility();
23-
const [state, send] = useMachine(templateACLMachine, {
24-
context: { templateId: template.id },
25-
});
26-
const { templateACL, userToBeUpdated, groupToBeUpdated } = state.context;
24+
const templateACLQuery = useQuery(templateACL(template.id));
25+
const queryClient = useQueryClient();
26+
27+
const addUserMutation = useMutation(setUserRole(queryClient));
28+
const updateUserMutation = useMutation(setUserRole(queryClient));
29+
const removeUserMutation = useMutation(setUserRole(queryClient));
30+
31+
const addGroupMutation = useMutation(setGroupRole(queryClient));
32+
const updateGroupMutation = useMutation(setGroupRole(queryClient));
33+
const removeGroupMutation = useMutation(setGroupRole(queryClient));
2734

2835
return (
2936
<>
@@ -58,29 +65,67 @@ export const TemplatePermissionsPage: FC<
5865
<TemplatePermissionsPageView
5966
organizationId={organizationId}
6067
templateID={template.id}
61-
templateACL={templateACL}
68+
templateACL={templateACLQuery.data}
6269
canUpdatePermissions={Boolean(permissions?.canUpdateTemplate)}
63-
onAddUser={(user, role, reset) => {
64-
send("ADD_USER", { user, role, onDone: reset });
70+
onAddUser={async (user, role, reset) => {
71+
await addUserMutation.mutateAsync({
72+
templateId: template.id,
73+
userId: user.id,
74+
role,
75+
});
76+
reset();
6577
}}
66-
isAddingUser={state.matches("addingUser")}
67-
onUpdateUser={(user, role) => {
68-
send("UPDATE_USER_ROLE", { user, role });
78+
isAddingUser={addUserMutation.isLoading}
79+
onUpdateUser={async (user, role) => {
80+
await updateUserMutation.mutateAsync({
81+
templateId: template.id,
82+
userId: user.id,
83+
role,
84+
});
85+
displaySuccess("User role updated successfully!");
6986
}}
70-
updatingUser={userToBeUpdated}
71-
onRemoveUser={(user) => {
72-
send("REMOVE_USER", { user });
87+
updatingUserId={
88+
updateUserMutation.isLoading
89+
? updateUserMutation.variables?.userId
90+
: undefined
91+
}
92+
onRemoveUser={async (user) => {
93+
await removeUserMutation.mutateAsync({
94+
templateId: template.id,
95+
userId: user.id,
96+
role: "",
97+
});
98+
displaySuccess("User removed successfully!");
7399
}}
74-
onAddGroup={(group, role, reset) => {
75-
send("ADD_GROUP", { group, role, onDone: reset });
100+
onAddGroup={async (group, role, reset) => {
101+
await addGroupMutation.mutateAsync({
102+
templateId: template.id,
103+
groupId: group.id,
104+
role,
105+
});
106+
reset();
76107
}}
77-
isAddingGroup={state.matches("addingGroup")}
78-
onUpdateGroup={(group, role) => {
79-
send("UPDATE_GROUP_ROLE", { group, role });
108+
isAddingGroup={addGroupMutation.isLoading}
109+
onUpdateGroup={async (group, role) => {
110+
await updateGroupMutation.mutateAsync({
111+
templateId: template.id,
112+
groupId: group.id,
113+
role,
114+
});
115+
displaySuccess("Group role updated successfully!");
80116
}}
81-
updatingGroup={groupToBeUpdated}
82-
onRemoveGroup={(group) => {
83-
send("REMOVE_GROUP", { group });
117+
updatingGroupId={
118+
updateGroupMutation.isLoading
119+
? updateGroupMutation.variables?.groupId
120+
: undefined
121+
}
122+
onRemoveGroup={async (group) => {
123+
await removeGroupMutation.mutateAsync({
124+
groupId: group.id,
125+
templateId: template.id,
126+
role: "",
127+
});
128+
displaySuccess("Group removed successfully!");
84129
}}
85130
/>
86131
)}

site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPageView.tsx

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ export interface TemplatePermissionsPageViewProps {
161161
) => void;
162162
isAddingUser: boolean;
163163
onUpdateUser: (user: TemplateUser, role: TemplateRole) => void;
164-
updatingUser: TemplateUser | undefined;
164+
updatingUserId: TemplateUser["id"] | undefined;
165165
onRemoveUser: (user: TemplateUser) => void;
166166
// Group
167167
onAddGroup: (
@@ -171,7 +171,7 @@ export interface TemplatePermissionsPageViewProps {
171171
) => void;
172172
isAddingGroup: boolean;
173173
onUpdateGroup: (group: TemplateGroup, role: TemplateRole) => void;
174-
updatingGroup: TemplateGroup | undefined;
174+
updatingGroupId?: TemplateGroup["id"] | undefined;
175175
onRemoveGroup: (group: Group) => void;
176176
}
177177

@@ -185,13 +185,13 @@ export const TemplatePermissionsPageView: FC<
185185
// User
186186
onAddUser,
187187
isAddingUser,
188-
updatingUser,
188+
updatingUserId,
189189
onUpdateUser,
190190
onRemoveUser,
191191
// Group
192192
onAddGroup,
193193
isAddingGroup,
194-
updatingGroup,
194+
updatingGroupId,
195195
onUpdateGroup,
196196
onRemoveGroup,
197197
}) => {
@@ -265,9 +265,7 @@ export const TemplatePermissionsPageView: FC<
265265
<Cond condition={canUpdatePermissions}>
266266
<RoleSelect
267267
value={group.role}
268-
disabled={
269-
updatingGroup && updatingGroup.id === group.id
270-
}
268+
disabled={updatingGroupId === group.id}
271269
onChange={(event) => {
272270
onUpdateGroup(
273271
group,
@@ -313,9 +311,7 @@ export const TemplatePermissionsPageView: FC<
313311
<Cond condition={canUpdatePermissions}>
314312
<RoleSelect
315313
value={user.role}
316-
disabled={
317-
updatingUser && updatingUser.id === user.id
318-
}
314+
disabled={updatingUserId === user.id}
319315
onChange={(event) => {
320316
onUpdateUser(
321317
user,

0 commit comments

Comments
 (0)