Bulk upload adalah fitur untuk membuat banyak produk sekaligus menggunakan file CSV, tanpa perlu input manual satu per satu.
Ketika Anda upload CSV dengan 5 produk dan berhasil 100%, maka:
SELECT * FROM Product WHERE id IN (
SELECT productId FROM bulk_upload_item
WHERE batchId = 'bbd17cc8-b714-489a-9b54-14c859b19b6e'
);Hasil: 5 produk baru ditambahkan ke catalog:
- Samsung Galaxy S24 Ultra
- Apple MacBook Pro 16-inch M3
- Sony WH-1000XM5 Wireless Headphones
- LG OLED C3 55-inch 4K Smart TV
- Canon EOS R6 Mark II Mirrorless Camera
id: bbd17cc8-b714-489a-9b54-14c859b19b6e
fileName: bulk-upload-example.csv
status: COMPLETED
itemCount: 5
errorCount: 0
createdAt: 2025-10-12 22:38:00-- 5 records dengan:
status: CREATED
productId: [UUID produk yang dibuat]
error: NULL (karena sukses)Cara 1: Via UI Dashboard
- Buka http://localhost:3000/admin/bulk-upload
- Upload file CSV
- Lihat hasilnya di Upload History
Cara 2: Via API
curl -X POST http://localhost:3001/api/bulk-upload -F "file=@bulk-upload-example.csv"Response:
{
"batchId": "uuid",
"status": "COMPLETED",
"total": 5,
"created": 5,
"errors": 0
}GET http://localhost:3001/api/bulk-uploadResponse:
{
"batches": [
{
"id": "uuid",
"fileName": "bulk-upload-example.csv",
"totalRecords": 5,
"successfulRecords": 5,
"failedRecords": 0,
"status": "COMPLETED",
"uploadedBy": "Admin",
"uploadedAt": "2025-10-12T22:38:00.000Z",
"errors": []
}
]
}GET http://localhost:3001/api/bulk-upload/{batchId}Response:
{
"batch": {
"id": "uuid",
"fileName": "bulk-upload-example.csv",
"status": "COMPLETED",
"itemCount": 5,
"errorCount": 0
},
"items": [
{
"id": "item-uuid-1",
"batchId": "batch-uuid",
"productId": "product-uuid-1",
"title": "Samsung Galaxy S24 Ultra",
"slug": "samsung-galaxy-s24-ultra",
"price": 1299.99,
"status": "CREATED",
"error": null,
"product": {
/* detail produk */
}
}
// ... 4 item lainnya
]
}Produk yang berhasil dibuat akan langsung muncul di:
- http://localhost:3000/admin/products
- http://localhost:3000/shop
- http://localhost:3000/product/{slug}
Update yang Sudah Ada:
PUT http://localhost:3001/api/bulk-upload/{batchId}
Content-Type: application/json
{
"items": [
{
"itemId": "item-uuid",
"categoryId": "correct-category-uuid"
}
]
}Fungsi: Memperbaiki item yang error dengan categoryId yang benar
Kapan Digunakan:
- Upload gagal karena kategori tidak ditemukan
- Ingin retry create produk dari item yang error
Setelah bulk upload berhasil, produk bisa diupdate via:
PUT http://localhost:3001/api/products/{productId}Yang Bisa Diupdate Lewat Bulk Upload (Enhancement): Untuk saat ini, bulk upload hanya CREATE. Jika ingin UPDATE existing products via CSV, perlu tambahan:
// Di bulkUploadService.js - createBatchWithItems()
// Tambahkan logic:
// Check if product with slug already exists
const existingProduct = await tx.product.findUnique({
where: { slug: row.slug },
});
if (existingProduct) {
// UPDATE product
const updatedProduct = await tx.product.update({
where: { id: existingProduct.id },
data: {
/* data dari CSV */
},
});
await tx.bulk_upload_item.create({
data: {
batchId,
productId: updatedProduct.id,
status: "UPDATED", // Bukan CREATED
// ... field lainnya
},
});
} else {
// CREATE product (logic yang sudah ada)
}DELETE http://localhost:3001/api/bulk-upload/{batchId}?deleteProducts=falseHasil: Hapus batch + items record, tapi produk tetap ada
DELETE http://localhost:3001/api/bulk-upload/{batchId}?deleteProducts=trueHasil: Hapus batch, items, DAN semua produk yang dibuat
Protection: Tidak bisa delete jika produk sudah ada di order
// Dari bulkUploadService.js
async function canDeleteProductsForBatch(tx, batchId) {
const items = await tx.bulk_upload_item.findMany({
where: { batchId, productId: { not: null } },
});
const productIds = items.map((i) => i.productId);
// Check if any product is in orders
const orderedProducts = await tx.customer_order_product.findMany({
where: { productId: { in: productIds } },
});
if (orderedProducts.length > 0) {
return { canDelete: false, reason: "Some products are in orders" };
}
return { canDelete: true };
}- ✅ Drag & drop CSV upload
- ✅ File validation
- ✅ Upload progress
- ✅ Result display (success/error)
- ✅ Template download
- ✅ Upload history list
- ✅ List semua upload batch
- ✅ Status badge (COMPLETED/FAILED/PARTIAL)
- ✅ Statistics (total/success/failed/rate)
- ✅ Error messages display
- ✅ File name & upload time
Tambahkan mode "UPDATE" di CSV dengan column productId:
productId,title,price,inStock
uuid-123,Updated Title,999.99,50Upload CSV berisi productId untuk mass delete:
productId
uuid-1
uuid-2
uuid-3Download produk existing ke CSV untuk edit:
GET /api/products/export?categoryId=xxx&format=csvUntuk file besar (1000+ products):
- Queue system (Bull/BullMQ)
- Progress tracking
- Email notification setelah selesai
Upload images dalam ZIP bersamaan dengan CSV:
title,price,imageName
Product 1,99.99,product1.jpgSebelum commit ke database, tampilkan preview:
- Valid rows (hijau)
- Invalid rows (merah) dengan alasan error
- Button "Confirm Upload" atau "Cancel"
Tambahkan button "Undo Upload" dalam 5 menit setelah upload:
DELETE / api / bulk - upload / { batchId } / rollback;- Prepare CSV dengan data produk
- Upload via dashboard
- Verify di Upload History
- Check Products di product list
- Test di frontend shop
- Upload CSV → Gagal karena category salah
- Lihat error di Upload History
- Fix category di CSV
- Re-upload file yang sudah diperbaiki
- Verify success
- Find batch yang mau dihapus
- Check apakah produk sudah ada di order
- Delete batch + products jika aman
- Verify produk hilang dari catalog
# 1. Test Upload
cd "d:\MyDocuments\Documents\Kuliah\Semester 5\Pengembangan WEB (T2-P2)\ETS-v2\Electronics-eCommerce-Shop-With-Admin-Dashboard-NextJS-NodeJS"
curl.exe -X POST http://localhost:3001/api/bulk-upload -F "file=@bulk-upload-example.csv"
# 2. List Batches
curl http://localhost:3001/api/bulk-upload
# 3. Get Batch Detail
curl http://localhost:3001/api/bulk-upload/{batchId}
# 4. Delete Batch (keep products)
curl -X DELETE http://localhost:3001/api/bulk-upload/{batchId}?deleteProducts=false
# 5. Delete Batch (with products)
curl -X DELETE http://localhost:3001/api/bulk-upload/{batchId}?deleteProducts=true
# 6. Check Products Created
curl http://localhost:3001/api/products?page=1&limit=10Hasil bulk upload Anda sudah BENAR! ✅
Yang terjadi:
- ✅ 5 produk berhasil dibuat di database
- ✅ Produk muncul di product list
- ✅ Produk bisa dibeli di shop
- ✅ History tersimpan untuk tracking
- ✅ Error handling berfungsi (lihat upload pertama yang gagal)
Fitur CRUD yang sudah ada:
- ✅ CREATE: Upload CSV → Buat produk baru
- ✅ READ: List batches, detail batch, lihat produk
⚠️ UPDATE: Bisa update individual product, tapi belum support bulk update via CSV- ✅ DELETE: Delete batch (dengan/tanpa produk)
Rekomendasi Next Steps:
- Test upload dengan kategori yang berbeda
- Test upload file besar (50+ products)
- Test error handling (invalid data)
- Implement bulk UPDATE jika diperlukan
- Add export to CSV feature
🎉 Bulk upload feature is working perfectly!