feat: added pagination on fetchInvitedUsers

This commit is contained in:
mirarifhasan
2024-01-25 16:22:30 +06:00
committed by Andrew Bastin
parent 3ff6cc53bb
commit 88bca2057a
5 changed files with 45 additions and 16 deletions

View File

@@ -89,15 +89,6 @@ export class AdminResolver {
return users; return users;
} }
@ResolveField(() => [InvitedUser], {
description: 'Returns a list of all the invited users',
deprecationReason: 'Use `infra` query instead',
})
async invitedUsers(@Parent() admin: Admin): Promise<InvitedUser[]> {
const users = await this.adminService.fetchInvitedUsers();
return users;
}
@ResolveField(() => [Team], { @ResolveField(() => [Team], {
description: 'Returns a list of all the teams in the infra', description: 'Returns a list of all the teams in the infra',
deprecationReason: 'Use `infra` query instead', deprecationReason: 'Use `infra` query instead',

View File

@@ -18,6 +18,7 @@ import {
} from '../errors'; } from '../errors';
import { ShortcodeService } from 'src/shortcode/shortcode.service'; import { ShortcodeService } from 'src/shortcode/shortcode.service';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { OffsetPaginationArgs } from 'src/types/input-types.args';
const mockPrisma = mockDeep<PrismaService>(); const mockPrisma = mockDeep<PrismaService>();
const mockPubSub = mockDeep<PubSubService>(); const mockPubSub = mockDeep<PubSubService>();
@@ -62,17 +63,23 @@ const invitedUsers: InvitedUsers[] = [
describe('AdminService', () => { describe('AdminService', () => {
describe('fetchInvitedUsers', () => { describe('fetchInvitedUsers', () => {
test('should resolve right and return an array of invited users', async () => { test('should resolve right and return an array of invited users', async () => {
const paginationArgs: OffsetPaginationArgs = { take: 10, skip: 0 };
// eslint-disable-next-line @typescript-eslint/ban-ts-comment // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore // @ts-ignore
mockPrisma.user.findMany.mockResolvedValue([]);
// @ts-ignore
mockPrisma.invitedUsers.findMany.mockResolvedValue(invitedUsers); mockPrisma.invitedUsers.findMany.mockResolvedValue(invitedUsers);
const results = await adminService.fetchInvitedUsers(); const results = await adminService.fetchInvitedUsers(paginationArgs);
expect(results).toEqual(invitedUsers); expect(results).toEqual(invitedUsers);
}); });
test('should resolve left and return an empty array if invited users not found', async () => { test('should resolve left and return an empty array if invited users not found', async () => {
const paginationArgs: OffsetPaginationArgs = { take: 10, skip: 0 };
mockPrisma.invitedUsers.findMany.mockResolvedValue([]); mockPrisma.invitedUsers.findMany.mockResolvedValue([]);
const results = await adminService.fetchInvitedUsers(); const results = await adminService.fetchInvitedUsers(paginationArgs);
expect(results).toEqual([]); expect(results).toEqual([]);
}); });
}); });

View File

@@ -27,6 +27,7 @@ import { TeamInvitationService } from '../team-invitation/team-invitation.servic
import { TeamMemberRole } from '../team/team.model'; import { TeamMemberRole } from '../team/team.model';
import { ShortcodeService } from 'src/shortcode/shortcode.service'; import { ShortcodeService } from 'src/shortcode/shortcode.service';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { OffsetPaginationArgs } from 'src/types/input-types.args';
@Injectable() @Injectable()
export class AdminService { export class AdminService {
@@ -144,7 +145,7 @@ export class AdminService {
* Fetch the list of invited users by the admin. * Fetch the list of invited users by the admin.
* @returns an Either of array of `InvitedUser` object or error * @returns an Either of array of `InvitedUser` object or error
*/ */
async fetchInvitedUsers() { async fetchInvitedUsers(paginationOption: OffsetPaginationArgs) {
const userEmailObjs = await this.prisma.user.findMany({ const userEmailObjs = await this.prisma.user.findMany({
select: { select: {
email: true, email: true,
@@ -152,6 +153,11 @@ export class AdminService {
}); });
const pendingInvitedUsers = await this.prisma.invitedUsers.findMany({ const pendingInvitedUsers = await this.prisma.invitedUsers.findMany({
take: paginationOption.take,
skip: paginationOption.skip,
orderBy: {
invitedOn: 'desc',
},
where: { where: {
NOT: { NOT: {
inviteeEmail: { inviteeEmail: {

View File

@@ -17,7 +17,10 @@ import { AuthUser } from 'src/types/AuthUser';
import { throwErr } from 'src/utils'; import { throwErr } from 'src/utils';
import * as E from 'fp-ts/Either'; import * as E from 'fp-ts/Either';
import { Admin } from './admin.model'; import { Admin } from './admin.model';
import { PaginationArgs } from 'src/types/input-types.args'; import {
OffsetPaginationArgs,
PaginationArgs,
} from 'src/types/input-types.args';
import { InvitedUser } from './invited-user.model'; import { InvitedUser } from './invited-user.model';
import { Team } from 'src/team/team.model'; import { Team } from 'src/team/team.model';
import { TeamInvitation } from 'src/team-invitation/team-invitation.model'; import { TeamInvitation } from 'src/team-invitation/team-invitation.model';
@@ -86,8 +89,10 @@ export class InfraResolver {
@ResolveField(() => [InvitedUser], { @ResolveField(() => [InvitedUser], {
description: 'Returns a list of all the invited users', description: 'Returns a list of all the invited users',
}) })
async invitedUsers(): Promise<InvitedUser[]> { async invitedUsers(
const users = await this.adminService.fetchInvitedUsers(); @Args() args: OffsetPaginationArgs,
): Promise<InvitedUser[]> {
const users = await this.adminService.fetchInvitedUsers(args);
return users; return users;
} }
@@ -306,7 +311,9 @@ export class InfraResolver {
}) })
providerInfo: EnableAndDisableSSOArgs[], providerInfo: EnableAndDisableSSOArgs[],
) { ) {
const isUpdated = await this.infraConfigService.enableAndDisableSSO(providerInfo); const isUpdated = await this.infraConfigService.enableAndDisableSSO(
providerInfo,
);
if (E.isLeft(isUpdated)) throwErr(isUpdated.left); if (E.isLeft(isUpdated)) throwErr(isUpdated.left);
return true; return true;

View File

@@ -17,3 +17,21 @@ export class PaginationArgs {
}) })
take: number; take: number;
} }
@ArgsType()
@InputType()
export class OffsetPaginationArgs {
@Field({
nullable: true,
defaultValue: 0,
description: 'Number of items to skip',
})
skip: number;
@Field({
nullable: true,
defaultValue: 10,
description: 'Number of items to fetch',
})
take: number;
}