# Sepet (Cart) API Kullanım Kılavuzu

Bu doküman, alışveriş sepeti (Shopping Cart) API'sinin nasıl kullanılacağını, uç noktaları (endpoints), istek parametrelerini ve örnek senaryoları içerir.

## Genel Bilgiler

- **Base URL:** `/api/v1/cart/`
- **Mantık:** Sepet, sunucu tarafında **Session (Oturum)** tabanlı çalışır.
- **Önemli Not:** İstemci (Frontend/Mobile), sunucudan dönen `sessionid` çerezini (cookie) saklamalı ve sonraki tüm isteklerde header içinde geri göndermelidir. Aksi takdirde her istekte yeni, boş bir sepet oluşturulur.

---

## Uç Noktalar (Endpoints)

### 1. Sepeti Görüntüle

Mevcut sepetin içeriğini ve toplam tutarını getirir.

- **URL:** `/api/v1/cart/`
- **Method:** `GET`

**Örnek Yanıt:**
```json
{
    "items": [
        {
            "product": {
                "id": 1,
                "title": "Örnek Ürün",
                "price": 100.00,
                "images": "http://localhost:8000/media/...",
                ...
            },
            "quantity": 2,
            "price": "100.00",
            "total_price": "200.00"
        }
    ],
    "total_price": "200.00"
}
```

---

### 2. Sepete Ürün Ekle / Güncelle

Sepete yeni bir ürün ekler veya mevcut ürünün miktarını değiştirir.

- **URL:** `/api/v1/cart/add/`
- **Method:** `POST`

**Parametreler (Body - JSON):**

| Parametre | Tip | Zorunlu | Açıklama |
|-----------|-----|---------|----------|
| `product_id` | Integer | Evet | Eklenecek ürünün ID'si. |
| `quantity` | Integer | Hayır | Miktar (Varsayılan: 1). |
| `override_quantity` | Boolean | Hayır | `true` ise miktarı direkt eşitler, `false` ise mevcut miktarın üzerine ekler (Varsayılan: `false`). |

#### Senaryo A: Sepete Ürün Ekleme (veya Miktar Artırma)
Mevcut miktarın üzerine ekler. (Örn: Sepette 1 tane var, 2 tane daha ekle = 3 olur).

**İstek:**
```json
{
    "product_id": 1,
    "quantity": 2,
    "override_quantity": false
}
```

#### Senaryo B: Miktarı Güncelleme / Azaltma
Miktarı direkt olarak belirtilen sayıya eşitler. (Örn: Sepette 5 tane var, 4'e düşürmek istiyorsunuz).

**İstek:**
```json
{
    "product_id": 1,
    "quantity": 4,
    "override_quantity": true
}
```

#### Senaryo C: Miktarı Sıfırlayarak Silme
Eğer `override_quantity: true` iken `quantity: 0` gönderirseniz, ürün sepetten silinir.

**İstek:**
```json
{
    "product_id": 1,
    "quantity": 0,
    "override_quantity": true
}
```

---

### 3. Sepetten Ürün Silme

Belirli bir ürünü sepetten tamamen kaldırır.

- **URL:** `/api/v1/cart/remove/<product_id>/`
- **Method:** `DELETE`

**Örnek:** `/api/v1/cart/remove/1/`

**Yanıt:** Güncel sepet içeriğini döndürür (Ekleme işlemiyle aynı formatta).

---

### 4. Sepeti Temizle

Sepetteki tüm ürünleri siler.

- **URL:** `/api/v1/cart/clear/`
- **Method:** `POST`

**Yanıt:**
```json
{
    "message": "Cart cleared"
}
```

---

## Frontend Entegrasyonu İçin İpuçları (React/Vue/Mobile)

1. **Cookie Yönetimi:** Axios veya Fetch kullanırken `credentials: 'include'` veya `withCredentials: true` ayarının açık olduğundan emin olun. Bu, Django'nun session cookie'sini tarayıcının saklamasını ve göndermesini sağlar.
   
   ```javascript
   // Axios Örneği
   axios.post('/api/v1/cart/add/', data, {
       withCredentials: true
   });
   ```

2. **Ürün Detayları:** Sepet yanıtı (`items` dizisi) içindeki `product` objesi, `ProductSerializer`'dan gelen tüm veriyi (resim, slug, başlık vb.) içerir. Ekstra bir istek atmanıza gerek yoktur.

3. **Toplam Fiyat:** Sepet toplamı `total_price` alanında string decimal olarak gelir (Örn: "1250.50"). Frontend'de gösterirken formatlamanız gerekebilir.
