BookStore - 도서 API

데브코스

목록 보기
65/133

도서 API 설계

- 전체 도서 목록에는 도서 상세 정보 포함함 → 필요한 데이터만 선별하여 구현 필요
- 전체 도서 조회 (이미지 경로 n개씩, limit/offset FE에서 req로 줌)
    - Method : GET
    - URL : /books?limit={page당 도서 수}&currentPage={현재 page}
    - HTTP status : 200(성공),
    - Req
    - Res :
        
        {
        
        {
        
        id : 
        
        title : 
        
        img : picksum imge id
        
        summary : 
        
        author : 
        
        price : 
        
        likes : 
        
        pubDate : 출간일
        
        }, 
        
        {
        
        id : 
        
        title : 
        
        img : picksum imge id
        
        summary : 
        
        author : 
        
        price : 
        
        likes : 
        
        pubDate : 출간일
        
        }, …
        
        }
        
- 개별 도서 조회 (이미지 경로)
    - Method : GET
    - URL : /books/{bookid}
    - HTTP status : 200(성공),
    - Req :
    - Res :
        
        {
        
        id : 
        
        title :
        
        img : picksum imge id
        
        category : 
        
        format : 
        
        isbn :  
        
        summary : 
        
        description : 
        
        author : 
        
        pages : 
        
        index : 목차
        
        price : 
        
        likes : 
        
        liked : 내가 좋아요 했는지
        
        pubDate : 출간일
        
        }
        
- 카테고리별 도서 목록 조회 (카테고리 id 보내줘야함)
    - Method : GET
        
        //new에 따라 신간조회 true⇒ 신간 (출간일 1 이내 기준)
        
    - URL : /books?**categoryid={categoryid}** &new={boolean}
    - HTTP status : 200(성공),
    - Req
    - Res :
        
        {
        
        {
        
        id : 
        
        title : 
        
        img : picksum imge id
        
        summary : 
        
        author : 
        
        price : 
        
        likes : 
        
        pubDate : 출간일
        
        }, 
        
        {
        
        id : 
        
        title : 
        
        img : picksum imge id
        
        summary : 
        
        author : 
        
        price : 
        
        likes : 
        
        pubDate : 출간일
        
        }, …
        
        }

bookeController.js

const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');

const allBooks = (req, res) => {
    let { category_id, news, limit, currentPage } = req.query;

    // limit : page 당 도서 수 , currentPage : 현재 페이지의 번호
    // offset : limit * (currentPage-1)
    let offset = limit * (currentPage-1);
    let sql = "SELECT * FROM books";
    let values = [];
    if (category_id && news) {
        sql += " WHERE category_id = ? AND pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW();";
        values = [category_id];
    }
    else if (category_id) {
        sql += " WHERE category_id = ?";
        values = [category_id];
    }
    else if (news) {
        sql += " WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW();";
    }
    sql += " LIMIT ? OFFSET ?";
    values.push(parseInt(limit), offset);

    conn.query(sql, values,
        (err, results) => {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            if (results.length)
                return res.status(StatusCodes.CREATED).json(results);
            else
                return res.status(StatusCodes.NOT_FOUND).end();
        })

};

const bookDetail = (req, res) => {
    let { id } = req.params;

    let sql = `SELECT * FROM books LEFT JOIN category ON books.category_id = category.id WHERE books.id = 1;`;
    conn.query(sql, id,
        (err, results) => {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            if (results[0])
                return res.status(StatusCodes.CREATED).json(results[0]);
            else
                return res.status(StatusCodes.NOT_FOUND).end();
        })
};

module.exports = { allBooks, bookDetail };

카테고리 API 설계

categoryController.js

const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');

const allCategory = (req, res) => {
    let sql = "SELECT * FROM category";
    conn.query(sql, (err, results) => {
        if (err) {
            console.log(err);
            return res.status(StatusCodes.BAD_REQUEST).end();
        }

        return res.status(StatusCodes.CREATED).json(results);
    })
};

module.exports = {
    allCategory
};

category.js (라우터)

const express = require('express');
const { allCategory } = require('../controller/categoryController')
const router = express.Router();

router.use(express.json());

router.get('/', allCategory); // 전체 카테고리 조회

module.exports = router
profile
Dive Head First | Work Super Hard | Attract Great People

0개의 댓글