# API Documentation - Produk & Foto Sementara ## Produk API ### 1. Get All Products **GET** `/api/produk` Mendapatkan semua produk dengan jumlah item dan foto. **Response Success (200):** ```json [ { "id": 1, "nama": "Cincin Berlian", "kategori": "cincin", "berat": 2.5, "kadar": 18, "harga_per_gram": 850000, "harga_jual": 2500000, "created_at": "2025-08-27T10:30:00.000000Z", "updated_at": "2025-08-27T10:30:00.000000Z", "deleted_at": null, "items_count": 5, "foto": [ { "id": 1, "id_produk": 1, "url": "http://localhost:8000/storage/foto/cincin1.jpg", "created_at": "2025-08-27T10:30:00.000000Z", "updated_at": "2025-08-27T10:30:00.000000Z" } ] } ] ``` --- ### 2. Get Single Product **GET** `/api/produk/{id}` Mendapatkan detail produk berdasarkan ID dengan foto dan items. **Parameters:** - `id` (integer, required) - Product ID **Response Success (200):** ```json { "id": 1, "nama": "Cincin Berlian", "kategori": "cincin", "berat": 2.5, "kadar": 18, "harga_per_gram": 850000, "harga_jual": 2500000, "created_at": "2025-08-27T10:30:00.000000Z", "updated_at": "2025-08-27T10:30:00.000000Z", "deleted_at": null, "foto": [ { "id": 1, "id_produk": 1, "url": "http://localhost:8000/storage/foto/cincin1.jpg", "created_at": "2025-08-27T10:30:00.000000Z", "updated_at": "2025-08-27T10:30:00.000000Z" } ], "items": [ { "id": 1, "id_produk": 1, "status": "tersedia", "created_at": "2025-08-27T10:30:00.000000Z", "updated_at": "2025-08-27T10:30:00.000000Z" } ] } ``` --- ### 3. Create Product **POST** `/produk` Membuat produk baru dengan foto dari foto sementara. **Headers:** ``` Content-Type: application/json ``` **Request Body:** ```json { "nama": "Cincin Berlian", "kategori": "cincin", "berat": 2.5, "kadar": 18, "harga_per_gram": 850000, "harga_jual": 2500000, "id_user": 1 } ``` **Request Body Parameters:** - `nama` (string, required) - Nama produk (max: 100 karakter) - `kategori` (string, required) - Kategori produk: `cincin`, `gelang`, `kalung`, `anting` - `berat` (numeric, required) - Berat produk dalam gram - `kadar` (integer, required) - Kadar emas - `harga_per_gram` (numeric, required) - Harga per gram - `harga_jual` (numeric, required) - Harga jual - `id_user` (integer, optional) - User ID untuk mengambil foto sementara **Response Success (201):** ```json { "message": "Produk berhasil dibuat", "data": { "id": 1, "nama": "Cincin Berlian", "kategori": "cincin", "berat": 2.5, "kadar": 18, "harga_per_gram": 850000, "harga_jual": 2500000, "created_at": "2025-08-27T10:30:00.000000Z", "updated_at": "2025-08-27T10:30:00.000000Z", "foto": [ { "id": 1, "id_produk": 1, "url": "http://localhost:8000/storage/foto/cincin1.jpg", "created_at": "2025-08-27T10:30:00.000000Z", "updated_at": "2025-08-27T10:30:00.000000Z" } ] } } ``` **Response Error (422):** ```json { "message": "The given data was invalid.", "errors": { "nama": ["Nama produk harus diisi."], "kategori": ["Kategori harus salah satu dari cincin, gelang, kalung, atau anting."], "berat": ["Berat harus diisi."], "kadar": ["Kadar harus diisi"], "harga_per_gram": ["Harga per gram harus diisi"], "harga_jual": ["Harga jual harus diisi"] } } ``` --- ### 4. Update Product **PUT** `/produk/{id}` Memperbarui produk berdasarkan ID dengan opsi foto. **Parameters:** - `id` (integer, required) - Product ID **Headers:** ``` Content-Type: application/json ``` **Request Body:** ```json { "nama": "Cincin Berlian Updated", "kategori": "cincin", "berat": 3.0, "kadar": 22, "harga_per_gram": 900000, "harga_jual": 3000000, "id_user": 1, "hapus_foto_lama": true } ``` **Request Body Parameters:** - `nama` (string, required) - Nama produk (max: 100 karakter) - `kategori` (string, required) - Kategori produk: `cincin`, `gelang`, `kalung`, `anting` - `berat` (numeric, required) - Berat produk dalam gram - `kadar` (integer, required) - Kadar emas - `harga_per_gram` (numeric, required) - Harga per gram - `harga_jual` (numeric, required) - Harga jual - `id_user` (integer, optional) - User ID untuk mengambil foto sementara baru - `hapus_foto_lama` (boolean, optional) - Flag untuk menghapus foto lama (default: false) **Response Success (200):** ```json { "message": "Produk berhasil diubah", "data": { "id": 1, "nama": "Cincin Berlian Updated", "kategori": "cincin", "berat": 3.0, "kadar": 22, "harga_per_gram": 900000, "harga_jual": 3000000, "updated_at": "2025-08-27T11:30:00.000000Z", "foto": [ { "id": 2, "id_produk": 1, "url": "http://localhost:8000/storage/foto/cincin2.jpg", "created_at": "2025-08-27T11:30:00.000000Z", "updated_at": "2025-08-27T11:30:00.000000Z" } ] } } ``` --- ### 5. Delete Product **DELETE** `/produk/{id}` Menghapus produk berdasarkan ID (soft delete) beserta foto-foto terkait. **Parameters:** - `id` (integer, required) - Product ID **Response Success (200):** ```json { "message": "Produk berhasil dihapus." } ``` **Response Error (404):** ```json { "message": "No query results for model [App\\Models\\Produk] 999" } ``` --- ## Foto Sementara API ### 1. Upload Foto Sementara **POST** `/foto/upload` Upload foto sementara yang akan digunakan saat create/update produk. **Headers:** ``` Content-Type: multipart/form-data ``` **Request Body (Form Data):** - `id_produk` (integer, required) - Product ID (untuk validasi exists di tabel produk) - `foto` (file, required) - File foto (jpg, jpeg, png, max: 2MB) **Response Success (201):** ```json { "message": "Foto berhasil disimpan" } ``` **Response Error (422):** ```json { "message": "The given data was invalid.", "errors": { "id_produk": ["The id_produk field is required."], "foto": ["The foto field is required."] } } ``` **Response Error - Invalid File (422):** ```json { "message": "The given data was invalid.", "errors": { "foto": [ "The foto must be an image.", "The foto must be a file of type: jpg, jpeg, png.", "The foto may not be greater than 2048 kilobytes." ] } } ``` --- ### 2. Hapus Foto Sementara **DELETE** `/foto/hapus/{id}` Menghapus foto sementara berdasarkan ID. **Parameters:** - `id` (integer, required) - Foto Sementara ID **Response Success (200):** ```json { "message": "Foto berhasil dihapus" } ``` **Response Error (404):** ```json { "message": "No query results for model [App\\Models\\FotoSementara] 999" } ``` --- ### 3. Get Foto Sementara User **DELETE** `/foto/get/{user_id}` Ambil semua foto sementara milik user tertentu. **Parameters:** - `user_id` (integer, required) - User ID **Response Success (200):** ```json [ { "id": 2, "id_user": 1, "url": "http://localhost:8000/storage/foto/cincin2.jpg", "created_at": "2025-08-27T11:30:00.000000Z", "updated_at": "2025-08-27T11:30:00.000000Z" } ] ``` --- ### 4. Reset Foto Sementara User **DELETE** `/foto/reset/{user_id}` Menghapus semua foto sementara milik user tertentu. **Parameters:** - `user_id` (integer, required) - User ID **Response Success (200):** ```json { "message": "Foto sementara berhasil direset" } ``` --- ## Workflow Penggunaan ### Membuat Produk dengan Foto: 1. Upload foto menggunakan `POST /api/foto/upload` dengan `id_produk` dummy atau existing 2. Simpan `id_user` yang digunakan saat upload 3. Create produk dengan `POST /api/produk` dan sertakan `id_user` 4. Foto sementara akan otomatis dipindahkan ke foto permanent ### Update Produk dengan Foto Baru: 1. Upload foto baru dengan `POST /api/foto/upload` 2. Update produk dengan `PUT /api/produk/{id}`, sertakan `id_user` dan `hapus_foto_lama: true` 3. Foto lama akan dihapus dan foto sementara dipindahkan ke permanent ### Membersihkan Foto Sementara: - Gunakan `DELETE /api/foto/reset/{user_id}` untuk menghapus semua foto sementara user - Atau `DELETE /api/foto/hapus/{id}` untuk menghapus foto sementara spesifik