# Sepet sahiplenme

Bir ziyaretçi sepetini tipik olarak anonim şekilde oluşturur ve ancak daha sonra giriş yapar. Sahiplenme (claim), bu anonim sepeti `X-Customer-Token` ile tanımlanan giriş yapmış müşteriye bağlar. Bu andan itibaren sepet müşteriye aittir: sepete yönelik request'ler sahibinin token'ını taşımalıdır (Sepetler sayfasındaki sahiplik kurallarına bakın), fiyatlar müşterinin fiyatlandırma bağlamında çözümlenir ve checkout siparişi müşteriye bağlar.

## Birleştirme davranışı

Müşterinin zaten başka `active` sepetleri varsa, her biri sahiplenilen sepete katlanır:

- Satırlar; ürün, varyant ve yapılandırma kombinasyonu üzerinden tekilleştirilir: eşleşen satırların adetleri toplanır, ardından politikanın `max_quantity_per_line` değeriyle sınırlandırılır.
- Sahiplenilen sepet `max_lines` değerine ulaştığında, eski sepetten gelen fazladan ayrı satırlar atılır.
- Sahiplenilen sepet, ayarlıysa kendi `email` ve `metadata` değerlerini korur; ikisinden biri null ise eski sepetin değerini alır.
- Her eski sepetin durumu `merged` olur ve stok rezervleri serbest bırakılır. Birleştirilmiş bir sepet id'si `GET /carts/{id}` üzerinde çalışmaya devam eder ancak yazma işlemlerinde 404 döner.

Zaten aynı müşteriye ait bir sepeti sahiplenmek hiçbir şey yapmaz (no-op) ve sepeti değişmeden döndürür. Farklı bir müşteriye ait bir sepeti sahiplenmek 403 ile başarısız olur.

E-posta yakalama (`email` ile `PATCH /carts/{id}`) yoluyla bir misafir müşteri kaydına bağlanmış bir sepetin de `customer_id` alanının dolu olduğunu unutmayın: onu sahiplenmek yalnızca token aynı müşteriye çözümlendiğinde başarılı olur; aksi halde 403 durumu geçerlidir.

## POST /v1/api/commerce/carts/{id}/claim

`commerce:write` ve `active` bir sepet gerektirir. `X-Customer-Token` zorunludur: çözümlenebilir bir token olmadan request, 401 durumu ve boş bir gövdeyle başarısız olur. Request body yoktur. Artık birleştirilen satırları da içeren, `GET /v1/api/commerce/carts/{id}` ile aynı şekle sahip tam sepet zarfını 200 durumuyla döndürür.

### Parametreler

**Path**

| Ad | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `id` | string (UUID) | evet | Sepet id'si. `active` bir sepet olmalıdır. |

**Header'lar**

| Ad | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `X-Customer-Token` | string | evet | Müşteri oturum token'ı. Bir müşteriye çözümlenmelidir, aksi halde 401. |

Body yok.

```bash title="Request"
curl -X POST https://api.borkol.com/v1/api/commerce/carts/9d3f2a10-6b7c-4e6d-9f21-8a54c1d2e3f4/claim \
  -H "Authorization: Bearer {api_key}" \
  -H "X-Customer-Token: {customer_token}"
```

```javascript title="Request (JS)"
const res = await fetch(
  `https://api.borkol.com/v1/api/commerce/carts/${cartId}/claim`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${apiKey}`,
      "X-Customer-Token": customerToken,
    },
  }
);
const { data: cart } = await res.json();
```

```json title="Response"
{
  "data": {
    "id": "9d3f2a10-6b7c-4e6d-9f21-8a54c1d2e3f4",
    "status": "active",
    "lines": [
      { "id": "5e6f7a8b-...", "quantity": 3, "...": "..." },
      { "id": "6f7a8b9c-...", "quantity": 1, "...": "merged in from the customer's previous cart" }
    ],
    "...": "same cart shape as GET /v1/api/commerce/carts/{id}"
  }
}
```

### Hatalar

| Durum | Gövde | Ne zaman |
| --- | --- | --- |
| 401 | boş gövde | `X-Customer-Token` eksik veya çözümlenemiyor ya da customers modülü kullanılamıyor. |
| 403 | boş gövde | Sepet zaten farklı bir müşteriye bağlı. |
| 404 | `{"message": "..."}` | Sepet bilinmiyor, süresi dolmuş veya `active` değil. |
| 403 | scope, modül veya askıya alma gövdesi | Sepetler sayfasına bakın. |
| 429 | `{"message": "Too Many Attempts."}` | Rate limit aşıldı. |
