[과제] StatesAirline Server

수민·2022년 12월 12일
0

code

목록 보기
27/47

구조 파악

1. statesairline

statesairline/app.js: 서비스에 필요한 미들웨어와 웹 서버를 실행

2. router

statesairline/router/ 안에 있는 파일: 작성된 라우터 내용을 통해 API 요청을 받을 수 있음. 구체적인 요청 수행 내용은 controller에서 받아옴

3. controller

statesairline/controller/ 안에 있는 파일: 정의된 API 요청을 수행하는 코드가 작성되어있음

4. repository

statesairline/repository/flightlist.js: 객체를 요소로 가지고 있는 배열 형태의 항공편 데이터
statesairline/repository/airportlist.js: 객체를 요소로 가지고 있는 배열 형태의 공항 데이터

작성한 코드

flightController.js

const flights = require("../repository/flightList");
const fs = require("fs");

module.exports = {
  // [GET] /flight
  // 요청 된 파라미터 departure_times, arrival_times 값과 동일한 값을 가진 항공편 데이터를 조회합니다.
  // 요청 된 파라미터 departure, destination 값과 동일한 값을 가진 항공편 데이터를 조회합니다.

  findAll: (req, res) => {
    const { departure_times, arrival_times, destination, departure } =
      req.query;

    if (departure_times && arrival_times) {
      const filteredFlights = flights.filter(
        (flight) =>
          flight.departure_times === departure_times &&
          flight.arrival_times === arrival_times
      );
      return res.status(200).json(filteredFlights);
    }

    if (destination && departure) {
      const filteredFlights = flights.filter(
        (flight) =>
          flight.destination === destination && flight.departure === departure
      );
      return res.status(200).json(filteredFlights);
    }

    return res.json(flights);
  },

  // [GET] /flight/:uuid
  // 요청 된 uuid 값과 동일한 uuid 값을 가진 항공편 데이터를 조회합니다.
  findById: (req, res) => {
    const { uuid } = req.params;

    if (uuid) {
      const filteredFlights = flights.filter((flight) => flight.uuid === uuid);
      return res.status(200).json(filteredFlights);
    }

    return res.json(flights);
  },
};

사실 flightController.js 안의 함수는 형식이 대체로 비슷비슷하다.
1. request를 통해 날아들어온 값이 있음 (req.query, req.params)
2. filter 함수를 통해 flight(전체 항공편 데이터)에 1과 같은 값을 가진 데이터를 걸러냄
3. response에 상태코드 200과 함께 2(filteredFlights)를 json 형태로 파싱하여 담아 보냄

그러면 req.params와 req.query의 차이점은 무엇일까?

req.qarams

이 속성은 명명된 경로 "parameter"에 매핑된 속성을 포함하는 객체입니다. 예를 들어 /user/:name 경로가 있는 경우 "name" 속성은 req.params.name에서 사용할 수 있습니다. 이 객체의 기본값은 {}입니다.

...공식 문서께서는 이렇게 말씀하고 계신다.

요청한 uuid에 해당하는 항공편을 조회할 때 사용하는 Request와 예시는 다음과 같다.

GET /flight/{:uuid}
GET /flight/af6fa55c-da65-47dd-af23-578fdba40bed

req.query

(공식문서)
이 속성은 경로에 있는 각 쿼리스트링의 파라미터에 대한 속성을 포함하는 개체입니다. 쿼리 파서를 사용하지 않도록 설정하면 빈 개체 {}이(가) 됩니다. 그렇지 않으면 구성된 쿼리 파서의 결과가 됩니다.

항공편을 조회하는 요청 방법은 다음과 같은데,
1. 파라미터가 없는 GET 요청은 저장되어있는 모든 항공편을 조회한다.
2. 추가적인 파라미터 (departure_times, arrival_times 등)를 사용하면 이에 해당하는 데이터가 포함된 항공편을 조회한다.

GET /flight
GET /flight?departure_times=2021-12-02T12:00:00&arrival_times=2021-12-03T12:00:00

즉 req.params를 사용할 때는 /flight/{:uuid}, req.query를 사용할 때는 GET /flight?departure_times={departure_times} &arrival_times={arrival_times}로 요청하는 형태가 다르다.

또한 req.params를 사용할 때는 파라미터로 uuid라는 고유 id값을, req.query를 사용할 때는 출발 시간, 도착 시간 등 고유하지 않은 값을 기준으로 하여 필터링하는 것을 볼 수 있다.

bookController.js

// POST /book에서 사용할 uuid입니다.
const { v4: uuid } = require("uuid");
// 항공편 예약 데이터를 저장합니다.
let booking = [];

module.exports = {
  // [GET] /book 요청을 수행합니다.
  // 전체 예약 데이터를 조회합니다.
  findAll: (req, res) => {
    return res.status(200).json(booking);
  },
  // [GET] /book/:phone 요청을 수행합니다.
  // 요청 된 phone과 동일한 phone 예약 데이터를 조회합니다.
  findByPhone: (req, res) => {
    const { phone } = req.params;
    if (phone) {
      const filteredBookings = booking.filter((el) => el.phone === phone);
      return res.status(200).json(filteredBookings);
    }

    return res.json(booking);
  },
  // [GET] /book/:phone/:flight_uuid 요청을 수행합니다.
  // 요청 된 id, phone과 동일한 uuid, phone 예약 데이터를 조회합니다.
  findByPhoneAndFlightId: (req, res) => {
    const { phone, flight_uuid } = req.params;
    if (phone && flight_uuid) {
      const filteredBookings = booking.filter(
        (el) => el.flight_uuid === flight_uuid && el.phone === phone
      );
      return res.status(200).json(filteredBookings);
    }

    return res.json(booking);
  },

  // [POST] /book 요청을 수행합니다.
  // 요청 된 예약 데이터를 저장합니다.
  create: (req, res) => {
    // POST /book에서 사용할 booking_uuid입니다.
    const booking_uuid = uuid();
    const newBooking = {
      booking_uuid: booking_uuid,
      flight_uuid: req.body.flight_uuid,
      name: req.body.name,
      phone: req.body.phone,
    };
    booking.push(newBooking);
    return res.status(201).json(booking);
  },

  // Optional
  // [DELETE] /book/:booking_uuid 요청을 수행합니다.
  // 요청 된 id, phone 값과 동일한 예약 데이터를 삭제합니다.
  deleteByBookingId: (req, res) => {
    const { booking_uuid } = req.params;
    if (booking_uuid) {
      const filteredBookings = booking.filter(
        (el) => el.booking_uuid === booking_uuid
      );
      booking.splice(booking.indexOf(filteredBookings) - 1, 1);
    }

    return res.status(204).json(booking);
  },
};


출처블로그: https://velog.io/@zemma0618/%EA%B3%BC%EC%A0%9C-StatesAirline-Server
profile
헬창목표

0개의 댓글