
오늘은 주문 API를 끝냈다.
자세한 내용은 아래와 같다.
각 기능별로 코드와 설명을 함께 살펴보자.
사용자가 주문을 완료하면 장바구니에 담긴 항목들을 삭제해야 한다. 이를 처리하는 코드의 흐름은 다음과 같다.
const order = async (req, res) => {
const conn = await mariadb.createConnection({
host: '127.0.0.1',
user: 'root',
password: 'root',
database: 'Bookshop',
port: 3306,
dateStrings: true,
});
const {items, delivery, totalQuantity, totalPrice, userId, firstBookTitle} = req.body;
// delivery 테이블 삽입
let sql = "INSERT INTO delivery (address, receiver, contact) VALUES (?, ?, ?)";
let values = [delivery.address, delivery.receiver, delivery.contact];
let [results] = await conn.execute(sql, values);
let delivery_id = results.insertId;
// orders 테이블 삽입
sql = `INSERT INTO orders (book_title, total_quantity, total_price, user_id, delivery_id)
VALUES (?, ?, ?, ?, ?);`;
values = [firstBookTitle, totalQuantity, totalPrice, userId, delivery_id];
[results] = await conn.execute(sql, values);
let order_id = results.insertId;
// 장바구니에서 book_id, quantity 가져오기
sql = `SELECT book_id, quantity FROM cartItems WHERE id IN (?)`;
let [orderItems] = await conn.query(sql, [items]);
// orderedBook 테이블 삽입
sql = `INSERT INTO orderedBook (order_id, book_id, quantity) VALUES ?;`;
values = orderItems.map(item => [order_id, item.book_id, item.quantity]);
await conn.query(sql, [values]);
// 장바구니 삭제
let result = await deleteCartItems(conn, [items]);
return res.status(StatusCodes.OK).json(result);
};
const deleteCartItems = async (conn, items) => {
let sql = `DELETE FROM cartItems WHERE id IN (?)`;
let result = await conn.query(sql, items);
return result;
};
delivery 테이블에 사용자의 주소, 받는 사람, 연락처를 저장하고 delivery_id를 가져온다.orders 테이블에 주문 정보를 저장하고 order_id를 가져온다.cartItems에서 book_id와 quantity를 가져온다.orderedBook 테이블에 order_id, book_id, quantity 데이터를 저장한다.cartItems 테이블에서 주문한 항목을 삭제한다.관리자 또는 사용자가 자신의 주문 목록을 조회할 수 있도록 한다.
const getOrders = async (req, res) => {
const conn = await mariadb.createConnection({
host: '127.0.0.1',
user: 'root',
password: 'root',
database: 'Bookshop',
port: 3306,
dateStrings: true,
});
let sql = `SELECT orders.id, created_at, address, receiver, contact,
book_title, total_quantity, total_price
FROM orders LEFT JOIN delivery
ON orders.delivery_id = delivery_id;`;
let [rows] = await conn.query(sql);
return res.status(StatusCodes.OK).json(rows);
};
orders 테이블에서 주문 정보 조회delivery 테이블과 조인하여 배송 정보를 포함특정 주문의 상세 정보를 조회하는 기능이다.
const getOrderDetail = async (req, res) => {
const {orderId} = req.params;
const conn = await mariadb.createConnection({
host: '127.0.0.1',
user: 'root',
password: 'root',
database: 'Bookshop',
port: 3306,
dateStrings: true,
});
let sql = `SELECT book_id, books.title AS book_title, author, price, quantity
FROM orderedBook LEFT JOIN books
ON orderedBook.book_id = books.id
WHERE order_id = ?;`;
let [rows] = await conn.query(sql , [orderId]);
return res.status(StatusCodes.OK).json(rows);
};
orderedBook 테이블에서 조회books 테이블과 조인하여 책의 제목, 저자, 가격 정보 포함오늘은 주문 기능 구현에 대해 다뤘다. 주요 기능은 다음과 같다:
드디어 주문 관련 API를 끝냈다. 백엔드가 어렵지만 재미를 느낄수 있어서
계속 연습해야겠다는 생각을 했다.