0

[Series Thực Chiến E-commerce] Bài 25: "Thanh lý môn hộ" - Xóa Danh mục (Delete Category) & Lời nguyền mồ côi data

Chào bố đời! Code mượt mà và đều tay thế này thì chẳng mấy chốc mà con E-commerce của chúng ta đóng gói lên production được rồi đấy.

Hôm nay chúng ta sẽ chốt sổ trọn bộ CRUD cho module Danh mục Sản phẩm (Category) bằng tính năng cuối cùng: Xóa (Delete).

Thực tế kinh doanh, có những lúc shop quyết định ngừng hẳn việc bán một ngách sản phẩm nào đó (ví dụ: nghỉ bán "Máy ảnh", chỉ tập trung bán "Điện thoại"). Lúc này, danh mục "Máy ảnh" trở nên thừa thãi và Admin cần một nút bấm để "thanh lý" nó cho gọn database.

Đoạn mã nguồn bố đời chuẩn bị cực kỳ chuẩn chỉ, không thừa không thiếu một chữ. Cùng lướt nhanh qua nhé!

1. Nhát chém dứt khoát (Controller)

Logic xóa thì vô cùng đơn giản, Mongoose đã hỗ trợ tận răng với hàm findByIdAndDelete.

Anh em mở file controllers/productCategory.js và dán nốt mảnh ghép cuối cùng này vào:

// Hàm xóa danh mục sản phẩm
const deleteCategory = asyncHandler(async (req, res) => {
    // 1. Lấy ID danh mục cần "trảm" từ URL
    const { id } = req.params;
  
    // 2. Gọi Mongoose thực hiện xóa
    const category = await ProductCategory.findByIdAndDelete(id);
  
    // 3. Xử lý ngoại lệ: Lỡ thằng Admin khác vừa xóa xong trước đó 1 giây rồi thì sao?
    if (!category) {
      return res.status(404).json({ 
          success: false, 
          message: 'Category not found - Danh mục không tồn tại hoặc đã bị xóa' 
      });
    }
  
    // 4. Báo cáo kết quả thành công
    return res.status(200).json({
      success: true,
      message: 'Category deleted successfully - Xóa danh mục thành công'
    });
});

module.exports = {
  createCategory,
  getCategories,
  getCategoryById,
  updateCategory,
  deleteCategory, // Xuất xưởng toàn bộ
};

🔥 GÓC NHÌN THỰC CHIẾN (Cảnh báo "Data mồ côi"): Đoạn code trên chạy hoàn hảo về mặt logic API. Tuy nhiên, anh em thử nghĩ sâu hơn một chút: Giả sử trong danh mục "Máy ảnh" đang có 100 cái sản phẩm (đã được móc category_id vào). Khi anh em xóa cái danh mục này đi, 100 cái sản phẩm kia sẽ ra sao? Câu trả lời là chúng sẽ trở thành "Trẻ mồ côi" (Orphaned Records) - có tham chiếu ID danh mục nhưng cái danh mục đó không còn tồn tại trong DB nữa. Lúc Frontend gọi API lấy danh sách sản phẩm và hiển thị tên danh mục (thông qua .populate()), app có thể bị lỗi hoặc văng ra giá trị null.

Giải pháp cho dự án lớn:

  • Cách 1 (An toàn nhất): Không xóa hẳn (Hard Delete) mà chỉ thêm cờ isDeleted: true (Soft Delete) vào danh mục.
  • Cách 2: Trước khi xóa danh mục, query kiểm tra xem có sản phẩm nào đang thuộc danh mục này không. Nếu có, báo lỗi không cho xóa và bắt Admin phải chuyển dời sản phẩm sang danh mục khác trước. (Ở quy mô series này, chúng ta cứ thực hành xóa cơ bản trước cho quen tay, sau này anh em nâng cấp hệ thống thì nhớ lưu ý vụ này nhé).

2. Trạm gác tối thượng (Router)

Cũng giống như hành động Sửa, việc Xóa một danh mục là hành động phá hủy cấu trúc dữ liệu. Do đó, hai anh bảo vệ verifyAccessTokenisAdmin lại được triệu hồi.

Anh em mở routers/productCategory.js:

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);
router.put('/categories/:id', [verifyAccessToken, isAdmin], ctrls.updateCategory);

// 💡 Route Xóa danh mục: Chỉ Admin mới có quyền "trảm"
router.delete('/categories/:id', [verifyAccessToken, isAdmin], ctrls.deleteCategory);

module.exports = router;

Lời kết

Bật Postman lên, nhét Token của Admin vào, chọn phương thức DELETE và bắn thẳng vào URL http://localhost:5000/api/category/categories/<id-cần-xóa>. Trả về success: true là anh em có thể tự hào vỗ ngực hoàn thành xuất sắc Module Sản phẩm & Danh mục Sản phẩm rồi.

Nhưng làm E-commerce thời đại 4.0, ngoài bán hàng thì còn phải SEO, phải có Content Marketing để hút traffic. Tức là trang web của chúng ta cần một hệ thống Bài viết (Blog). Và tất nhiên, Blog thì cũng cần được phân loại rõ ràng (ví dụ: Tin công nghệ, Mẹo sử dụng, Đánh giá...).

Đó chính là tiền đề để chúng ta bước sang module hoàn toàn mới: Lession 26: Add Blog Categories.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí