Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: implement pagination on find all team members endpoint #1312

Open
wants to merge 13 commits into
base: dev
Choose a base branch
from
11 changes: 3 additions & 8 deletions src/modules/teams/teams.controller.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, HttpStatus } from '@nestjs/common';
import { Controller, Get, Post, Body, Patch, Param, Query, Delete, UseGuards, HttpStatus } from '@nestjs/common';
import { TeamsService } from './teams.service';
import { CreateTeamDto } from './dto/create-team.dto';
import { UpdateTeamDto } from './dto/update-team.dto';
import { SuperAdminGuard } from '@guards/super-admin.guard';
import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiBearerAuth } from '@nestjs/swagger';
import { TeamMemberResponseDto } from './dto/team.response.dto';

@ApiTags('Teams')
@Controller('teams')
export class TeamsController {
Expand Down Expand Up @@ -40,12 +39,8 @@ export class TeamsController {
},
},
})
async findAll(): Promise<{ message: string; data: TeamMemberResponseDto[] }> {
const teamMembers = await this.teamsService.findAllTeamMembers();
return {
message: 'Team members retrieved successfully',
data: teamMembers,
};
async findAllTeamMembers(@Query('page') page: number, @Query('page_size') pageSize: number) {
return await this.teamsService.findAllTeamMembers({ page, pageSize });
}

@Get(':id')
Expand Down
30 changes: 27 additions & 3 deletions src/modules/teams/teams.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,33 @@ export class TeamsService {
}
}

async findAllTeamMembers(): Promise<TeamMemberResponseDto[]> {
const teamMembers = await this.teamRepository.find();
return teamMembers.map(this.mapTeamToResponseDto);
async findAllTeamMembers({ page = 1, pageSize = 10 }: { page: number; pageSize: number }) {
const skip = (page - 1) * pageSize;
const [teamMembers, total] = await this.teamRepository.findAndCount({ skip, take: pageSize });

const transformedTeamMembers: TeamMemberResponseDto[] = teamMembers.map(member => ({
id: member.id,
name: member.name,
title: member.title,
description: member.description,
image: member.image,
socials: {
facebook: member.facebook,
twitter: member.twitter,
instagram: member.instagram,
},
}));

return {
status_code: HttpStatus.OK,
message: 'Team members retrieved successfully',
data: {
team_members: transformedTeamMembers,
total,
page,
pageSize,
},
};
}

async findOneTeamMember(id: string): Promise<TeamMemberResponseDto> {
Expand Down
51 changes: 31 additions & 20 deletions src/modules/teams/tests/teams.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ describe('TeamsService', () => {
find: jest.fn(),
findOne: jest.fn(),
delete: jest.fn(),
findAndCount: jest.fn(),
},
},
],
Expand Down Expand Up @@ -68,7 +69,7 @@ describe('TeamsService', () => {
});

describe('findAllTeamMembers', () => {
it('should return an array of team members', async () => {
it('should return a paginated response of team members', async () => {
const teams = [
{
id: '1',
Expand All @@ -95,27 +96,37 @@ describe('TeamsService', () => {
updated_at: new Date(),
},
];
const teamResponseDtos: TeamMemberResponseDto[] = [
{
id: '1',
name: 'John Doe',
title: '',
description: '',
image: '',
socials: { facebook: '', twitter: '', instagram: '' },
},
{
id: '2',
name: 'Jane Doe',
title: '',
description: '',
image: '',
socials: { facebook: '', twitter: '', instagram: '' },

const total = 2;
const page = 1;
const pageSize = 10;

const expectedResponse = {
status_code: HttpStatus.OK,
message: 'Team members retrieved successfully',
data: {
team_members: teams.map(member => ({
id: member.id,
name: member.name,
title: member.title,
description: member.description,
image: member.image,
socials: {
facebook: member.facebook,
twitter: member.twitter,
instagram: member.instagram,
},
})) as TeamMemberResponseDto[],
total,
page,
pageSize,
},
];
jest.spyOn(repo, 'find').mockResolvedValue(teams as Team[]);
};

jest.spyOn(repo, 'findAndCount').mockResolvedValue([teams as Team[], total]);

expect(await service.findAllTeamMembers()).toEqual(teamResponseDtos);
const result = await service.findAllTeamMembers({ page, pageSize });
expect(result).toEqual(expectedResponse);
});
});

Expand Down