see restaurant, see all restaurants,

김종민·2022년 7월 4일
0

Nuber-Server

목록 보기
22/34


들어가기
restaurantId를 통해서 하나의 restaurant를 보는 API
등록된 모든 restaurant를 보는 API
(input으로는 page, return은 Restaurnat[], totalPAges, totalResults등)

1. dtos/restaurant.dto.ts

restaurantId를 input으로 입력받아서 reztaurant 하나를 찾음.

import { Field, InputType, Int, ObjectType } from '@nestjs/graphql';
import { MutationOutput } from 'src/common/dtos/output.dto';
import { Restaurant } from '../entities/restaurant.entity';

@InputType()
export class RestaurantInput {
  @Field(() => Int)
  restaurantId: number;
}

@ObjectType()
export class RestaurantOutput extends MutationOutput {
  @Field(() => Restaurant, { nullable: true })
  restaurant?: Restaurant;
}

2. Resolver

  @Query(() => RestaurantOutput)
  restaurant(
    @Args('input') restaurantInput: RestaurantInput,
  ): Promise<RestaurantOutput> {
    return this.restaurantService.findRestaurantById(restaurantInput);
  }

3. Service

  async findRestaurantById({
    restaurantId,
  }: RestaurantInput): Promise<RestaurantOutput> {
    try {
      const restaurant = await this.restaurants.findOne(restaurantId);
      if (!restaurant) {
        return {
          ok: false,
          error: 'Restaurant not found',
        };
      }
      return {
        ok: true,
        restaurant,
      };
    } catch {
      return {
        ok: false,
        error: 'Could not find restaurant',
      };
    }
  }

특별히 어려울것 없음.

4. restaurants.dto.ts

PaginationInput의 page 말고는 input없음.
등록된 모든 식당을 보는 API

import { Field, InputType, ObjectType } from '@nestjs/graphql';
import {
  PaginationInput,
  PaginationOutPut,
} from 'src/common/dtos/pagination.dto';
import { Restaurant } from '../entities/restaurant.entity';

@InputType()
export class RestaurantsInput extends PaginationInput {}

@ObjectType()
export class RestaurantsOutput extends PaginationOutPut {
  @Field(() => [Restaurant], { nullable: true })
  results?: Restaurant[];
}

5. Resolver

  @Query(() => RestaurantsOutput)
  restaurants(
    @Args('input') restaurantsInput: RestaurantsInput,
  ): Promise<RestaurantsOutput> {
    return this.restaurantService.allRestaurants(restaurantsInput);
  }
  

6. Service

  async allRestaurants({ page }: RestaurantsInput): Promise<RestaurantsOutput> {
    try {
      const [restaurants, totalResults] = await this.restaurants.findAndCount({
        skip: (page - 1) * 25,
        take: 25,   ///25개씩 pagination을 구현해 놓음.
      });
      ///findAndCount는 찾은 restaurant와  그 수를 return해준다.
      ///[restaurants, totalResults] --> 이걸로 find 와 count를 받음.
      
      return {
        ok: true,
        results: restaurants,
        totalPages: Math.ceil(totalResults / 25),  ///Math.ceil은 소수점 날려줌.
        totalResults,
      };
    } catch {
      return {
        ok: false,
        error: 'Could not load restaurants',
      };
    }
  }

크게 어려운거 없이 반복이니까 한번 봐 놓을것.
findAndCount, Math.ceil

profile
코딩하는초딩쌤

0개의 댓글