// Test Examples for Device Bulk Operations with Images // You can use these examples with Postman, fetch API, or any HTTP client // ============================================================================= // Example 1: Bulk Create Devices with Images (JavaScript/Fetch) // ============================================================================= async function bulkCreateDevicesWithImages() { const formData = new FormData(); // Define devices const devices = [ { device_code: "ODP-BULK-001", device_type: "ODP", longitude: 106.8456, latitude: -6.2088, port_amount: 8, status: "active", province: "DKI Jakarta", city: "Jakarta Selatan", district: "Kebayoran Baru", olt_id: "550e8400-e29b-41d4-a716-446655440000" // Optional: Replace with real OLT ID }, { device_code: "OTB-BULK-001", device_type: "OTB", longitude: 106.8556, latitude: -6.2188, port_amount: 16, status: "active", province: "DKI Jakarta", city: "Jakarta Pusat", tower_id: "550e8400-e29b-41d4-a716-446655440001" // Optional: Replace with real Tower ID }, { device_code: "CLOSURE-BULK-001", device_type: "closure", longitude: 106.8656, latitude: -6.2288, port_amount: 0, status: "active", province: "DKI Jakarta", city: "Jakarta Utara" } ]; formData.append('devices', JSON.stringify(devices)); // Image distribution: // - Device 0 (ODP-BULK-001): 3 images // - Device 1 (OTB-BULK-001): 2 images // - Device 2 (CLOSURE-BULK-001): 1 image formData.append('image_indexes', JSON.stringify([3, 2, 1])); // Add images (total 6 files: 3+2+1) // NOTE: Replace these with actual File objects from file input // formData.append('images', odpImage1); // formData.append('images', odpImage2); // formData.append('images', odpImage3); // formData.append('images', otbImage1); // formData.append('images', otbImage2); // formData.append('images', closureImage1); try { const response = await fetch('http://localhost:8080/device/bulk/create', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_JWT_TOKEN_HERE' }, body: formData }); const result = await response.json(); console.log('Success:', result); return result; } catch (error) { console.error('Error:', error); } } // ============================================================================= // Example 2: Bulk Create without Images (Simple JSON) // ============================================================================= async function bulkCreateDevicesNoImages() { const requestBody = { devices: [ { device_code: "ODP-NO-IMG-001", device_type: "ODP", longitude: 106.8456, latitude: -6.2088, port_amount: 8, status: "active", province: "DKI Jakarta", city: "Jakarta Selatan" }, { device_code: "ODP-NO-IMG-002", device_type: "ODP", longitude: 106.8556, latitude: -6.2188, port_amount: 12, status: "active", province: "DKI Jakarta", city: "Jakarta Timur" } ] }; try { const response = await fetch('http://localhost:8080/device/bulk/create', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_JWT_TOKEN_HERE', 'Content-Type': 'application/json' }, body: JSON.stringify(requestBody) }); const result = await response.json(); console.log('Success:', result); return result; } catch (error) { console.error('Error:', error); } } // ============================================================================= // Example 3: Bulk Update Devices with Images (Append Mode) // ============================================================================= async function bulkUpdateDevicesAppendImages() { const formData = new FormData(); // Device IDs to update (replace with actual UUIDs from your database) const deviceIds = [ "550e8400-e29b-41d4-a716-446655440010", "550e8400-e29b-41d4-a716-446655440011" ]; formData.append('device_ids', JSON.stringify(deviceIds)); // Fields to update const updates = { status: "maintenance", province: "DKI Jakarta" }; formData.append('updates', JSON.stringify(updates)); // Image distribution: // - Device 0: add 2 new images // - Device 1: add 1 new image formData.append('image_indexes', JSON.stringify([2, 1])); // Append mode: keep existing images and add new ones formData.append('replace_images', 'false'); // Add images (total 3 files: 2+1) // NOTE: Replace these with actual File objects // formData.append('images', newImage1); // formData.append('images', newImage2); // formData.append('images', newImage3); try { const response = await fetch('http://localhost:8080/device/bulk/update', { method: 'PUT', headers: { 'Authorization': 'Bearer YOUR_JWT_TOKEN_HERE' }, body: formData }); const result = await response.json(); console.log('Success:', result); return result; } catch (error) { console.error('Error:', error); } } // ============================================================================= // Example 4: Bulk Update Devices with Images (Replace Mode) // ============================================================================= async function bulkUpdateDevicesReplaceImages() { const formData = new FormData(); const deviceIds = [ "550e8400-e29b-41d4-a716-446655440010" ]; formData.append('device_ids', JSON.stringify(deviceIds)); const updates = { status: "active" }; formData.append('updates', JSON.stringify(updates)); // Add 3 new images, replacing all old ones formData.append('image_indexes', JSON.stringify([3])); formData.append('replace_images', 'true'); // Replace mode // Add images (total 3 files) // formData.append('images', replacementImage1); // formData.append('images', replacementImage2); // formData.append('images', replacementImage3); try { const response = await fetch('http://localhost:8080/device/bulk/update', { method: 'PUT', headers: { 'Authorization': 'Bearer YOUR_JWT_TOKEN_HERE' }, body: formData }); const result = await response.json(); console.log('Success:', result); return result; } catch (error) { console.error('Error:', error); } } // ============================================================================= // Example 5: Bulk Update without Images // ============================================================================= async function bulkUpdateDevicesNoImages() { const requestBody = { device_ids: [ "550e8400-e29b-41d4-a716-446655440010", "550e8400-e29b-41d4-a716-446655440011", "550e8400-e29b-41d4-a716-446655440012" ], updates: { status: "inactive", province: "Jawa Barat", city: "Bandung" } }; try { const response = await fetch('http://localhost:8080/device/bulk/update', { method: 'PUT', headers: { 'Authorization': 'Bearer YOUR_JWT_TOKEN_HERE', 'Content-Type': 'application/json' }, body: JSON.stringify(requestBody) }); const result = await response.json(); console.log('Success:', result); return result; } catch (error) { console.error('Error:', error); } } // ============================================================================= // Example 6: Bulk Delete Devices // ============================================================================= async function bulkDeleteDevices() { const requestBody = { device_ids: [ "550e8400-e29b-41d4-a716-446655440010", "550e8400-e29b-41d4-a716-446655440011" ] }; try { const response = await fetch('http://localhost:8080/device/bulk/delete', { method: 'DELETE', headers: { 'Authorization': 'Bearer YOUR_JWT_TOKEN_HERE', 'Content-Type': 'application/json' }, body: JSON.stringify(requestBody) }); const result = await response.json(); console.log('Success:', result); return result; } catch (error) { console.error('Error:', error); } } // ============================================================================= // Example 7: HTML Form for File Upload // ============================================================================= /* Device Bulk Upload with Images

Bulk Create Devices with Images

*/ // ============================================================================= // cURL Examples // ============================================================================= /* # Bulk Create with Images curl -X POST http://localhost:8080/device/bulk/create \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -F 'devices=[{"device_code":"ODP-CURL-001","device_type":"ODP","longitude":106.8,"latitude":-6.2,"port_amount":8,"status":"active"},{"device_code":"OTB-CURL-001","device_type":"OTB","longitude":106.9,"latitude":-6.3,"port_amount":16,"status":"active"}]' \ -F 'image_indexes=[2,1]' \ -F "images=@/path/to/image1.jpg" \ -F "images=@/path/to/image2.jpg" \ -F "images=@/path/to/image3.jpg" # Bulk Create without Images (JSON) curl -X POST http://localhost:8080/device/bulk/create \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{"devices":[{"device_code":"ODP-JSON-001","device_type":"ODP","longitude":106.8,"latitude":-6.2,"port_amount":8,"status":"active"}]}' # Bulk Update with Images (Append) curl -X PUT http://localhost:8080/device/bulk/update \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -F 'device_ids=["550e8400-e29b-41d4-a716-446655440010"]' \ -F 'updates={"status":"maintenance"}' \ -F 'image_indexes=[2]' \ -F 'replace_images=false' \ -F "images=@/path/to/new1.jpg" \ -F "images=@/path/to/new2.jpg" # Bulk Update with Images (Replace) curl -X PUT http://localhost:8080/device/bulk/update \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -F 'device_ids=["550e8400-e29b-41d4-a716-446655440010"]' \ -F 'updates={"status":"active"}' \ -F 'image_indexes=[3]' \ -F 'replace_images=true' \ -F "images=@/path/to/replace1.jpg" \ -F "images=@/path/to/replace2.jpg" \ -F "images=@/path/to/replace3.jpg" # Bulk Update without Images (JSON) curl -X PUT http://localhost:8080/device/bulk/update \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{"device_ids":["550e8400-e29b-41d4-a716-446655440010","550e8400-e29b-41d4-a716-446655440011"],"updates":{"status":"inactive"}}' # Bulk Delete curl -X DELETE http://localhost:8080/device/bulk/delete \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{"device_ids":["550e8400-e29b-41d4-a716-446655440010"]}' */ // ============================================================================= // Postman Collection JSON (Import this into Postman) // ============================================================================= /* { "info": { "name": "Device Bulk Operations with Images", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ { "name": "Bulk Create with Images", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{jwt_token}}" } ], "body": { "mode": "formdata", "formdata": [ { "key": "devices", "value": "[{\"device_code\":\"ODP-PM-001\",\"device_type\":\"ODP\",\"longitude\":106.8,\"latitude\":-6.2,\"port_amount\":8,\"status\":\"active\"}]", "type": "text" }, { "key": "image_indexes", "value": "[2]", "type": "text" }, { "key": "images", "type": "file", "src": "/path/to/image1.jpg" }, { "key": "images", "type": "file", "src": "/path/to/image2.jpg" } ] }, "url": { "raw": "http://localhost:8080/device/bulk/create", "protocol": "http", "host": ["localhost"], "port": "8080", "path": ["device", "bulk", "create"] } } }, { "name": "Bulk Update with Images (Append)", "request": { "method": "PUT", "header": [ { "key": "Authorization", "value": "Bearer {{jwt_token}}" } ], "body": { "mode": "formdata", "formdata": [ { "key": "device_ids", "value": "[\"550e8400-e29b-41d4-a716-446655440010\"]", "type": "text" }, { "key": "updates", "value": "{\"status\":\"maintenance\"}", "type": "text" }, { "key": "image_indexes", "value": "[1]", "type": "text" }, { "key": "replace_images", "value": "false", "type": "text" }, { "key": "images", "type": "file", "src": "/path/to/new_image.jpg" } ] }, "url": { "raw": "http://localhost:8080/device/bulk/update", "protocol": "http", "host": ["localhost"], "port": "8080", "path": ["device", "bulk", "update"] } } } ] } */ // ============================================================================= // Expected Response Examples // ============================================================================= /* // Success Response { "message": "Bulk create completed: 2 successful, 0 failed out of 2 requested (with 3 images)", "data": { "total_requested": 2, "successful": 2, "failed": 0, "errors": [], "results": [ { "id": "550e8400-e29b-41d4-a716-446655440100", "device_code": "ODP-BULK-001", "device_type": "ODP", "longitude": 106.8456, "latitude": -6.2088, "port_amount": 8, "status": "active", "address": "Jakarta Selatan, DKI Jakarta", "image_url": "/uploads/devices/abc123_1728000000.jpg", "image_urls": [ "/uploads/devices/abc123_1728000000.jpg", "/uploads/devices/def456_1728000001.jpg" ], "created_at": "2025-10-10T10:30:00Z", "updated_at": "2025-10-10T10:30:00Z" } ], "execution_time": "245ms" } } // Partial Failure Response { "message": "Bulk create completed: 1 successful, 1 failed out of 2 requested (with 2 images)", "data": { "total_requested": 2, "successful": 1, "failed": 1, "errors": [ { "index": 1, "error": "Tower not found", "details": "550e8400-e29b-41d4-a716-446655440001" } ], "results": [ { "id": "550e8400-e29b-41d4-a716-446655440100", "device_code": "ODP-BULK-001", "image_url": "/uploads/devices/abc123.jpg", "image_urls": ["/uploads/devices/abc123.jpg"] } ], "execution_time": "180ms" } } */