From abaddd94a51236dc3615763e57a92a489fb66025 Mon Sep 17 00:00:00 2001 From: mirarifhasan Date: Thu, 25 Jan 2024 17:50:25 +0600 Subject: [PATCH] feat: fetchAllUsersV2 added with search-sort-offset pagination --- .../src/admin/admin.service.ts | 17 +++++++++ .../src/admin/infra.resolver.ts | 21 ++++++++++ .../src/user/user.service.ts | 38 +++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/packages/hoppscotch-backend/src/admin/admin.service.ts b/packages/hoppscotch-backend/src/admin/admin.service.ts index 6ba983a12..c4e1c579d 100644 --- a/packages/hoppscotch-backend/src/admin/admin.service.ts +++ b/packages/hoppscotch-backend/src/admin/admin.service.ts @@ -56,6 +56,23 @@ export class AdminService { return allUsers; } + /** + * Fetch all the users in the infra. + * @param searchString search on users displayName or email + * @param paginationOption pagination options + * @returns an Either of array of user or error + */ + async fetchUsersV2( + searchString: string, + paginationOption: OffsetPaginationArgs, + ) { + const allUsers = await this.userService.fetchAllUsersV2( + searchString, + paginationOption, + ); + return allUsers; + } + /** * Invite a user to join the infra. * @param adminUID Admin's UID diff --git a/packages/hoppscotch-backend/src/admin/infra.resolver.ts b/packages/hoppscotch-backend/src/admin/infra.resolver.ts index 348ec6cf5..459c95c84 100644 --- a/packages/hoppscotch-backend/src/admin/infra.resolver.ts +++ b/packages/hoppscotch-backend/src/admin/infra.resolver.ts @@ -79,6 +79,7 @@ export class InfraResolver { @ResolveField(() => [User], { description: 'Returns a list of all the users in infra', + deprecationReason: 'Use allUsersV2 instead', }) @UseGuards(GqlAuthGuard, GqlAdminGuard) async allUsers(@Args() args: PaginationArgs): Promise { @@ -86,6 +87,26 @@ export class InfraResolver { return users; } + @ResolveField(() => [User], { + description: 'Returns a list of all the users in infra', + }) + @UseGuards(GqlAuthGuard, GqlAdminGuard) + async allUsersV2( + @Args({ + name: 'searchString', + nullable: true, + description: 'Search on users displayName or email', + }) + searchString: string, + @Args() paginationOption: OffsetPaginationArgs, + ): Promise { + const users = await this.adminService.fetchUsersV2( + searchString, + paginationOption, + ); + return users; + } + @ResolveField(() => [InvitedUser], { description: 'Returns a list of all the invited users', }) diff --git a/packages/hoppscotch-backend/src/user/user.service.ts b/packages/hoppscotch-backend/src/user/user.service.ts index 196c47182..864beb6e2 100644 --- a/packages/hoppscotch-backend/src/user/user.service.ts +++ b/packages/hoppscotch-backend/src/user/user.service.ts @@ -15,6 +15,7 @@ import { PubSubService } from 'src/pubsub/pubsub.service'; import { stringToJson, taskEitherValidateArraySeq } from 'src/utils'; import { UserDataHandler } from './user.data.handler'; import { User as DbUser } from '@prisma/client'; +import { OffsetPaginationArgs } from 'src/types/input-types.args'; @Injectable() export class UserService { @@ -296,6 +297,43 @@ export class UserService { return fetchedUsers; } + /** + * Fetch all the users in the `User` table based on cursor + * @param searchString search on user's displayName or email + * @param paginationOption pagination options + * @returns an array of `User` object + */ + async fetchAllUsersV2( + searchString: string, + paginationOption: OffsetPaginationArgs, + ) { + const fetchedUsers = await this.prisma.user.findMany({ + skip: paginationOption.skip, + take: paginationOption.take, + where: searchString + ? { + OR: [ + { + displayName: { + contains: searchString, + mode: 'insensitive', + }, + }, + { + email: { + contains: searchString, + mode: 'insensitive', + }, + }, + ], + } + : undefined, + orderBy: [{ isAdmin: 'desc' }, { displayName: 'asc' }], + }); + + return fetchedUsers; + } + /** * Fetch the number of users in db * @returns a count (Int) of user records in DB