
๐ฏ API์ JWT๋ฅผ ๋ฐ์์ค๋ ๊ฒ์ ์ ์ฉ์ํค๊ณ , try/catch๋ฅผ ํตํด ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.

์์ ํ ๋ถ๋ถ์ ์ฃผํฉ์ ๊ธ์จ๋ก ๋ํ๋
๋๋ค.
Method : POST
URL : /likes/:bookId
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Response Body : x
Method : DELETE
URL : /likes/:bookId
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Response Body : x

Method : POST
URL : /orders
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Request Body
{
"items": [ ์ฅ๋ฐ๊ตฌ๋ ๋์ id, ์ฅ๋ฐ๊ตฌ๋ ๋์ id, ...],
"delivery" : {
"address" : "์ฃผ์",
"receiver" : "์ด๋ฆ",
"contact" : "์ ํ๋ฒํธ"
},
"totalQuantity" : ์ด ์๋,
"totalPrice" : ์ด ๊ธ์ก,
"firstbookTitle" : "๋ํ ๋์ ์ ๋ชฉ"
}
Method : GET
URL : /orders
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Response Body :
[
{
"order_id" : ์ฃผ๋ฌธ id,
"created_at" : "์ฃผ๋ฌธ์ผ์",
"address" : "์ฃผ์",
"receiver" : "์ด๋ฆ",
"contact" : "์ ํ๋ฒํธ",
"book_title" : "๋ํ ์ฑ
์ ๋ชฉ",
"total_quantity" : ์ด ์๋,
"total_price" : ๊ฒฐ์ ๊ธ์ก,
},
{
"order_id" : ์ฃผ๋ฌธ id,
"created_at" : "์ฃผ๋ฌธ์ผ์",
"address" : "์ฃผ์",
"receiver" : "์ด๋ฆ",
"contact" : "์ ํ๋ฒํธ",
"book_title" : "๋ํ ์ฑ
์ ๋ชฉ",
"total_quantity" : ์ด ์๋,
"total_price" : ๊ฒฐ์ ๊ธ์ก,
},
...
]
Method : GET
URL : /orders/:id
HTTP Status Code : 200 Ok
Request Body : x
Response Body :
[
{
"book_id" : ๋์ id,
"title" : "๋์ ์ ๋ชฉ",
"author" : "์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"quantity" : ์๋
},
{
"book_id" : ๋์ id,
"title" : "๋์ ์ ๋ชฉ",
"author" : "์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"quantity" : ์๋
},
...
]

Method : POST
URL : /carts
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Request Body
{
"bookId" : ๋์ id,
"quantity" : ์๋,
}
Method : GET
URL : /carts
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Request Body :
{
"selected" : [cartItemId, cartItemId ...]
}
[
{
"id" : ์ฅ๋ฐ๊ตฌ๋ id,
"bookId" : ๋์ id,
"title" : "๋์ ์ ๋ชฉ",
"summary" : "์์ฝ ์ค๋ช
",
"quantity" : ์๋,
"price" : ๊ฐ๊ฒฉ
},
{
"id" : ์ฅ๋ฐ๊ตฌ๋ id,
"bookId" : ๋์ id,
"title" : "๋์ ์ ๋ชฉ",
"summary" : "์์ฝ ์ค๋ช
",
"quantity" : ์๋,
"price" : ๊ฐ๊ฒฉ
},
]
Method : DELETE
URL : /carts/:cartItemId
HTTP Status Code : 200 Ok
Request Body : x
Response Body : x
const jwt = require('jsonwebtoken');
const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');
const dotenv = require('dotenv');
dotenv.config();
const addLike = (req, res) => {
const likedBookId = req.params.id;
let authorization = ensureAuthorization(req, res);
if (authorization instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: '๋ก๊ทธ์ธ ์ธ์
์ด ๋ง๋ฃ๋์์ต๋๋ค. ๋ค์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.',
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.BAD_REQUEST).json({
message: '์๋ชป๋ ํ ํฐ์
๋๋ค.',
});
} else {
const sql = 'INSERT INTO likes (user_id, liked_book_id) VALUES (?, ?)';
const values = [authorization.id, likedBookId];
conn.query(sql, values, (err, result) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.CREATED).json(result);
});
}
};
const removeLike = (req, res) => {
const likedBookId = req.params.id;
let authorization = ensureAuthorization(req, res);
if (authorization instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({
message: '๋ก๊ทธ์ธ ์ธ์
์ด ๋ง๋ฃ๋์์ต๋๋ค. ๋ค์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.',
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.BAD_REQUEST).json({
message: '์๋ชป๋ ํ ํฐ์
๋๋ค.',
});
} else {
const sql = 'DELETE FROM likes WHERE user_id =? AND liked_book_id = ?';
const values = [authorization.id, likedBookId];
conn.query(sql, values, (err, result) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(result);
});
}
};
function ensureAuthorization(req, res) {
try {
let receivedJwt = req.headers['authorization'];
let decodedJwt = jwt.verify(receivedJwt, process.env.PRIVATE_KEY);
return decodedJwt;
} catch (error) {
return error;
}
}
module.exports = {
addLike,
removeLike,
};
ensureAuthorization : ์์ฒญ headers์์ authorization ๊ฐ์ ๊ฐ์ ธ์ JWT๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
JWT๊ฐ ์ ํจํ๋ฉด decodeJwt๋ฅผ ๋ฐํํฉ๋๋ค.
JWT๊ฐ ๋ง๋ฃ๋์๊ฑฐ๋ ์ ํจํ์ง ์์ ๊ฒฝ์ฐ์๋ ์๋ฌ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
๋ง๋ฃ๋ ํ ํฐ์ด๋ฉด 401 UNAUTHORIZED ์๋ตํฉ๋๋ค.
์๋ชป๋ ํ ํฐ์ด๋ฉด 400 BAD REQUEST ์๋ตํฉ๋๋ค.
JWT ์ธ์ฆ์ ํ๋ฉด์ token ๋ง๋ฃ๋ ๋๋ง๋ค ๊ฒ์ฆํ๊ธฐ ์ํด ์๋ก ๋ณต๋ถํ๋ ๊ฒ ๋ฒ๊ฑฐ๋ก์ ์ต๋๋ค.๐ ๊ทธ๋ฆฌ๊ณ ์ฝ๋๋ฅผ ์งค์๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ ์ฒด๊ณ์ ์ผ๋ก ํด์ผ๊ฒ ๋ค๊ณ ๋๊ผ์ต๋๋ค.