From 6e529a42054ac1d9d2c16354fd4855f1ae4271f4 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Thu, 19 Sep 2024 09:17:14 +0000 Subject: [PATCH 1/4] feat: use REST API endpoint to update user --- packages/web/src/hooks/useAdminUpdateUser.js | 21 ++++++++++++++++++ packages/web/src/pages/EditUser/index.jsx | 23 ++++++-------------- 2 files changed, 28 insertions(+), 16 deletions(-) create mode 100644 packages/web/src/hooks/useAdminUpdateUser.js diff --git a/packages/web/src/hooks/useAdminUpdateUser.js b/packages/web/src/hooks/useAdminUpdateUser.js new file mode 100644 index 00000000..dbe5d005 --- /dev/null +++ b/packages/web/src/hooks/useAdminUpdateUser.js @@ -0,0 +1,21 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import api from 'helpers/api'; + +export default function useAdminUpdateRole(userId) { + const queryClient = useQueryClient(); + + const query = useMutation({ + mutationFn: async (payload) => { + const { data } = await api.patch(`/v1/admin/users/${userId}`, payload); + + return data; + }, + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: ['admin', 'users'], + }); + }, + }); + + return query; +} diff --git a/packages/web/src/pages/EditUser/index.jsx b/packages/web/src/pages/EditUser/index.jsx index 779badb2..79d0fe1e 100644 --- a/packages/web/src/pages/EditUser/index.jsx +++ b/packages/web/src/pages/EditUser/index.jsx @@ -9,7 +9,6 @@ import MuiTextField from '@mui/material/TextField'; import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; import * as React from 'react'; import { useNavigate, useParams } from 'react-router-dom'; -import { useQueryClient } from '@tanstack/react-query'; import Can from 'components/Can'; import Container from 'components/Container'; @@ -18,9 +17,9 @@ import Form from 'components/Form'; import PageTitle from 'components/PageTitle'; import TextField from 'components/TextField'; import * as URLS from 'config/urls'; -import { UPDATE_USER } from 'graphql/mutations/update-user.ee'; import useFormatMessage from 'hooks/useFormatMessage'; import useRoles from 'hooks/useRoles.ee'; +import useAdminUpdateUser from 'hooks/useAdminUpdateUser'; import useAdminUser from 'hooks/useAdminUser'; function generateRoleOptions(roles) { @@ -29,31 +28,23 @@ function generateRoleOptions(roles) { export default function EditUser() { const formatMessage = useFormatMessage(); - const [updateUser, { loading }] = useMutation(UPDATE_USER); const { userId } = useParams(); + const { mutateAsync: updateUser, isPending: isAdminUpdateUserPending } = + useAdminUpdateUser(userId); const { data: userData, isLoading: isUserLoading } = useAdminUser({ userId }); const user = userData?.data; const { data, isLoading: isRolesLoading } = useRoles(); const roles = data?.data; const enqueueSnackbar = useEnqueueSnackbar(); const navigate = useNavigate(); - const queryClient = useQueryClient(); const handleUserUpdate = async (userDataToUpdate) => { try { await updateUser({ - variables: { - input: { - id: userId, - fullName: userDataToUpdate.fullName, - email: userDataToUpdate.email, - role: { - id: userDataToUpdate.role?.id, - }, - }, - }, + fullName: userDataToUpdate.fullName, + email: userDataToUpdate.email, + roleId: userDataToUpdate.role?.id, }); - queryClient.invalidateQueries({ queryKey: ['admin', 'users'] }); enqueueSnackbar(formatMessage('editUser.successfullyUpdated'), { variant: 'success', @@ -142,7 +133,7 @@ export default function EditUser() { variant="contained" color="primary" sx={{ boxShadow: 2 }} - loading={loading} + loading={isAdminUpdateUserPending} data-test="update-button" > {formatMessage('editUser.submit')} From 266d4cddb0e67e327725cf0ade766bc9ec415b9e Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Thu, 19 Sep 2024 09:18:00 +0000 Subject: [PATCH 2/4] chore: remove redundant update user mutation --- .../backend/src/graphql/mutation-resolvers.js | 2 -- .../src/graphql/mutations/update-user.ee.js | 27 ------------------- packages/backend/src/graphql/schema.graphql | 8 ------ .../src/graphql/mutations/update-user.ee.js | 10 ------- 4 files changed, 47 deletions(-) delete mode 100644 packages/backend/src/graphql/mutations/update-user.ee.js delete mode 100644 packages/web/src/graphql/mutations/update-user.ee.js diff --git a/packages/backend/src/graphql/mutation-resolvers.js b/packages/backend/src/graphql/mutation-resolvers.js index b17acdd2..06449fca 100644 --- a/packages/backend/src/graphql/mutation-resolvers.js +++ b/packages/backend/src/graphql/mutation-resolvers.js @@ -1,6 +1,5 @@ // Converted mutations import executeFlow from './mutations/execute-flow.js'; -import updateUser from './mutations/update-user.ee.js'; import verifyConnection from './mutations/verify-connection.js'; import updateCurrentUser from './mutations/update-current-user.js'; import generateAuthUrl from './mutations/generate-auth-url.js'; @@ -15,7 +14,6 @@ const mutationResolvers = { resetConnection, updateConnection, updateCurrentUser, - updateUser, verifyConnection, }; diff --git a/packages/backend/src/graphql/mutations/update-user.ee.js b/packages/backend/src/graphql/mutations/update-user.ee.js deleted file mode 100644 index 0e27eedb..00000000 --- a/packages/backend/src/graphql/mutations/update-user.ee.js +++ /dev/null @@ -1,27 +0,0 @@ -import User from '../../models/user.js'; - -const updateUser = async (_parent, params, context) => { - context.currentUser.can('update', 'User'); - - const userPayload = { - email: params.input.email, - fullName: params.input.fullName, - }; - - try { - context.currentUser.can('update', 'Role'); - - userPayload.roleId = params.input.role.id; - } catch { - // void - } - - const user = await User.query().patchAndFetchById( - params.input.id, - userPayload - ); - - return user; -}; - -export default updateUser; diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index a0e394c8..710ad2e8 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -8,7 +8,6 @@ type Mutation { resetConnection(input: ResetConnectionInput): Connection updateConnection(input: UpdateConnectionInput): Connection updateCurrentUser(input: UpdateCurrentUserInput): User - updateUser(input: UpdateUserInput): User verifyConnection(input: VerifyConnectionInput): Connection } @@ -241,13 +240,6 @@ input UserRoleInput { id: String } -input UpdateUserInput { - id: String! - fullName: String - email: String - role: UserRoleInput -} - input UpdateCurrentUserInput { email: String password: String diff --git a/packages/web/src/graphql/mutations/update-user.ee.js b/packages/web/src/graphql/mutations/update-user.ee.js deleted file mode 100644 index c73d8f1d..00000000 --- a/packages/web/src/graphql/mutations/update-user.ee.js +++ /dev/null @@ -1,10 +0,0 @@ -import { gql } from '@apollo/client'; -export const UPDATE_USER = gql` - mutation UpdateUser($input: UpdateUserInput) { - updateUser(input: $input) { - id - email - fullName - } - } -`; From 25176884e7b04b6b24e27cee9fe4851576aef039 Mon Sep 17 00:00:00 2001 From: Jakub P Date: Thu, 19 Sep 2024 21:10:35 +0200 Subject: [PATCH 3/4] fix: add missing snackbar on user update error --- packages/web/src/hooks/useAdminUpdateUser.js | 13 +++++++++++++ packages/web/src/locales/en.json | 3 ++- packages/web/src/pages/EditUser/index.jsx | 1 - 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/web/src/hooks/useAdminUpdateUser.js b/packages/web/src/hooks/useAdminUpdateUser.js index dbe5d005..370a39da 100644 --- a/packages/web/src/hooks/useAdminUpdateUser.js +++ b/packages/web/src/hooks/useAdminUpdateUser.js @@ -1,8 +1,12 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import api from 'helpers/api'; +import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; +import useFormatMessage from 'hooks/useFormatMessage'; export default function useAdminUpdateRole(userId) { const queryClient = useQueryClient(); + const enqueueSnackbar = useEnqueueSnackbar(); + const formatMessage = useFormatMessage(); const query = useMutation({ mutationFn: async (payload) => { @@ -15,6 +19,15 @@ export default function useAdminUpdateRole(userId) { queryKey: ['admin', 'users'], }); }, + onError: () => { + enqueueSnackbar(formatMessage('editUser.error'), { + variant: 'error', + persist: true, + SnackbarProps: { + 'data-test': 'snackbar-error', + }, + }); + } }); return query; diff --git a/packages/web/src/locales/en.json b/packages/web/src/locales/en.json index 95576fde..8e0a4d1e 100644 --- a/packages/web/src/locales/en.json +++ b/packages/web/src/locales/en.json @@ -223,11 +223,12 @@ "createUser.submit": "Create", "createUser.successfullyCreated": "The user has been created.", "createUser.invitationEmailInfo": "Invitation email will be sent if SMTP credentials are valid. Otherwise, you can share the invitation link manually: ", - "createUser.error": "Error while creating the user", + "createUser.error": "Error while creating the user.", "editUserPage.title": "Edit user", "editUser.status": "Status", "editUser.submit": "Update", "editUser.successfullyUpdated": "The user has been updated.", + "editUser.error": "Error while updating the user.", "userList.fullName": "Full name", "userList.email": "Email", "userList.role": "Role", diff --git a/packages/web/src/pages/EditUser/index.jsx b/packages/web/src/pages/EditUser/index.jsx index 79d0fe1e..becbb854 100644 --- a/packages/web/src/pages/EditUser/index.jsx +++ b/packages/web/src/pages/EditUser/index.jsx @@ -1,4 +1,3 @@ -import { useMutation } from '@apollo/client'; import LoadingButton from '@mui/lab/LoadingButton'; import Grid from '@mui/material/Grid'; import Skeleton from '@mui/material/Skeleton'; From 0bad2ead101c3ce0f3b9799074395848ef1feb7c Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 20 Sep 2024 13:09:36 +0300 Subject: [PATCH 4/4] chore: Fix typo for useAdminUpdateUser hook --- packages/web/src/hooks/useAdminUpdateUser.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web/src/hooks/useAdminUpdateUser.js b/packages/web/src/hooks/useAdminUpdateUser.js index 370a39da..d971f252 100644 --- a/packages/web/src/hooks/useAdminUpdateUser.js +++ b/packages/web/src/hooks/useAdminUpdateUser.js @@ -3,7 +3,7 @@ import api from 'helpers/api'; import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; import useFormatMessage from 'hooks/useFormatMessage'; -export default function useAdminUpdateRole(userId) { +export default function useAdminUpdateUser(userId) { const queryClient = useQueryClient(); const enqueueSnackbar = useEnqueueSnackbar(); const formatMessage = useFormatMessage(); @@ -27,7 +27,7 @@ export default function useAdminUpdateRole(userId) { 'data-test': 'snackbar-error', }, }); - } + }, }); return query;