
# SCIM provisioning simülasyonu

`POST /v1/directories/{directory_id}:simulate` · izin `directories:write` · yalnızca geliştirme ve staging ortamları

Dizinin gerçek SCIM uç noktasına karşı tek bir SCIM simülatör senaryosu çalıştırır. Yalnızca bu çalıştırma için KeenAuth gerçek bir
SCIM belirteci üretir, bunu kullanır ve ardından iptal eder. Belirteç denetimleri, hız sınırları, toplu deprovision devre kesicisi ve
provisioning günlüğü, kimlik sağlayıcınız için olduğu gibi çalışır. Kullanıcılar, 5 grupta yer alan `example.test` alan adındaki 25 kişiden
oluşan sabit ve kurgusal bir kümedir. Gerçek kişisel veri içermezler.

Simülatör bir geliştirme aracıdır ve dizini değiştirir. Yazdığı kullanıcılar ve gruplar, provision edilen diğer kayıtlar gibi dizinde kalır.
Test için oluşturduğunuz bir dizin kullanın.

| Senaryo | Ne yapar |
|---|---|
| `seed` | 25 kullanıcıyı ve 5 grubu üyelikleriyle birlikte oluşturur. Bunların zaten bulunduğu bir dizinde ilk kullanıcı SCIM `409` alır ve çalıştırma `failed` olur. |
| `bulk_deactivate` | Kullanıcıların %60'ı için (25 içinden 15'i) `active=false` gönderir. Devre kesici yalnızca dizinin `mass_deprovision_guard.absolute_min` değeri 15 veya daha düşükse devreye girer. Varsayılan değer olan 25 ile devreye girmez. |
| `group_churn` | Bir kullanıcıyı bir gruptan başka bir gruba taşır. |
| `attribute_update` | Her kullanıcının görünen adını ve soyadını değiştirir. |
| `conflict_email` | Mevcut bir `userName` ile kullanıcı oluşturur ve SCIM `409 uniqueness` yanıtı bekler. |

Dizin boşsa `seed` dışındaki her senaryo önce `seed` çalıştırır.

Simülasyon belirteci hiçbir yerde listelenmez ve 2 geçerli belirteç sayısına dahil edilmez. Bu belirteci kullanmak, kimlik sağlayıcınızın
belirteç rotasyonunu başlatmaz. Dizin başına aynı anda yalnızca bir çalıştırma devam edebilir. Çalıştırma
`directory.simulation_started` ve `directory.simulation_finished` olarak denetlenir.

## İstek

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `directory_id` | path | evet | SCIM dizin kimliği (`dir_…`). |
| `scenario` | body, string | evet | `seed`, `bulk_deactivate`, `group_churn`, `attribute_update` veya `conflict_email`. |
| `Idempotency-Key` | header | hayır | Yeniden denenen istek için ilk yanıtı tekrar oynatır; senaryo yeniden çalışmaz. |

```json
{"scenario": "bulk_deactivate"}
```

## Yanıt

`200 OK` ile çalıştırmanın sonucu döner. SCIM hata yanıtı isteği başarısız kılmaz. Çalıştırmayı `failed` yapar, `failure` alanını
doldurur ve sayıları hataya kadar başarılı olanlar olarak bırakır. Sonuç yalnızca sayıları ve durumları içerir: kullanıcı, SCIM kimliği veya
belirteç bulunmaz.

```json
{
  "directory_id": "dir_01j9xm2n4p6q8r0s2t4v6w8y0z",
  "scenario": "bulk_deactivate",
  "status": "completed",
  "users_created": 0,
  "groups_created": 0,
  "users_updated": 0,
  "groups_updated": 0,
  "users_deactivated": 15,
  "conflicts": 0,
  "circuit_breaker_tripped": true,
  "deprovision_hold": {"id": "0191e9b2-6f3a-7c4d-8e5f-0a1b2c3d4e5f", "pending_count": 6},
  "failure": null,
  "started_at": "2026-10-28T09:31:00.123456Z",
  "completed_at": "2026-10-28T09:31:01.654321Z"
}
```

| Alan | Açıklama |
|---|---|
| `status` | `completed`, ya da uç nokta bir SCIM hatası döndürdüğünde, çalıştırma çok uzun sürdüğünde veya bir yanıt senaryonun beklediği gibi olmadığında `failed`. |
| `users_updated` | Deaktivasyonlar dışındaki kullanıcı PATCH istekleri. |
| `users_deactivated` | Uç nokta tarafından kabul edilen `active=false` PATCH istekleri; tutulanlar dahil. |
| `conflicts` | Beklenen `409 uniqueness` yanıtları (`conflict_email`). |
| `circuit_breaker_tripped` | Çalıştırma sırasında bir toplu deprovision bekletmesi açıldı. |
| `deprovision_hold` | Çalıştırmadan sonra dizinde açık olan bekletme veya `null`. Onaylamak ya da reddetmek için `deprovision-holds` uç noktalarını kullanın. |
| `failure` | `completed` ise `null`. Aksi halde `reason` (`scim_error`, `timeout` veya `unexpected_response`) ve `scim_error` için ayrıca `scim_status` (HTTP durumu) ile `scim_type` (SCIM `scimType` değeri veya `null`). |

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Gövde, `scenario` dışında bir alan içeriyor. |
| 403 | `test_feature_not_in_production` | Ortam bir üretim ortamı. |
| 404 | `not_found` | Dizin bu ortamda mevcut değil. |
| 409 | `conflict` | Bu dizin için başka bir çalıştırma devam ediyor ya da dizin devre dışı bırakılmış veya silinmek üzere. |
| 422 | `validation_failed` | `scenario` eksik veya bilinmiyor (`/scenario`). |
| 422 | `idempotency_key_reuse` | `Idempotency-Key`, farklı bir istek için kullanıldı. |
| 401 | `unauthenticated` | Kimlik bilgisi eksik, geçersiz veya iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisi gerekli izne sahip değil. |
| 429 | `rate_limited` | Hız sınırı aşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 503 | `service_unavailable` | Dizin senkronizasyonu veya simülatör geçici olarak kullanılamıyor ya da bu dağıtımda yapılandırılmamış; `Retry-After` süresinden sonra yeniden deneyin. |

## Örnek

```bash
curl -X POST "https://api.eu.keenauth.com/v1/directories/dir_01j9xm2n4p6q8r0s2t4v6w8y0z:simulate" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scenario": "seed"}'
```

```bash
keenauth directories simulate dir_01j9xm2n4p6q8r0s2t4v6w8y0z --scenario bulk_deactivate
```
