diff --git a/packages/backend/src/graphql/queries/get-user.js b/packages/backend/src/graphql/queries/get-user.js deleted file mode 100644 index 61b0e753..00000000 --- a/packages/backend/src/graphql/queries/get-user.js +++ /dev/null @@ -1,17 +0,0 @@ -import User from '../../models/user.js'; - -const getUser = async (_parent, params, context) => { - context.currentUser.can('read', 'User'); - - return await User.query() - .leftJoinRelated({ - role: true, - }) - .withGraphFetched({ - role: true, - }) - .findById(params.id) - .throwIfNotFound(); -}; - -export default getUser; diff --git a/packages/backend/src/graphql/queries/get-user.test.js b/packages/backend/src/graphql/queries/get-user.test.js deleted file mode 100644 index 2a742c48..00000000 --- a/packages/backend/src/graphql/queries/get-user.test.js +++ /dev/null @@ -1,146 +0,0 @@ -import { describe, it, expect, beforeEach } from 'vitest'; -import request from 'supertest'; -import app from '../../app'; -import createAuthTokenByUserId from '../../helpers/create-auth-token-by-user-id'; -import Crypto from 'crypto'; -import { createRole } from '../../../test/factories/role'; -import { createPermission } from '../../../test/factories/permission'; -import { createUser } from '../../../test/factories/user'; - -describe('graphQL getUser query', () => { - describe('and without permissions', () => { - it('should throw not authorized error', async () => { - const userWithoutPermissions = await createUser(); - const anotherUser = await createUser(); - - const query = ` - query { - getUser(id: "${anotherUser.id}") { - id - email - } - } - `; - - const token = createAuthTokenByUserId(userWithoutPermissions.id); - - const response = await request(app) - .post('/graphql') - .set('Authorization', token) - .send({ query }) - .expect(200); - - expect(response.body.errors).toBeDefined(); - expect(response.body.errors[0].message).toEqual('Not authorized!'); - }); - }); - - describe('and correct permissions', () => { - let role, currentUser, anotherUser, token, requestObject; - - beforeEach(async () => { - role = await createRole({ - key: 'sample', - name: 'sample', - }); - - await createPermission({ - action: 'read', - subject: 'User', - roleId: role.id, - }); - - currentUser = await createUser({ - roleId: role.id, - }); - - anotherUser = await createUser({ - roleId: role.id, - }); - - token = createAuthTokenByUserId(currentUser.id); - requestObject = request(app).post('/graphql').set('Authorization', token); - }); - - it('should return user data for a valid user id', async () => { - const query = ` - query { - getUser(id: "${anotherUser.id}") { - id - email - fullName - email - createdAt - updatedAt - role { - id - name - } - } - } - `; - - const response = await requestObject.send({ query }).expect(200); - - const expectedResponsePayload = { - data: { - getUser: { - createdAt: anotherUser.createdAt.getTime().toString(), - email: anotherUser.email, - fullName: anotherUser.fullName, - id: anotherUser.id, - role: { id: role.id, name: role.name }, - updatedAt: anotherUser.updatedAt.getTime().toString(), - }, - }, - }; - - expect(response.body).toEqual(expectedResponsePayload); - }); - - it('should not return user password for a valid user id', async () => { - const query = ` - query { - getUser(id: "${anotherUser.id}") { - id - email - password - } - } - `; - - const response = await requestObject.send({ query }).expect(400); - - expect(response.body.errors).toBeDefined(); - expect(response.body.errors[0].message).toEqual( - 'Cannot query field "password" on type "User".' - ); - }); - - it('should return not found for invalid user id', async () => { - const invalidUserId = Crypto.randomUUID(); - - const query = ` - query { - getUser(id: "${invalidUserId}") { - id - email - fullName - email - createdAt - updatedAt - role { - id - name - } - } - } - `; - - const response = await requestObject.send({ query }).expect(200); - - expect(response.body.errors).toBeDefined(); - expect(response.body.errors[0].message).toEqual('NotFoundError'); - }); - }); -}); diff --git a/packages/backend/src/graphql/query-resolvers.js b/packages/backend/src/graphql/query-resolvers.js index 0337e009..48d4ac97 100644 --- a/packages/backend/src/graphql/query-resolvers.js +++ b/packages/backend/src/graphql/query-resolvers.js @@ -13,7 +13,6 @@ import getPermissionCatalog from './queries/get-permission-catalog.ee.js'; import getSamlAuthProviderRoleMappings from './queries/get-saml-auth-provider-role-mappings.ee.js'; import getStepWithTestExecutions from './queries/get-step-with-test-executions.js'; import getTrialStatus from './queries/get-trial-status.ee.js'; -import getUser from './queries/get-user.js'; import getUsers from './queries/get-users.js'; import listSamlAuthProviders from './queries/list-saml-auth-providers.ee.js'; import testConnection from './queries/test-connection.js'; @@ -34,7 +33,6 @@ const queryResolvers = { getSamlAuthProviderRoleMappings, getStepWithTestExecutions, getTrialStatus, - getUser, getUsers, listSamlAuthProviders, testConnection, diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index b83de58e..eec816d3 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -29,7 +29,6 @@ type Query { getNotifications: [Notification] getSamlAuthProviderRoleMappings(id: String!): [SamlAuthProvidersRoleMapping] getTrialStatus: GetTrialStatus - getUser(id: String!): User getUsers(limit: Int!, offset: Int!): UserConnection listSamlAuthProviders: [ListSamlAuthProvider] } diff --git a/packages/web/src/graphql/queries/get-user.js b/packages/web/src/graphql/queries/get-user.js deleted file mode 100644 index e4821786..00000000 --- a/packages/web/src/graphql/queries/get-user.js +++ /dev/null @@ -1,18 +0,0 @@ -import { gql } from '@apollo/client'; -export const GET_USER = gql` - query GetUser($id: String!) { - getUser(id: $id) { - id - fullName - email - role { - id - key - name - isAdmin - } - createdAt - updatedAt - } - } -`; diff --git a/packages/web/src/hooks/useUser.js b/packages/web/src/hooks/useUser.js index df05c73c..ec31c0e7 100644 --- a/packages/web/src/hooks/useUser.js +++ b/packages/web/src/hooks/useUser.js @@ -1,19 +1,17 @@ -import * as React from 'react'; -import { useLazyQuery } from '@apollo/client'; -import { GET_USER } from 'graphql/queries/get-user'; -export default function useUser(userId) { - const [getUser, { data, loading }] = useLazyQuery(GET_USER); - React.useEffect(() => { - if (userId) { - getUser({ - variables: { - id: userId, - }, +import { useQuery } from '@tanstack/react-query'; +import api from 'helpers/api'; + +export default function useUser({ userId }) { + const query = useQuery({ + queryKey: ['user', userId], + queryFn: async ({ signal }) => { + const { data } = await api.get(`/v1/admin/users/${userId}`, { + signal, }); - } - }, [userId]); - return { - user: data?.getUser, - loading, - }; + return data; + }, + enabled: !!userId, + }); + + return query; } diff --git a/packages/web/src/pages/EditUser/index.jsx b/packages/web/src/pages/EditUser/index.jsx index c13d04b4..596f5933 100644 --- a/packages/web/src/pages/EditUser/index.jsx +++ b/packages/web/src/pages/EditUser/index.jsx @@ -28,7 +28,8 @@ export default function EditUser() { const formatMessage = useFormatMessage(); const [updateUser, { loading }] = useMutation(UPDATE_USER); const { userId } = useParams(); - const { user, loading: userLoading } = useUser(userId); + const { data: userData, loading: isUserLoading } = useUser({ userId }); + const user = userData?.data; const { data, loading: isRolesLoading } = useRoles(); const roles = data?.data; const enqueueSnackbar = useEnqueueSnackbar(); @@ -73,7 +74,7 @@ export default function EditUser() { - {userLoading && ( + {isUserLoading && ( @@ -82,7 +83,7 @@ export default function EditUser() { )} - {!userLoading && ( + {!isUserLoading && (