Skip to content

Commit

Permalink
add user pagination
Browse files Browse the repository at this point in the history
  • Loading branch information
Prakharnagore committed Aug 11, 2024
1 parent cd7d127 commit e327646
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 9 deletions.
23 changes: 18 additions & 5 deletions src/controllers/UserController.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { NextFunction, Request, Response } from "express";
import { UserService } from "../services/UserService";
import { CreateUserRequest, UpdateUserRequest } from "../types";
import { validationResult } from "express-validator";
import {
CreateUserRequest,
UpdateUserRequest,
UserQueryParams,
} from "../types";
import { matchedData, validationResult } from "express-validator";
import createHttpError from "http-errors";
import { Logger } from "winston";

Expand Down Expand Up @@ -71,11 +75,20 @@ export class UserController {
}

async getAll(req: Request, res: Response, next: NextFunction) {
const validateQuery = matchedData(req, {
onlyValidData: true,
});
try {
const users = await this.userService.getAll();

const [users, count] = await this.userService.getAll(
validateQuery as UserQueryParams,
);
this.logger.info("All users have been fetched");
res.json(users);
res.json({
data: users,
currentPage: validateQuery.currentPage as number,
perPage: validateQuery.perPage as number,
total: count,
});
} catch (err) {
next(err);
}
Expand Down
5 changes: 4 additions & 1 deletion src/routes/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import { CreateUserRequest, UpdateUserRequest } from "../types";
import logger from "../config/logger";
import createUserValidator from "../validators/create-user-validator";
import updateUserValidator from "../validators/update-user-validator";
import listUsersValidator from "../validators/list-users-validator";
import { Request } from "express-jwt";

const router = express.Router();
const userRepository = AppDataSource.getRepository(User);
Expand Down Expand Up @@ -38,7 +40,8 @@ router.get(
"/",
authenticate as RequestHandler,
canAccess([Roles.ADMIN]),
(req, res, next) =>
listUsersValidator,
(req: Request, res: Response, next: NextFunction) =>
userController.getAll(req, res, next) as unknown as RequestHandler,
);

Expand Down
13 changes: 10 additions & 3 deletions src/services/UserService.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Repository } from "typeorm";
import { User } from "../entity/User";
import { LimitedUserData, UserData } from "../types";
import { LimitedUserData, UserData, UserQueryParams } from "../types";
import createHttpError from "http-errors";
import bcrypt from "bcryptjs";

Expand Down Expand Up @@ -82,9 +82,16 @@ export class UserService {
throw error;
}
}
async getAll() {
return await this.userRepository.find();
async getAll(validateQuery: UserQueryParams) {
const queryBuilder = this.userRepository.createQueryBuilder("user");
const result = await queryBuilder
.skip((validateQuery.currentPage - 1) * validateQuery.perPage)
.take(validateQuery.perPage)
.getManyAndCount();

return result;
}

async deleteById(userId: number) {
return await this.userRepository.delete(userId);
}
Expand Down
5 changes: 5 additions & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,8 @@ export interface LimitedUserData {
export interface UpdateUserRequest extends Request {
body: LimitedUserData;
}

export interface UserQueryParams {
perPage: number;
currentPage: number;
}
23 changes: 23 additions & 0 deletions src/validators/list-users-validator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { checkSchema } from "express-validator";

export default checkSchema(
{
currentPage: {
customSanitizer: {
options: (value) => {
const parsedValue = Number(value);
return Number.isNaN(parsedValue) ? 1 : parsedValue;
},
},
},
perPage: {
customSanitizer: {
options: (value) => {
const parsedValue = Number(value);
return Number.isNaN(parsedValue) ? 6 : parsedValue;
},
},
},
},
["query"],
);

0 comments on commit e327646

Please sign in to comment.