StatesAirline Server 는 Express 프레임워크를 이용해 만들고,
클라이언트의 요청에 따라 항공편과 예약 데이터를 조회, 생성, 수정, 그리고 삭제하는 기능을 수행할 수 있어야 한다
참고
- Express 프레임워크에서 Query String, Params를 사용하는 방법을 확인하세요. Query String , Params를 기준으로 데이터를 필터링하는 코드를 작성해야 합니다.
- 예약 데이터는 controller/bookController.js 안에 작성된 let booking = []; 배열에 저장해야 합니다.
const express = require('express');
const cors = require('cors');
const app = express();
const port = 3001;
const flightRouter = require('./router/flightRouter');
const bookRouter = require('./router/bookRouter');
const airportRouter = require('./router/airportRouter');
app.use(cors());
app.use(express.json());
app.use('/flight', flightRouter);
app.use('/book', bookRouter);
app.use('/airport', airportRouter);
....
app.js 에 가서 보면 app.use를 통해서 flightRouter, bookRouter, airportRouter에 분기점을 만들어 준 것을 알 수 있다
router.js 파일에 가서 보면 controller안의 파일들에서 작성된 함수를 가져와서 실행 시켜준다
const { findAll } = require('../controller/airportController');
const express = require('express');
const router = express.Router();
router.get('/', findAll);
module.exports = router;
정리하자면
controller 함수 -> router.js -> app.js 로 불려져서 사용되기 때문에
flightController.js와 bookController.js 에 코드를 작성해서 항공편과 예약 데이터를 조회, 생성, 수정, 그리고 삭제하는 기능을 구현하면 된다
클라이언트가 /flight?departure_times={departure_times}을 입력하면 동일한 값을 가진 departure_times 데이터를 보여줘야 하고
나머지 arrival_times, destination, departure 에 대해서도 동일한 값을 가진 데이터를 보여줘야 한다
클라이언트가 입력한 정보와 가지고 있는 데이터를 비교하면 된다
클라이언트가 입력한 정보는 req.query
만약 /flight?departure=CJU&destination=ICN 이라는 입력값을 받으면 req.query는 { departure: 'CJU', destination: 'ICN' } 객체형태로 나온다
flightList
안의 데이터 와 비교하면 된다
똑같은 id 값을 filter로 걸러준 뒤 변수(data)에 할당한다
만약 data의 길이가 0보다 길다면 데이터를 보내주고 아니면 에러를 보내준다
const { filter } = require('../repository/flightList');
const flights = require('../repository/flightList');
module.exports = {
// [GET] /flight
// 요청 된 departure_times, arrival_times, destination, departure
// 값과 동일한 값을 가진 항공편 데이터를 조회합니다.
findAll: (req, res) => {
console.log('req.query :',req.query)
//{ departure: 'CJU', destination: 'ICN' }
let list = flights
if(req.query.departure_times){ // req.query가 departure_times 이면
list = list.filter((item) =>{
return req.query.departure_times === item.departure_times
})
// flightList 배열 안의 객체값 departure_times이 입력받은 값과 같은 것 만 골라서 list에 넣어준다
}
if(req.query.arrival_times){
list = list.filter((item) =>{
return req.query.arrival_times === item.arrival_times
})
}
if(req.query.destination){
list = list.filter((item) => {
return req.query.destination === item.destination
})
}
if(req.query.departure){
list = list.filter((item)=>{
return req.query.departure === item.departure
})
}
return res.status(200).json(list);
},
// [GET] /flight/:id
// 요청 된 id 값과 동일한 uuid 값을 가진 항공편 데이터를 조회합니다.
findById: (req, res) => {
console.log('req.params :', req.params)
// { id: 'af6fa55c-da65-47dd-af23-578fdba42bed' }
// findAll과 다르게
// id 값을 가져올 수 있는 params를 사용해야 한다
let list = flights
if(req.params){
list = list.filter((item) =>{
return req.params.id === item.uuid
})
}
return res.status(200).json(list)
},
// [PUT] /flight/:id 요청을 수행합니다.
// 요청 된 id 값과 동일한 uuid 값을 가진 항공편 데이터를 요청 된 Body 데이터로 수정합니다.
update: (req, res) => {
let data = flights.filter((item) => req.params.id === item.uuid );
if(data.length > 0){
return res.status(200).json(data)
}else{
return res.status(400).json(null)
}
}
};
위에 구현했던 findAll과 비슷한 방법으로 구현하면 된다
여기서 주의할건 테스트케이스에서 배열안의 객체를 요구하기 때문에 스프레드 연산자를 사용해줬다
● Book Router › GET /book?phone=010-1234-5678 요청은 번호에 해당하는 예약 내역을 반환해야 합니다
Expected: {"flight_uuid": "af6fa55c-da65-47dd-af23-578fdba44bed", "name": "김코딩", "phone": "010-1234-5678"}
요청으로 받아온 데이터를 booking에 담아주면 된다
요청으로 받아온 값과 똑같은 데이터만 삭제해야 하므로
똑같지 않은것만 필터로 걸러 booking에 할당한다
const flights = require('../repository/flightList');
// 항공편 예약 데이터를 저장합니다.
let booking = [];
module.exports = {
// [GET] /book 요청을 수행합니다.
// 전체 데이터 혹은 요청 된 flight_uuid, phone 값과 동일한 예약 데이터를 조회합니다.
findById: (req, res) => {
// TODO:
let list = booking
if(req.query.flight_uuid){
list = booking.filter((item) => {
return req.query.flight_uuid === item.flight_uuid})
return res.status(200).json(list)
}
if(req.query.phone){
list = booking.filter((item) => {
return req.query.phone === item.phone})
return res.status(200).json(...list)
}
return res.status(200).json(list);
},
// [POST] /book 요청을 수행합니다.
// 요청 된 예약 데이터를 저장합니다.
// 응답으로는 book_id를 리턴합니다.
// Location Header로 예약 아이디를 함께 보내준다면 RESTful한 응답에 더욱 적합합니다.
// 참고 링크: https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#useful-post-responses
create: (req, res) => {
// TODO:
booking.push(req.body)
return res.status(201).json({});
},
// [DELETE] /book?phone={phone} 요청을 수행합니다.
// 요청 된 phone 값과 동일한 예약 데이터를 삭제합니다.
deleteById: (req, res) => {
// TODO:
booking = booking.filter(item => req.query.phone !== item.phone)
return res.status(200).json(booking);
}
};