
# Kimlik ayarlarını güncelle

`PATCH /v1/identity-settings` · izin `identity-settings:write`

Ortamın kullanıcı adı ayarlarını JSON birleştirme yamasıyla (`application/merge-patch+json`, RFC 7396) günceller. `If-Match` zorunludur: yoksa `428`, eski sürümse `412` döner. Ayar hiç yazılmadıysa sürüm `"0"`'dır ve ilk yazma satırı açar. Hiçbir şeyi değiştirmeyen yama yazma yapmaz ve sürümü korur.

## İstek

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `If-Match` | başlık | evet | Ayarların son okunan `ETag` değeri (hiç yazılmadıysa `"0"`). Yoksa `428`, eskiyse `412`. |
| `username_identifier` | string | hayır | `required`, `optional` ya da `off`. `null` olamaz. |
| `username_min_length` | integer | hayır | 3-64, `username_max_length` değerinden büyük olamaz. `null` olamaz. |
| `username_max_length` | integer | hayır | 3-64, `username_min_length` değerinden küçük olamaz. `null` olamaz. |
| `reserved_usernames` | string[] \| null | hayır | En çok 1000 ad; listenin tamamının yerini alır (RFC 7396 dizileri birleştirmez). `null` ya da `[]` temizler. Her giriş normalleştirilir, tekrarlar atılır ve liste sıralı saklanır. |
| `verification_policy` | string | hayır | `before_sign_in` (varsayılan) ya da `after_sign_in`. `after_sign_in` doğrulanmamış hesap temizliğini durdurur. `null` olamaz. |
| `unverified_account_ttl_days` | integer | hayır | 1-30 (varsayılan 7): `before_sign_in` ortamında doğrulanmamış kaydın silinmeden önce tutulduğu gün sayısı. `null` olamaz. |

Kullanıcı adı ayarları yalnız sonraki yazmalara uygulanır; var olan kullanıcılar bu ayarlarla asla değiştirilmez. Doğrulama ayarları var olan kayıtlara da etki eder (aşağıda).

## Zorlama kuralları

- `off` (varsayılan): kullanıcı adı yazan istek (`POST /v1/users`, `PATCH /v1/users/{id}`) `422` ve `identifier_type_disabled` koduyla (işaretçi `/username`) reddedilir. Var olan kullanıcı adını temizlemek serbesttir; kullanıcı adına dokunmayan kullanıcı yaması yeniden denetlenmez. Giriş, hesapları kullanıcı adıyla çözmez.
- `optional`: kullanıcı adı verilebilir. `required`: yönetim API'siyle kullanıcı adı olmadan kullanıcı oluşturmak `422` (`required`) ile reddedilir ve yönetim yaması onu temizleyemez. Kayıt formunda kullanıcı adı istemek barındırılan girişin işidir; sosyal ve anlık (JIT) oluşturma kullanıcı adı istemez.
- Uzunluk: `username_min_length`'ten kısa ya da `username_max_length`'ten uzun kullanıcı adı `422` (`invalid`) ile reddedilir.
- Ayrılmış adlar: normalleştirilmiş hâli `reserved_usernames` içinde olan kullanıcı adı `422` ve `username_reserved` koduyla reddedilir. Geçersiz liste girişi `422` ve `/reserved_usernames/<i>` işaretçisiyle reddedilir.
- Ayar değişince var olan kullanıcılar değiştirilmez; kurallar yalnız sonraki yazmalara uygulanır.

## Doğrulanmamış hesap temizliği

`verification_policy` ve `unverified_account_ttl_days`, hiç doğrulanmamış kayıtların otomatik temizliğini yönetir. Temizlik yalnız e-posta adresi (ya da telefon numarası) zorunlu tanımlayıcıyken çalışır; e-posta için varsayılan budur.

- `before_sign_in` (varsayılan): kayıtla oluşturulan kullanıcı, zorunlu tanımlayıcısını doğrulamadan token alamaz. Kayıttan `unverified_account_ttl_days` gün (1-30, varsayılan 7) sonra hâlâ doğrulanmış e-posta adresi ya da telefon numarası olmayan, hiç token almamış ve sosyal ya da kurumsal (SAML/OIDC) kimliği bulunmayan kayıt kullanıcısı kalıcı olarak silinir. Temizlik düzenli aralıklarla (varsayılan olarak saatte bir) çalışır.
- `after_sign_in`: kullanıcı doğrulamadan token alır (`email_verified: false`); temizlik çalışmaz ve hiçbir kullanıcı silinmez.
- Asla silinmeyenler: yönetim API'si, içe aktarma, SCIM, davet ya da anlık (JIT) federasyonla oluşturulan kullanıcılar, engellenmiş kullanıcılar ve silinmesi zaten başlamış kullanıcılar. Yalnız temizliğin ortamda başlamasından sonra oluşturulan kayıtlar aday olur.
- Silme geri alınamaz: kullanıcı sert silinir, nedeni `unverified_expired` olan bir mezar taşı kaydı tutulur ve `user.deleted` olayı yayımlanır.
- Politika ya da süre değişikliği bir sonraki koşuda geçerli olur. `unverified_account_ttl_days` küçültülürse daha eski doğrulanmamış kayıtlar hemen aday olur; `after_sign_in`'den `before_sign_in`'e dönülürse süresi dolmuş doğrulanmamış kayıtlar bir sonraki koşuda silinir.

## Yanıt

`200 OK`; güncel ayarlar ve yeni `ETag`.

```json
{
  "username_identifier": "optional",
  "username_min_length": 3,
  "username_max_length": 32,
  "reserved_usernames": ["admin", "root", "support"],
  "verification_policy": "before_sign_in",
  "unverified_account_ttl_days": 7,
  "updated_at": "2026-10-05T09:30:00.123456Z"
}
```

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Yamada bilinmeyen ya da salt okunur alan var ya da yama bir JSON nesnesi değil (`malformed_request`). |
| 412 | `precondition_failed` | `If-Match` güncel sürümle eşleşmiyor. |
| 415 | `unsupported_media_type` | İçerik türü `application/merge-patch+json` değil. |
| 422 | `validation_failed` | Bir değer geçersiz, `min` değeri `max` değerinden büyük ya da `null` olamayan bir alan `null` yapıldı (`code: invalid`). |
| 428 | `precondition_required` | `If-Match` başlığı yok. |
| 401 | `unauthenticated` | Kimlik bilgisi yok, geçersiz ya da iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisinde gerekli izin yok. |
| 429 | `rate_limited` | Hız sınırı aşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 503 | `service_unavailable` | Bir bağımlılık geçici olarak kullanılamıyor; `Retry-After` süresinden sonra yeniden deneyin. |

## Örnek

```bash
curl -X PATCH https://api.eu.keenauth.com/v1/identity-settings \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -H 'If-Match: "0"' \
  -d '{"username_identifier":"optional","username_max_length":32,"reserved_usernames":["admin","root","support"]}'
```
