[NestJS] 게시물에 접근하는 권한 처리

·2023년 2월 14일
0

NestJS

목록 보기
5/6

유저와 게시물의 관계 형성

user.entity.ts

@OneToMany((type) => Board, (board) => board.user, { eager: true })
  boards: Board[];

board.entity.ts

@ManyToOne((type) => User, (user) => user.boards, { eager: false })
  user: User;

파라미터

  1. type : type => Board
    관계를 형성하려는 테이블
  2. inverseSide : (board) => board.user
    board에서 유저로 접근하려면 board.user로 접근해야함
  3. Option : { eager: true }
    user 정보를 가져올때 board도 같이 가져옴

게시물을 생성할 때 유저 정보 넣어주기

  1. 게시물 생성 요청
  2. 헤더 안에 있는 토큰으로 유저 정보
    UseGuards(AuthGuard())
  3. 유저 정보와 게시물 관계 형성하며 게시물 생성
    @GetUser() user: User

board.controller.ts

@Post()
  @UsePipes(ValidationPipe)
  createBoard(
    @Body() createBoardDto: CreateBoardDto,
    @GetUser() user: User, // 추가
  ): Promise<Board> {
    return this.boardsService.createBoard(createBoardDto, user); // 추가
  }

board.service.ts

createBoard(createBoardDto: CreateBoardDto, user: User): Promise<Board> {
    return this.boardRepository.createBoard(createBoardDto, user);
  }

board.repository.ts

@CustomRepository(Board)
export class BoardRepository extends Repository<Board> {
  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.controller.ts

@Get()
  getAllBoards(
  @GetUser() user: User, // 추가, user 정보를 줌
  ): Promise<Board[]> {
    return this.boardsService.getAllBoards(user);
  }
  • @GetUser() user: User, : user 정보를 줌

board.service.ts 참고사이트

async getAllBoards(user: User): Promise<Board[]> {
    const query = await this.boardRepository
      .createQueryBuilder('board')
      .where('board.userId = :userId', { userId: user.id });
    const boards = await query.getMany();
    return boards;
  }
  • .createQueryBuilder('board') : board 테이블에 접근
  • .where('board.userId = :userId', { userId: user.id });
    - board 테이블의 userId

    - user 테이블의 id
  • query.getMany() : 해당 id의 전체 게시물을 가져옴
    <-> query.getOne() : 해당 id의 게시물을 하나만 가져옴

결과

자신이 생성한 게시물 삭제하기

board.controller.ts

@Delete('/:id')
  deleteBoard(
    @GetUser() user: User, // 추가
    @Param('id', ParseIntPipe) id: number,
  ): Promise<void> {
    return this.boardsService.deleteBoard(id, user); // 추가
  }
  • @GetUser() user: User, : user 정보를 줌

board.service.ts 참고사이트

async deleteBoard(id: number, user: User): Promise<void> {
    const result = await this.boardRepository
      .createQueryBuilder('board')
      .delete()
      .from(Board)
      .where('userId = :userId', { userId: user.id })
      .andWhere('id = :id', { id: id })
      .execute();

    if (!result.affected) {
      throw new NotFoundException(`Can't find Board with id ${id}`);
    }
  }

결과 ======> 다른 유저가 게시물을 삭제하려 했을 때

Repository API와 Query Builder
간단한 CRUD는 Repository API로, 복잡한 조건이 있는 경우는 Query Builder로 구현한다.

profile
개발자가 되는 과정

0개의 댓글