> ## Documentation Index
> Fetch the complete documentation index at: https://docs.diyanet.pro/llms.txt
> Use this file to discover all available pages before exploring further.

# Sözlük

> Şablonda geçen DDD, CQRS, event-driven, identity ve operasyon terimlerinin Türkçe açıklamaları.

Bu sayfa, dokümantasyon boyunca geçen terimleri tek yerde toplar. İngilizce teknik terim korunur; açıklama Türkçedir.

## Domain & DDD

<AccordionGroup>
  <Accordion title="Aggregate">
    Tutarlılık sınırı oluşturan, birlikte kaydedilip yüklenen domain nesneleri kümesi. Dışarıdan yalnızca **aggregate root** üzerinden değiştirilir. Örnek: `User` aggregate'ı `UserSession`, `UserOtpChallenge`, `UserIdentityProvider`, `UserRole` çocuk entity'lerini kapsar.
  </Accordion>

  <Accordion title="Aggregate Root">
    Aggregate'e tek giriş noktası olan entity; `IAggregateRoot` marker'ı taşır. İş kuralları ve invariant'lar burada korunur, domain event'ler buradan (`AddDomainEvent`) yayılır. Repository'ler yalnızca root tipiyle çalışır.
  </Accordion>

  <Accordion title="Entity">
    Kimliği (`Id`) ile eşitlenen, yaşam döngüsü boyunca değişebilen nesne. Bu şablonda `EntityBase<TId>` / `Entity : EntityBase<Guid>` tabanından türer; `CreatedAt`, `UpdatedAt`, soft-delete alanlarını miras alır.
  </Accordion>

  <Accordion title="Value Object">
    Kimliği olmayan, **değeriyle** eşitlenen, immutable nesne. `ValueObject` tabanı `GetAtomicValues()` ile eşitlik üretir. Örnek: `Phone`, `Email`, `FullName`, `OtpCode`, `TCKimlikNo`.
  </Accordion>

  <Accordion title="Domain Event">
    Aggregate içinde gerçekleşen önemli bir olayın **aynı process** içindeki temsili. `DomainEvent : INotification` tabanından türer; `AddDomainEvent` ile biriker, `SaveEntitiesAsync` sonrası MediatR ile dispatch edilir. Örnek: `UserOtpGeneratedDomainEvent`.
  </Accordion>

  <Accordion title="Specification">
    Sorgu mantığını (where/orderby/include/paging) yeniden kullanılabilir bir nesnede kapsülleyen desen (Ardalis.Specification). Cache ve tag'leme spec üzerinden (`EnableCache`, `WithTags`) açılır. Örnek: `UserByPhoneNumberSpecification`, `PublicFaqsPagedSpecification`.
  </Accordion>

  <Accordion title="Repository">
    Aggregate'lere koleksiyon-benzeri erişim soyutlaması. `EFRepository<T> : RepositoryBase<T>, IRepository<T>` yazma için; `CachedRepository<T> : IReadRepository<T>` HybridCache decorator'ı okuma için. `EFRepository.SaveChangesAsync` bilerek exception fırlatır — kayıt `IUnitOfWork` ile yapılır.
  </Accordion>

  <Accordion title="Unit of Work">
    Bir işlemdeki tüm değişiklikleri tek transaction'da kaydeden soyutlama. `IUnitOfWork.SaveEntitiesAsync` SaveChanges'i çağırır ve ardından domain event'leri dispatch eder (`MediatorExtension.DispatchDomainEventsAsync`).
  </Accordion>

  <Accordion title="BuildingBlock">
    Domain'den bağımsız, yeniden kullanılabilir altyapı paketi (`src/BuildingBlocks/*`). Caching, Jwt, Keycloak, OAuth, Specification, DeviceDetector gibi 20 paket içerir.
  </Accordion>
</AccordionGroup>

## CQRS & Application

<AccordionGroup>
  <Accordion title="Command">
    Sistemin state'ini değiştirme niyeti (yazma). `IRequest<IResponseWrapper<T>>` implement eder; bir `CommandHandler` işler. Örnek: `SignUpUserCommand`, `VerifyOtpCommand`.
  </Accordion>

  <Accordion title="Query">
    State değiştirmeden veri okuma. Command ile aynı MediatR altyapısını kullanır ama yan etkisizdir; çoğu zaman cache'li okuma yapar. Örnek: `GetAdminMeQuery`.
  </Accordion>

  <Accordion title="Handler">
    Bir command/query/notification'ı işleyen sınıf (`IRequestHandler<,>` / `INotificationHandler<>`). İnce kalır: aggregate metodunu çağırır ve `SaveEntitiesAsync` ile kaydeder.
  </Accordion>

  <Accordion title="Pipeline Behavior">
    Her MediatR isteğinin etrafını saran ara katman. Bu şablondaki sıra: **Exception → Authorization → Validation → Permission**. Validation FluentValidation ile çalışır; başarısızlık `422`'ye dönüşür.
  </Accordion>
</AccordionGroup>

## Identity & Yetki

<AccordionGroup>
  <Accordion title="Realm (Keycloak)">
    Bağımsız kullanıcı havuzu + ayarları. Bu proje çift realm kullanır: vatandaş (`diyanet-vatandas-*-realm`) ve yönetim/personel (`diyanet-yonetim-*-realm`).
  </Accordion>

  <Accordion title="Client (Keycloak)">
    Bir realm içindeki uygulama tanımı. Örnek: `diyanet-website` (public + PKCE) ve `diyanet-admin` (token 5 dk).
  </Accordion>

  <Accordion title="Claim">
    Token içindeki anahtar-değer bilgisi. Bu projede önemli claim'ler: `permissions` (multivalued), `organization_id` / `tenant_id`, `accountStatus`.
  </Accordion>

  <Accordion title="Scope">
    Bir client'ın isteyebileceği yetki/veri kümesini tanımlayan OAuth/OIDC kavramı; token'a hangi claim'lerin gireceğini etkiler.
  </Accordion>

  <Accordion title="Permission">
    İnce taneli işlem yetkisi (örn. "FAQ yönet"). Lokal DB'de rol → permission eşlemesinden gelir ve `permissions` claim'ine yazılır; otorizasyon kararı her zaman lokaldir.
  </Accordion>

  <Accordion title="Tenant">
    Çok-kiracılı kurulumda bir kuruluşu/şubeyi temsil eden izolasyon birimi. `IMayHaveTenant` / `ITenant` ile modellenir; `organization_id` claim'i taşır.
  </Accordion>

  <Accordion title="TOTP">
    Time-based One-Time Password (RFC 6238). Authenticator uygulamasının ürettiği 6 haneli, zamana bağlı kod. `AuthenticationTotpService` (OtpNet) doğrular; pencere ±1 adım.
  </Accordion>

  <Accordion title="OTP">
    One-Time Password. Bu projede sunucu üretimi 4 haneli kod (`OtpCode`, 1000–9999), SMS (NetGSM) veya e-posta ile gönderilir. SMS challenge 1 dk geçerlidir.
  </Accordion>

  <Accordion title="PKCE">
    Proof Key for Code Exchange. Public client'larda (SPA) Authorization Code akışını koruyan ek doğrulama (S256 verifier/challenge). Keycloak akışlarında ve OAuth client'larda kullanılır.
  </Accordion>

  <Accordion title="Provisioning">
    Dış kimlikle (Keycloak) giren kullanıcıyı lokal DB'ye eşleme süreci. Personel realm **davet bazlıdır** — eşleşme yoksa `403 not_invited`. `ProvisionKeycloakUserCommandHandler` yürütür.
  </Accordion>
</AccordionGroup>

## Veri & Cache

<AccordionGroup>
  <Accordion title="HybridCache (L1/L2)">
    .NET'in iki kademeli cache altyapısı. **L1** in-memory (TTL \~1 dk), **L2** Redis (TTL \~5 dk). Kayıt sırası: `AddRedisCache` → `AddCache` → `AddHybridCache`. `IHybridRequestCache` ile erişilir.
  </Accordion>

  <Accordion title="Tag Invalidation">
    Cache girdilerini bir tag'le işaretleyip toplu silme. `WithTags(tag)` ile spec'te işaretlenir; `RemoveByTagAsync(tag)` ile düşürülür. Örnek tag: `faqs`.
  </Accordion>

  <Accordion title="Soft Delete">
    Kaydı fiziksel silmek yerine `DeletedAt`/`DeletedBy` set etmek. `AuditInterceptor` `Deleted` durumunu `Modified`'a çevirir; her `ISoftDeletable` için `DeletedAt == null` global query filter uygulanır.
  </Accordion>

  <Accordion title="Audit">
    `CreatedAt/By`, `UpdatedAt/By` (ve soft-delete) alanlarının otomatik doldurulması. Tek `AuditInterceptor : SaveChangesInterceptor` ile.
  </Accordion>

  <Accordion title="Migration">
    EF Core şema değişikliği dosyası. `dotnet ef migrations add <Ad> -p Infrastructure.EFCore -s API` ile üretilir.
  </Accordion>

  <Accordion title="Snake_case">
    PostgreSQL'de tablo/kolon isimlendirme kuralı (`EFCore.NamingConventions`). DbContext snake\_case kullanır; kod PascalCase kalır.
  </Accordion>
</AccordionGroup>

## Event-Driven

<AccordionGroup>
  <Accordion title="Integration Event">
    Process/servis-arası olay. `IntegrationEvent` tabanından türer, `IEventBus.PublishAsync` ile Outbox'a yazılır, RabbitMQ üzerinden teslim edilir. Örnek: `CacheInvalidationIntegrationEvent`.
  </Accordion>

  <Accordion title="Outbox">
    Olayı, onu doğuran DB değişikliğiyle **aynı transaction** içinde `messaging.outbox_message` tablosuna yazma deseni. MassTransit relay tabloyu okuyup RabbitMQ'ya yayar — "kaydedildi ama yayınlanmadı" tutarsızlığını önler.
  </Accordion>

  <Accordion title="Inbox">
    Gelen mesajların tekrar işlenmesini önleyen idempotency deseni (consumer tarafı). At-least-once teslimatta aynı mesaj iki kez gelirse ikincisi yutulur.
  </Accordion>

  <Accordion title="DLX (Dead Letter Exchange)">
    Tekrarlı denemelere rağmen işlenemeyen mesajların yönlendirildiği exchange/kuyruk. Retry stratejisi: in-process 3×2 sn + gecikmeli yeniden teslim `[0.16, 1, 5]` dk + DLX.
  </Accordion>
</AccordionGroup>

## Operasyon

<AccordionGroup>
  <Accordion title="Seq">
    Yapılandırılmış log toplama/sorgulama aracı (Serilog sink). Dev'de ingest `5341`, UI `5342` portunda.
  </Accordion>
</AccordionGroup>

## İlgili

<CardGroup cols={2}>
  <Card title="Sık Sorulan Sorular" icon="circle-question" href="/reference/faq">
    Kavramsal ve operasyonel kısa cevaplar.
  </Card>

  <Card title="Mimari Genel Bakış" icon="sitemap" href="/architecture/overview">
    Katmanlar ve bağımlılık akışı.
  </Card>
</CardGroup>
