도서
전체 도서 조회
전체도서조회입니다. query로 4개의 값을 받는데 이 중 필수적으로 받아야 하는 값들은 limit와 currentPage입니다. category_id는 카테고리별로 도서의 개수를 알고 싶을때, news는 현재 날짜로부터 1달이내에 출간된 도서를 조회하고 싶을때 받아서 사용합니다. 따라서 category_id와 news의 값이 있는 경우들을 if문으로 작성하여 기본적인 sql문( 모든책조회) 에 WHERE로 조건을 걸어주었습니다.
const allBooks = (req,res)=>{
const {category_id,news,limit,currentPage} = req.query;
// limit : page 당 도서 수 ex. 3
// currentPage : 현재 몇 페이지 ex. 1, 2, 3 ...
// offset : 0, 3, 6, 9, 12... ( limit * (currentPage-1) )
let offset = limit * (currentPage-1);
const values = [];
let sql = "SELECT *, (SELECT count(*) FROM likes WHERE books.id=liked_book_id) AS likes FROM books"
if(category_id&&news){
sql = sql + " WHERE category_id=? AND pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()"
values.push(category_id);
}
else if(category_id){
sql = sql + ` WHERE category_id=?`;
values.push(category_id);
}
else if(news){
sql = sql + " WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()"
}
values.push(Number(limit));
values.push(offset);
sql = sql + " LIMIT ? OFFSET ?";
conn.query(sql,values,
(err,results,fields)=>{
if(err){
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if(results)
return res.status(StatusCodes.OK).json(results);
else
return res.status(StatusCodes.NOT_FOUND).end();
})
};
페이지네이션
위의 코드 중 페이지네이션을 조금더 설명해보자면 limit는 페이지 당 도서의 개수이고 currentPage는 현재 몇 페이지인지를 알려주는 수 입니다. 즉, 페이지네이션을 구현하기 위해 limit와 currentPage를 받아주었고 그 값을 이용해 offset을 설정해주었습니다. offset은 어떤 데이터부터 시작할지 정해주는 기준점과 같습니다. 예를 들면 1~100까지 데이터가 있고 offset이 10(데이터베이스 상 데이터 순서때문에 10-1=9) 이면 10번째 행부터 데이터를 가져올 수 있습니다.
- limit : 페이지 당 도서 개수 ex) 4, 8, 12 등과 같은다양한 배수의 값들로 이루어짐
- currentPage : 현재 페이지 ex) 1,2,3 페이지 .. 등
- orrset : 조회를 시작할 기준점(가져올 데이터의 초기 위치값)
개별 도서 조회
개별 도서 조회입니다. like테이블을 이용해 개별 도서의 좋아요수, 좋아요여부를 알 기 위해 서브쿼리를 사용했습니다. COUNT함수를 사용해 좋아요갯수를 가져왔고 EXISTS함수를 이용해 좋아요여부를 알 수 있었습니다.
const bookDetail = (req,res)=>{
let {user_id} = req.body;
let book_id = req.params.id;
const sql = `SELECT *,
(SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes,
(SELECT EXISTS (SELECT * FROM likes WHERE user_id=? AND liked_book_id=?)) AS liked
FROM books LEFT OUTER JOIN category ON books.category_id=category.category_id WHERE books.id=?`;
const values = [user_id,book_id,book_id];
conn.query(sql,values,
(err,results,fields)=>{
if(err){
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if(results[0])
return res.status(StatusCodes.OK).json(results[0]);
else
return res.status(StatusCodes.NOT_FOUND).end();
})
};
좋아요
좋아요 추가입니다.
const addLike=(req,res)=>{
const {id}=req.params;
const {user_id}=req.body;
const sql = `INSERT INTO likes VALUES(?,?)`;
let values=[user_id, Number(id)];
conn.query(sql,values,
(err,results,fileds)=>{
if(err){
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(results);
})
}
좋아요 삭제입니다.
const removeLike = (req,res)=>{
const {id} = req.params;
const {user_id} = req.body;
const sql = `DELETE FROM likes WHERE user_id= ? AND liked_book_id=?`;
let value = [user_id,Number(id)]
conn.query(sql,value,
(err,results,fields)=>{
if(err){
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
})
}
'백엔드 > node.js(express)' 카테고리의 다른 글
도서주문관리 프로젝트 - 5. JWT적용, 예외처리(토큰만료) (2) | 2024.01.12 |
---|---|
도서주문관리 프로젝트 - 4.비동기(async-awiat)이용한 쿼리실행(주문) (0) | 2024.01.11 |
도서주문관리 프로젝트 - 2. 유저API(컨트롤러, 단뱡향암호화(crypto),jwt token) (1) | 2024.01.03 |
도서주문관리 프로젝트 - 1.API 설계(API,테이블) (0) | 2023.12.28 |
JWT (0) | 2023.12.26 |