
# İzin güncelleme

`PATCH /v1/permissions/{permission_id}` · izin `apis:write`

Bir izni JSON birleştirme yaması (RFC 7396, `application/merge-patch+json`) ile günceller: gönderdiğiniz alanlar değişir, diğerleri olduğu gibi kalır. İzinlerin bir sürümü olmadığı için `If-Match` kullanılmaz.

## İstek

| Parametre | Konum | Açıklama |
|---|---|---|
| `permission_id` | path | İzin kimliği (`perm_…`). |

Gövde: aşağıdaki alanlardan herhangi biri (hepsi isteğe bağlı, en az biri gerekli).

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `value` | string | hayır | Yalnızca mevcut değere eşitse kabul edilir; hiçbir zaman değişmez. |
| `display_name` | string \\| null | hayır | Onay ekranında kapsam değeri yerine gösterilen kısa ad. En fazla 128 karakter. |
| `description` | string \\| null | hayır | Onay ekranında ad altında gösterilen ayrıntı satırı. En fazla 1024 karakter. |
| `consent_text_i18n` | object \\| null | hayır | Dil etiketi → onay ekranı metni, örneğin `{"en": "Read your orders"}`. En fazla 30 dil, her metin 1-1024 karakter, toplamda 16 KiB. |
| `sensitivity` | string | hayır | `normal` (varsayılan) veya `sensitive`. |

`display_name`, `description` ve `consent_text_i18n` alanları `null` gönderilerek temizlenir; `sensitivity` temizlenemez. `consent_text_i18n` bütün olarak değiştirilir: eklemediğiniz diller kaldırılır, bu yüzden korumak istediğiniz her dili gönderin.

### Onay ekranı metinleri

Barındırılan onay ekranı istenen her kapsamı şu şekilde gösterir: sayfa dili için `consent_text_i18n` girdisi (tam etiket, yoksa birincil alt etiketi), yoksa `display_name`, yoksa kapsam `value` değeri; `description` ayrıntı satırı olarak gösterilir. Üçü de düz metindir. Denetim karakterleri (satır sonları ve sekmeler dahil), satır ve paragraf ayırıcıları ile çift yönlü gömme, geçersiz kılma ve izolasyon karakterleri (U+202A-U+202E, U+2066-U+2069) `422` ile reddedilir. Baştaki ve sondaki boşluklar kırpılır; kırpıldıktan sonra boş kalan metin `null` olarak saklanır. HTML yorumlanmaz: onay ekranı bunu kaçış karakterleriyle gösterir.

## Yanıt

`200 OK`

```json
{
  "id": "perm_01h455vb4pex5vsknk084sn02s",
  "api_id": "api_01h455vb4pex5vsknk084sn02q",
  "value": "read:orders",
  "display_name": "Read orders",
  "description": "See your past orders and their status",
  "consent_text_i18n": {
    "en": "Read your orders",
    "tr": "Siparişlerinizi okuyun"
  },
  "sensitivity": "normal"
}
```

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Yamada `api_id` veya bilinmeyen bir alan var. |
| 404 | `not_found` | Bu ortamda böyle bir izin yok. |
| 409 | `conflict` | İzin sistem API'sine ait. |
| 415 | `unsupported_media_type` | İçerik türü `application/merge-patch+json` değil. |
| 422 | `validation_failed` | Yama boş, bir değer geçersiz veya düz metin değil, `sensitivity` `null`, ya da `value` farklı (`immutable`). |

## Örnek

```bash
curl -X PATCH https://api.eu.keenauth.com/v1/permissions/perm_01h455vb4pex5vsknk084sn02s \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{"description":"See your past orders and their status","consent_text_i18n":{"en":"Read your orders","tr":"Siparişlerinizi okuyun"}}'
```
