
# Dizini güncelle

`PATCH /v1/directories/{directory_id}` · izin `directories:write`

Dizinin adını ve provizyon ayarlarını JSON birleştirme yamasıyla (RFC 7396, `Content-Type: application/merge-patch+json`) günceller. `If-Match` zorunludur; güncel değer `GET /v1/directories/{directory_id}` yanıtının `ETag` başlığındadır. Hiçbir alan `null` kabul etmez. Değişiklik içermeyen yama yazma yapmaz ve sürümü korur. Yazma, değişen her ayarın eski ve yeni değeriyle `directory.updated` olarak denetlenir.

- `provisioning_mode`, dizinde silinmemiş kullanıcı kaydı varken değişmez (`409 conflict`); bunun yerine dizini silip yeniden oluşturun.
- `attribute_allowlist` bütünüyle değişir. Listeden çıkarılan öznitelik dizinin kullanıcı kayıtlarından aynı işlemde silinir.
- `mass_deprovision_guard` kısmen yamalanabilir; vermediğiniz alt alanlar korunur.

## İstek

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `directory_id` | path | evet | SCIM dizini kimliği (`dir_…`). |
| `If-Match` | header | evet | Dizinin güncel `ETag` değeri. |
| `name` | string | hayır | 1–64 karakter; denetim karakteri yok, başta ve sonda boşluk yok. |
| `provisioning_mode` | string | hayır | `user_store` (ortam kullanıcısı, org üyeliği ve grup rolleri de yazılır) ya da `mirror` (yalnız dizin kayıtları tutulur). |
| `attribute_allowlist` | array | hayır | Saklanan isteğe bağlı SCIM öznitelikleri, tekrarsız: `title`, `usertype`, `phonenumbers` ve kurumsal uzantının `employeenumber`, `department`, `division`, `costcenter`, `organization`, `manager` öznitelikleri (tam `urn:ietf:params:scim:schemas:extension:enterprise:2.0:user:` adlarıyla). |
| `unverified_domain_action` | string | hayır | E-posta alan adı doğrulanmamış kullanıcı: `invite` (davetli üyelik) ya da `mirror_only` (yalnız dizin kaydı). |
| `delete_action` | string | hayır | SCIM `DELETE /Users`: `remove_membership` ya da `delete_user` (dizinin yönettiği kullanıcıyı siler). |
| `on_delete_memberships` | string | hayır | Dizin silinince bu dizinden gelen üyeliklere ne olacağı: `keep`, `suspend` ya da `remove`. |
| `mass_deprovision_guard` | object | hayır | `enabled` (boolean), `percent` (5–50) ve `absolute_min` (10–1000): 5 dakika içinde iki eşiği de aşan pasifleştirmeler onaya bekletilir. |
| `send_welcome_email` | boolean | hayır | Yeni dizin kullanıcısına hesap etkinleştirme e-postası gönderilip gönderilmeyeceği. |

## Yanıt

`200 OK`, dizin ve yeni `ETag` değeriyle.

```json
{
  "id": "dir_01j9xm2n4p6q8r0s2t4v6w8y0z",
  "organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "type": "scim",
  "name": "Okta EU",
  "state": "active",
  "base_url": "https://acme.eu.keenauth.app/scim/v2/dir_01j9xm2n4p6q8r0s2t4v6w8y0z",
  "created_at": "2026-10-19T09:31:00.123456Z",
  "last_request_at": null,
  "provisioning_mode": "user_store",
  "attribute_allowlist": ["title", "urn:ietf:params:scim:schemas:extension:enterprise:2.0:user:department"],
  "unverified_domain_action": "invite",
  "delete_action": "remove_membership",
  "on_delete_memberships": "keep",
  "mass_deprovision_guard": {"enabled": true, "percent": 20, "absolute_min": 25},
  "send_welcome_email": false
}
```

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `malformed_request` | Gövde bir JSON nesnesi değil. |
| 400 | `unknown_field` | Yamada yazılamayan bir alan var (örneğin `state`). |
| 404 | `not_found` | Dizin bu ortamda yok. |
| 409 | `conflict` | Dizinde kullanıcı kaydı varken `provisioning_mode` değişiyor ya da dizin siliniyor. |
| 412 | `precondition_failed` | `If-Match` güncel sürümle eşleşmiyor. |
| 415 | `unsupported_media_type` | `Content-Type` `application/merge-patch+json` değil. |
| 422 | `validation_failed` | Bir alan `null` ya da geçersiz; hata alanı adlandırır (örneğin `/mass_deprovision_guard/percent` `invalid`). |
| 428 | `precondition_required` | `If-Match` 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` | Dizin eşitleme geçici olarak kullanılamıyor ya da bu kurulumda yapılandırılmamış; `Retry-After` süresinden sonra yeniden deneyin. |

## Örnek

```bash
curl -i -X PATCH "https://api.eu.keenauth.com/v1/directories/dir_01j9xm2n4p6q8r0s2t4v6w8y0z" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H 'If-Match: "3"' \
  -H "Content-Type: application/merge-patch+json" \
  -d '{"name":"Okta EU","mass_deprovision_guard":{"percent":20}}'
```
