유저와 게시물 데이터의 관계 형성
유저와 게시물의 관계는 one to many의 관계를 가지고 있다. 한 명의 유저는 여러 게시글을 작성할 수 있기 때문이다.
User Entity 관계 추가
@Entity()
@Unique(['username'])
export class User extends BaseEntity {
...
@OneToMany(type => Board, board => board.user, {eager: true})
boards: Board[];
}
Board Entity 관계 추가
@Entity()
export class Board extends BaseEntity {
...
@ManyToOne(type => User, user => user.boards, {eager: false})
user: User;
}
게시물 생성할 때 유저 정보 넣어주기
아래 플로우로 게시물을 생성하면 된다.
게시물 생성 요청 -> 헤더안에 있는 토큰으로 유저 정보 -> 유저 정보와 게시물 관계 형성하며 게시물 생성
board repository 수정
export class BoardRepository extends Repository<Board> {
constructor(dataSource: DataSource) {
super(Board, dataSource.createEntityManager());
}
async createBoard(createBoardDto: CreateBoardDto, user: User): Promise<Board> {
const {title, description} = createBoardDto;
const board = this.create({
title,
description,
status: BoardStatus.PUBLIC,
user // 추가
})
await this.save(board);
return board;
}
}
board service 수정
export class BoardService {
...
createBoard(createBoardDto: CreateBoardDto, user: User): Promise<Board> {
return this.boardRepository.createBoard(createBoardDto, user);
}
}
board controller 수정
export class BoardsController {
...
@Post()
@UsePipes(ValidationPipe)
createBoard(
@Body() createBoardDto: CreateBoardDto,
@GetUser() user: User,
): Promise<Board> {
return this.boardsService.createBoard(createBoardDto, user);
}
}
테스트
해당 유저의 게시물만 가져오기
controller 수정
@Get()
getAllBoard(
@GetUser() user: User,
): Promise<Board[]> {
return this.boardsService.getAllBoards(user);
}
service 수정
async getAllBoards(user: User): Promise<Board[]> {
const query = this.boardRepository.createQueryBuilder('board');
query.where('board.userId = :userId', {userId: user.id});
const boards = await query.getMany();
return boards;
}
테스트
토큰에 있는 유저가 작성한 게시글만 response로 오는 모습
자신이 생성한 게시물 삭제하기
controller 수정
@Delete('/:id')
deleteBoard(
@Param('id', ParseIntPipe) id: number,
@GetUser() user: User
): Promise<void> {
return this.boardsService.deleteBoard(id, user);
}
service 수정
async deleteBoard(id: number, user: User): Promise<void> {
const result = await this.boardRepository.delete({id, user});
if(result.affected === 0) {
throw new NotFoundException(`Can't find Board with id ${id}`);
}
}
테스트
4번 게시글이 삭제된 모습이다.
Reference
- https://docs.nestjs.com/
- https://docs.nestjs.com/techniques/database
- https://orkhan.gitbook.io/typeorm/docs/select-query-builder
'Javascript' 카테고리의 다른 글
로그인 기능 구현 (0) | 2024.07.21 |
---|---|
Nest.js를 이용한 게시판 API 개발 (0) | 2024.07.21 |
Nest.js Pipes (0) | 2024.06.17 |
[Nest.js] Module (0) | 2024.06.11 |
ES6 (0) | 2024.06.05 |