From 704211933bd60fddde90621d55a91a77a299b8b0 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Mon, 12 Aug 2024 20:48:28 +0000 Subject: [PATCH 1/2] fix: use insert and update instead of upsert --- site/src/api/api.ts | 19 +++++++++- site/src/api/queries/roles.ts | 18 ++++++++- .../CustomRolesPage/CreateEditRolePage.tsx | 38 ++++++++++++++----- .../CreateEditRolePageView.tsx | 6 +-- 4 files changed, 65 insertions(+), 16 deletions(-) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 397f5e0378d75..5c21d64b9c4be 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -603,11 +603,26 @@ class ApiMethods { /** * @param organization Can be the organization's ID or name */ - patchOrganizationRole = async ( + createOrganizationRole = async ( organization: string, role: TypesGen.Role, ): Promise => { - const response = await this.axios.patch( + const response = await this.axios.post( + `/api/v2/organizations/${organization}/members/roles`, + role, + ); + + return response.data; + }; + + /** + * @param organization Can be the organization's ID or name + */ + updateOrganizationRole = async ( + organization: string, + role: TypesGen.Role, + ): Promise => { + const response = await this.axios.put( `/api/v2/organizations/${organization}/members/roles`, role, ); diff --git a/site/src/api/queries/roles.ts b/site/src/api/queries/roles.ts index b3572efcaed52..e4b555926ca45 100644 --- a/site/src/api/queries/roles.ts +++ b/site/src/api/queries/roles.ts @@ -23,13 +23,27 @@ export const organizationRoles = (organization: string) => { }; }; -export const patchOrganizationRole = ( +export const createOrganizationRole = ( queryClient: QueryClient, organization: string, ) => { return { mutationFn: (request: Role) => - API.patchOrganizationRole(organization, request), + API.createOrganizationRole(organization, request), + onSuccess: async (updatedRole: Role) => + await queryClient.invalidateQueries( + getRoleQueryKey(organization, updatedRole.name), + ), + }; +}; + +export const updateOrganizationRole = ( + queryClient: QueryClient, + organization: string, +) => { + return { + mutationFn: (request: Role) => + API.updateOrganizationRole(organization, request), onSuccess: async (updatedRole: Role) => await queryClient.invalidateQueries( getRoleQueryKey(organization, updatedRole.name), diff --git a/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePage.tsx b/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePage.tsx index 6bbe37c58a813..a28bb4854bccf 100644 --- a/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePage.tsx +++ b/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePage.tsx @@ -4,8 +4,12 @@ import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router-dom"; import { getErrorMessage } from "api/errors"; import { organizationPermissions } from "api/queries/organizations"; -import { patchOrganizationRole, organizationRoles } from "api/queries/roles"; -import type { PatchRoleRequest } from "api/typesGenerated"; +import { + organizationRoles, + createOrganizationRole, + updateOrganizationRole, +} from "api/queries/roles"; +import type { CustomRoleRequest } from "api/typesGenerated"; import { displayError } from "components/GlobalSnackbar/utils"; import { Loader } from "components/Loader/Loader"; import { pageTitle } from "utils/page"; @@ -22,8 +26,11 @@ export const CreateEditRolePage: FC = () => { const { organizations } = useOrganizationSettings(); const organization = organizations?.find((o) => o.name === organizationName); const permissionsQuery = useQuery(organizationPermissions(organization?.id)); - const patchOrganizationRoleMutation = useMutation( - patchOrganizationRole(queryClient, organizationName), + const createOrganizationRoleMutation = useMutation( + createOrganizationRole(queryClient, organizationName), + ); + const updateOrganizationRoleMutation = useMutation( + updateOrganizationRole(queryClient, organizationName), ); const { data: roleData, isLoading } = useQuery( organizationRoles(organizationName), @@ -47,18 +54,31 @@ export const CreateEditRolePage: FC = () => { { + onSubmit={async (data: CustomRoleRequest) => { try { - await patchOrganizationRoleMutation.mutateAsync(data); - navigate(`/organizations/${organizationName}/roles`); + if (role) { + await updateOrganizationRoleMutation.mutateAsync(data); + navigate(`/organizations/${organizationName}/roles`); + } else { + await createOrganizationRoleMutation.mutateAsync(data); + navigate(`/organizations/${organizationName}/roles`); + } } catch (error) { displayError( getErrorMessage(error, "Failed to update custom role"), ); } }} - error={patchOrganizationRoleMutation.error} - isLoading={patchOrganizationRoleMutation.isLoading} + error={ + role + ? updateOrganizationRoleMutation.error + : createOrganizationRoleMutation.error + } + isLoading={ + role + ? updateOrganizationRoleMutation.isLoading + : createOrganizationRoleMutation.isLoading + } organizationName={organizationName} canAssignOrgRole={permissions.assignOrgRole} /> diff --git a/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx b/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx index 5d23d2e69a500..d1918f48a8b9a 100644 --- a/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx +++ b/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx @@ -20,7 +20,7 @@ import { isApiValidationError } from "api/errors"; import { RBACResourceActions } from "api/rbacresources_gen"; import type { Role, - PatchRoleRequest, + CustomRoleRequest, Permission, AssignableRoles, RBACResource, @@ -38,7 +38,7 @@ const validationSchema = Yup.object({ export type CreateEditRolePageViewProps = { role: AssignableRoles | undefined; - onSubmit: (data: PatchRoleRequest) => void; + onSubmit: (data: CustomRoleRequest) => void; error?: unknown; isLoading: boolean; organizationName: string; @@ -58,7 +58,7 @@ export const CreateEditRolePageView: FC = ({ const navigate = useNavigate(); const onCancel = () => navigate(-1); - const form = useFormik({ + const form = useFormik({ initialValues: { name: role?.name || "", display_name: role?.display_name || "", From 161ee268dd7d24a14a3b13f3ad6018ec2f09be84 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Tue, 13 Aug 2024 16:29:54 +0000 Subject: [PATCH 2/2] fix: cleanup --- .../CustomRolesPage/CreateEditRolePage.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePage.tsx b/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePage.tsx index a28bb4854bccf..1bb6fd9418820 100644 --- a/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePage.tsx +++ b/site/src/pages/ManagementSettingsPage/CustomRolesPage/CreateEditRolePage.tsx @@ -58,11 +58,10 @@ export const CreateEditRolePage: FC = () => { try { if (role) { await updateOrganizationRoleMutation.mutateAsync(data); - navigate(`/organizations/${organizationName}/roles`); } else { await createOrganizationRoleMutation.mutateAsync(data); - navigate(`/organizations/${organizationName}/roles`); } + navigate(`/organizations/${organizationName}/roles`); } catch (error) { displayError( getErrorMessage(error, "Failed to update custom role"),