377 lines
8.1 KiB
Markdown
377 lines
8.1 KiB
Markdown
# 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 |