Nest js 로 저기어때 만들기2

강준호·2024년 2월 23일

NestJs

목록 보기
5/6

Room 추가

//accommodations.controller 에 추가.

  @Post(':accommodationId/rooms')
  @Private('partner')
  addRoom(
    @DPartner() partner: Partner,
    @Body() dto: AccommodationsAddRoomDto,
    @Param('accommodationId', ParseIntPipe) accommodationId: number,
  ) {
    return this.accommodationsService.addRoomToAccommodation(
      partner,
      accommodationId,
      dto,
    );
  }

  @Delete(':accommodationId/rooms/:roomId')
  @Private('partner')
  deleteRoom(
    @DPartner() partner: Partner,
    @Param('accommodationId', ParseIntPipe) accommodationId: number,
    @Param('roomId', ParseIntPipe) roomId: number,
  ) {
    return this.accommodationsService.deleteRoomFromAccommodation(
      partner,
      accommodationId,
      roomId,
    );
  }
  • rooms 는 partner 만 post, delete 할 수 있음. => @Private() 로 가드처리.

accommodations.service.ts


  async addRoomToAccommodation(
    partner: Pick<Partner, 'id'>,
    accommodationId: Accommodation['id'],
    data: Parameters<typeof this.roomsService.createRoom>[1], 
// 그냥 Prisma.RoomCreateWithoutAccommodationInput 쓰는거보다 안전하게 사용하는법,
  ) {
    // 1.지금 요청한 partner가 숙소에 대한 소유자가 맞는지 확인.
    //아니면 돌아가~
    const accommodation = await this.prismaService.accommodation.findUnique({
      where: { id: accommodationId, partnerId: partner.id }, //한번에 두개 받아서 통으로 검사
    });

    if (!accommodation) throw new ForbiddenException();

    //  2. 숙소에 방을 추가하기
    const room = await this.roomsService.createRoom(accommodationId, data);

    return room;
  }
  • createRoom 은 rooms 의 service 에 분리해서 작성하는게 좋다.

rooms.service.ts

@Injectable()
export class RoomsService {
  constructor(private readonly prismaService: PrismaService) {}

  async createRoom(
    accommodationId: Accommodation['id'],
    dataWithoutAccommodationId: Prisma.RoomCreateWithoutAccommodationInput,
  ) {
    const data: Prisma.RoomUncheckedCreateInput = {
      accommodationId,
      ...dataWithoutAccommodationId,
    };
    const room = await this.prismaService.room.create({ data });

    return room;
  }

  async deleteRoom(roomId: Room['id']) {
    const room = await this.prismaService.room.delete({
      where: { id: roomId },
    });

    return room;
  }

Seed 생성

0개의 댓글