[Series Thực Chiến E-commerce] Bài 24: "Sửa sai" trong tíc tắc - API Cập nhật Danh mục (Update Category)
Chào bố đời! Phong độ code vẫn đang cực kỳ ổn định và "cháy" nhé.
Ở Bài 23, chúng ta đã mở cửa cho khách hàng xem chi tiết từng danh mục rồi. Nhưng cuộc sống mà, đôi khi ông Admin thêm danh mục lúc nửa đêm gà gáy, mắt nhắm mắt mở gõ nhầm "Điện thoại" thành "Điện thoai". Khách hàng vào trang chủ nhìn thấy cái menu sai lỗi chính tả thì đánh giá shop làm ăn thiếu chuyên nghiệp ngay.
Lúc này, hệ thống bắt buộc phải có một cái nút "Sửa" dành cho Admin. Mã nguồn bố đời chuẩn bị cho tính năng này cực kỳ chuẩn bài, không có chỗ nào để chê. Cùng phân tích nhé!
1. Não bộ xử lý (Controller): Bắt lỗi chặt chẽ
Đoạn code Controller này thể hiện sự cẩn thận của một người viết API có kinh nghiệm. Từ việc bắt lỗi không truyền title, cho đến việc xử lý trường hợp cái id truyền lên không tồn tại trong Database.
Anh em mở file controllers/productCategory.js và thêm hàm này vào:
// Hàm cập nhật danh mục sản phẩm
const updateCategory = asyncHandler(async (req, res) => {
// 1. Lấy ID từ trên thanh URL
const { id } = req.params;
// 2. Lấy nội dung mới từ body request
const { title } = req.body;
// Validate: Nếu Admin bấm cập nhật mà bỏ trống tên danh mục thì chửi luôn
if (!title) {
return res.status(400).json({
success: false,
message: 'Title is required - Không được để trống tên danh mục'
});
}
// 3. Gọi Mongoose thực hiện Update
// 💡 LUÔN NHỚ: Option { new: true } để trả về data SAU KHI đã sửa
const category = await ProductCategory.findByIdAndUpdate(id, req.body, { new: true });
// 4. Bắt lỗi 404: Lỡ giằng co nhau, Admin A vừa xóa xong, Admin B lại bấm update thì sao?
if (!category) {
return res.status(404).json({
success: false,
message: 'Category not found - Danh mục này không còn tồn tại'
});
}
// 5. Trả hàng về cho Frontend vẽ lại giao diện
return res.status(200).json({
success: true,
updatedCategory: category
});
});
module.exports = {
createCategory,
getCategories,
getCategoryById,
updateCategory, // Nhớ nhét vào object export nhé
};
2. Thiết lập chốt chặn Router chuẩn mực
Ở bài trước lúc GET danh mục thì bố đời đặt nhầm trạm gác, nhưng sang bài này lúc PUT (Cập nhật) thì đặt trạm gác ở đây là quá chuẩn xác! Việc sửa tên danh mục ảnh hưởng đến toàn bộ giao diện và cấu trúc hàng hóa của hệ thống. Đây là quyền lực tối cao, chỉ có Admin mới được phép làm. Bất kỳ ai không có token, hoặc có token nhưng là "User quèn" đụng vào cái API này đều bị đá văng ra ngoài.
Anh em mở routers/productCategory.js ra và nối dây cho nó:
const router = require('express').Router();
const ctrls = require('../controllers/productCategory');
const { verifyAccessToken, isAdmin } = require('../middlewares/verifyToken');
router.post('/categories', [verifyAccessToken, isAdmin], ctrls.createCategory);
router.get('/categories', ctrls.getCategories);
router.get('/categories/:id', ctrls.getCategoryById);
// 💡 Route Cập nhật danh mục: Bảo mật nghiêm ngặt với 2 middleware
router.put('/categories/:id', [verifyAccessToken, isAdmin], ctrls.updateCategory);
module.exports = router;
Lời kết
Test trên Postman: Bố đời cứ đăng nhập lấy cái thẻ accessToken của Admin. Mở request PUT trỏ vào http://localhost:5000/api/category/categories/<id-danh-mục>, ném cái JSON {"title": "Điện thoại xịn"} vào tab Body rồi bấm Send. Kết quả trả về danh mục với cái tên mới bóng loáng là anh em chốt hạ được task này rồi.
Chúng ta đã Thêm, Đọc, và Sửa danh mục thành công. Mảnh ghép cuối cùng của bức tranh Category CRUD chính là "Thanh lý môn hộ" - Xóa đi những danh mục không còn sử dụng nữa (ví dụ: Shop không bán Máy ảnh nữa thì xóa danh mục Máy ảnh đi cho gọn).
Và đó chính là nội dung của Lession 25: Delete Categories.
All rights reserved