Skip to content

Commit

Permalink
feat: add get user by id endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolaspearson committed Mar 8, 2021
1 parent da96cf9 commit 611d297
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 6 deletions.
6 changes: 6 additions & 0 deletions api.http
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,9 @@ Content-Type: application/json
"lastName": "Doe",
"password": "secret"
}

### Get user by id
GET {{baseUrl}}/user/1 HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{token}}
6 changes: 3 additions & 3 deletions src/common/dto/req/find-user-by-id.req.dto.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { IsNotEmpty, IsNumber } from 'class-validator';
import { IsNotEmpty, IsNumberString } from 'class-validator';

export class FindUserByIdReqDto {
@IsNumber()
@IsNumberString()
@IsNotEmpty()
readonly id!: number;
readonly id!: number | string;
}
21 changes: 19 additions & 2 deletions src/user/user.controller.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,22 @@
import * as express from 'express';

import { LoginReqDto, RegisterUserReqDto, UserResDto } from '@/common/dto';
import { FindUserByIdReqDto, LoginReqDto, RegisterUserReqDto, UserResDto } from '@/common/dto';
import { validationMiddleware } from '@/middleware/validation.middleware';
import { login, register } from '@/user/user.service';
import { findUserById, login, register } from '@/user/user.service';
import { safe } from '@/utils/express.utils';

/**
* GET /user/:id
*
* @param req The http request.
* @param res The http response.
*/
async function getUserById(req: express.Request, res: express.Response) {
const { id } = req.params;
const user = await findUserById({ id });
res.status(200).json(new UserResDto(user));
}

/**
* POST /user/login
*
Expand Down Expand Up @@ -34,6 +46,11 @@ async function postRegister(req: express.Request, res: express.Response) {
/** The /user routes. */
export default express
.Router()
.get(
'/:id',
validationMiddleware(FindUserByIdReqDto, 'Invalid user id provided.', 'params'),
safe(getUserById)
)
.post(
'/login',
validationMiddleware(LoginReqDto, 'Invalid email address or password.'),
Expand Down
7 changes: 6 additions & 1 deletion src/user/user.service.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
import Boom from 'boom';
import { getCustomRepository } from 'typeorm';

import { LoginReqDto, RegisterUserReqDto } from '@/common/dto';
import { FindUserByIdReqDto, LoginReqDto, RegisterUserReqDto } from '@/common/dto';
import { CookieUser } from '@/common/models/cookie-user.model';
import { User } from '@/db/entities/user.entity';
import { UserRepository } from '@/db/repositories/user.repository';
import { createCookie } from '@/utils/cookie.utils';
import { encryptPassword, validatePassword } from '@/utils/password.utils';
import { createTokenPayload } from '@/utils/token.utils';

export async function findUserById(findUserByIdReqDto: FindUserByIdReqDto): Promise<User> {
const userRepository = getCustomRepository(UserRepository);
return userRepository.findByIdOrFail(Number(findUserByIdReqDto.id));
}

export async function login(loginReqDto: LoginReqDto): Promise<CookieUser> {
const userRepository = getCustomRepository(UserRepository);
const user: User = await userRepository.findByEmailOrFail(loginReqDto.email);
Expand Down

0 comments on commit 611d297

Please sign in to comment.