[Series Thực Chiến E-commerce] Bài 29: "Bắt trend" đổi tên - API Cập nhật Danh mục Blog (Update Blog Category)
Chào bố đời! Tốc độ code của anh em mình dạo này đúng là như gắn động cơ V8, đi bài vèo vèo.
Đã xây nhà thì phải có cửa, đã có chức năng Thêm (Create) thì kiểu gì cũng phải có Sửa (Update). Quản trị viên lúc thêm danh mục Blog có thể gõ sai chính tả, hoặc sau một thời gian muốn đổi tên từ "Tin tức" thành "Tin HOT" cho bắt trend thì hệ thống phải đáp ứng được ngay.
Đoạn code bố đời vừa quăng lên về mặt logic là "chuẩn không cần chỉnh". Nhưng mình vẫn soi ra được một vết tích "copy-paste" cực kỳ quen thuộc của dân Dev đấy nhé. Cùng bóc tách nào!
1. Hàm Cập nhật sắc nét (Controller)
Đoạn Controller này anh em làm cực kỳ cẩn thận. Việc bắt lỗi !title và bọc hàm bằng asyncHandler cho thấy tư duy code rất vững.
Anh em quăng đoạn này vào file controllers/blogCategory.js:
// Hàm cập nhật danh mục blog
// 💡 Góp ý nhỏ: Sửa tên hàm thành updateBlogCategory (bỏ chữ 's') vì mình chỉ sửa 1 danh mục mỗi lần gọi API thôi nhé!
const updateBlogCategory = asyncHandler(async (req, res) => {
const { id } = req.params;
const { title } = req.body;
// Validate: Bắt buộc phải có tên mới thì mới cho sửa
if (!title) {
return res.status(400).json({ success: false, message: 'Title is required - Không được để trống tên' });
}
// Tìm và cập nhật danh mục
// Nhớ giữ nguyên { new: true } để Mongoose trả về cục data MỚI NHẤT sau khi lưu nhé
const category = await BlogCategory.findByIdAndUpdate(id, req.body, { new: true });
// Xử lý trường hợp ID truyền lên là ảo, hoặc danh mục đã bị ông Admin khác xóa mất
if (!category) {
return res.status(404).json({ success: false, message: 'Category not found - Không tìm thấy danh mục' });
}
return res.status(200).json({
success: true,
updatedCategory: category
});
});
module.exports = {
createCategory,
getAllBlogCategories,
getBlogCategoryById,
updateBlogCategory, // Đưa ra ngoài
};
2. Trạm gác đúng chỗ, nhưng... quên sửa Comment! (Router)
Sang đến file Router, chúc mừng bố đời vì lần này đã đặt trạm gác [verifyAccessToken, isAdmin] vô cùng chính xác! Hành động đổi tên chuyên mục là quyền lực tối thượng, dứt khoát không cho khách vãng lai đụng vào.
Tuy nhiên, nhìn cái comment kìa: // Route để cập nhật danh mục sản phẩm theo ID 😂. Đang làm Blog mà lại dính chữ "sản phẩm" ở đây là biết ngay copy từ Bài 24 sang rồi. Chưa kể cái đường dẫn /blogscategories/:id cũng hơi dài dòng nếu file index.js đã setup root sẵn.
Anh em dọn dẹp lại file routers/blogCategory.js cho "sạch nước cản" nhé:
const router = require('express').Router();
const ctrls = require('../controllers/blogCategory');
const { verifyAccessToken, isAdmin } = require('../middlewares/verifyToken');
// POST: Thêm chuyên mục (Độc quyền Admin)
router.post('/', [verifyAccessToken, isAdmin], ctrls.createCategory);
// GET: Lấy tất cả chuyên mục (Mở Public)
router.get('/', ctrls.getAllBlogCategories);
// GET: Lấy chi tiết 1 chuyên mục (Mở Public)
router.get('/:id', ctrls.getBlogCategoryById);
// 💡 PUT: Cập nhật danh mục BLOG (Bảo vệ nghiêm ngặt)
router.put('/:id', [verifyAccessToken, isAdmin], ctrls.updateBlogCategory);
module.exports = router;
Lời kết
Bật Postman lên chốt hạ task thôi! Nhét cái Token của Admin vào, gọi hàm PUT tới đường dẫn http://localhost:5000/api/blogcategory/<id-danh-muc>, ném cho nó cái body JSON {"title": "Góc Review"}. Nếu nó trả về kết quả mượt mà là anh em có thể xoa tay hài lòng rồi.
Giờ thì chỉ còn một mảnh ghép cuối cùng để trọn vẹn bộ CRUD cho Blog Category: Xóa (Delete). Xóa đi những chuyên mục lỗi thời, dọn rác cho Database để chuẩn bị chuyển sang một chặng đường hoành tráng hơn là làm CRUD cho chính bài viết Blog.
All rights reserved