유저와 게시물 데이터의 관계 형성

유저와 게시물의 관계는 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

 

'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

+ Recent posts