> ## 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.

# Mimari Genel Bakış

> Clean Architecture katmanları, bağımlılık yönü, DDD sınırları

## Yaklaşım

Sistem **Clean Architecture + DDD** ilkeleriyle yapılandırıldı. Bağımlılıklar **içeriye doğru** akar: dış katmanlar iç katmanlara referans verir, iç katmanlar dış katmanları **bilmez**.

```mermaid theme={null}
flowchart TB
    P[Presentation<br/>API + Admin SPA + Website SPA]
    APP[Application<br/>UseCases + DomainEventHandlers + IntegrationEventHandlers]
    DOM[Domain<br/>Aggregates + Entities + DomainEvents + Specifications]
    SK[Domain.SharedKernel<br/>ValueObjects + Base classes]
    INF[Infrastructure<br/>EFCore + Services.*]
    BB[BuildingBlocks<br/>20 cross-cutting modül]

    P --> APP
    APP --> DOM
    APP --> INF
    APP --> BB
    DOM --> SK
    INF --> DOM
    INF --> BB
    SK --> BB
```

## Katman sorumlulukları

### Domain (`DiyanetCleanArchitecture.Domain`)

* Aggregate root'lar (`User`, `Citizen`, `Organization`, `Faq`, `Role`, ...)
* Domain event'ler (`UserCreatedDomainEvent`, `FaqCreatedDomainEvent`, ...)
* Specification'lar (Ardalis.Specification üzerinden)
* Domain Service'ler (aggregate'lara sığmayan iş kuralları)
* **Bağımlılık:** sadece `Domain.SharedKernel`

### Domain.SharedKernel (`DiyanetCleanArchitecture.Domain.SharedKernel`)

* Value Object base (`ValueObject`)
* Entity base (`EntityBase<TId>`, `Entity`, audit + soft-delete interface'leri)
* Aggregate root marker (`IAggregateRoot`)
* Tekil değer nesneleri (`Email`, `Phone`, `FullName`, `OtpCode`, `TCKimlikNo`)
* Enumeration base (smart enum) ve `DomainEvent` base
* **Bağımlılık:** sadece `BuildingBlocks.Specification`

### Application (`DiyanetCleanArchitecture.Application`)

* MediatR Command/Query/Handler (CQRS)
* DomainEventHandler'lar (`Application/DomainEventHandlers/<EventName>/<UseCase>DomainEventHandler.cs`)
* IntegrationEventHandler'lar
* DTO + Mapping (AutoMapper, `IMapFrom<T>` convention)
* Pipeline behavior'ları (Exception → Authorization → Validation → Permission)
* **Bağımlılık:** Domain + Infrastructure.EFCore + tüm BuildingBlocks

### Infrastructure

Birden çok proje:

| Proje                                   | Sorumluluk                                                          |
| --------------------------------------- | ------------------------------------------------------------------- |
| `Infrastructure.EFCore`                 | DbContext, migrations, audit interceptor, query filter, seed        |
| `Infrastructure.Jobs.Hangfire`          | Recurring/delayed background job orkestrasyonu (PostgreSQL storage) |
| `Infrastructure.Services.OAuth`         | Google / Meta / Keycloak OAuth2 + PKCE token exchange               |
| `Infrastructure.Services.Authenticator` | TOTP (Google Authenticator) üretim/doğrulama                        |
| `Infrastructure.Services.Email`         | MailKit + Scriban şablonlu e-posta gönderimi                        |
| `Infrastructure.Services.Sms`           | NetGSM SMS gateway entegrasyonu                                     |
| `Infrastructure.Services.Notification`  | SSE tabanlı admin bildirim yayını                                   |

### Presentation

| Proje                          | Sorumluluk                                               |
| ------------------------------ | -------------------------------------------------------- |
| `DiyanetCleanArchitecture.API` | .NET 10 Web API (Admin + Website + Public endpoint'leri) |
| `Presentation.Admin`           | React 19 + Vite SPA — yönetim paneli (`/admin`)          |
| `Presentation.Website`         | React 19 + Vite SPA — vatandaş portali (`/`)             |

### BuildingBlocks

Yatay (cross-cutting) modüller. Hiçbiri Domain veya Application'a referans vermez; tersine, Application bunları kullanır. Detay: [BuildingBlocks Overview](/building-blocks/overview).

## Bağımlılık akışı — referans grafiği

```mermaid theme={null}
graph LR
    API[API]
    APP[Application]
    DOM[Domain]
    SK[SharedKernel]
    EFC[Infrastructure.EFCore]
    SVC[Infrastructure.Services.*]
    BB[BuildingBlocks.*]

    API --> APP
    API --> BB
    APP --> DOM
    APP --> EFC
    APP --> SVC
    APP --> BB
    DOM --> SK
    EFC --> DOM
    EFC --> SK
    EFC --> BB
    SVC --> BB
    SK --> BB
```

**Kuralın istisnası yok:** Domain projesi `using DiyanetCleanArchitecture.Infrastructure.*` ifadesi göremez. Application bu kuralı koruyan tek katmandır.

## DDD sınırları

Sistem tek bir bounded context içinde modellenir (Diyanet domeni). Aggregate boundary'leri:

* **User aggregate** — personel (yönetim paneli kullanıcısı), role/permission graph
* **Citizen aggregate** — vatandaş profili, kimlik bilgileri, OTP state
* **Organization aggregate** — kurum hiyerarşisi
* **Faq aggregate** — sıkça sorulanlar (ordering desteği)
* **Announcement / Center / Content** — public modüller

Her aggregate kendi domain event'lerini yayınlar. Cross-aggregate koordinasyon **Application katmanında**, MediatR handler'lar üzerinden olur — Domain katmanı diğer aggregate'a doğrudan dokunamaz.

## CQRS yaklaşımı

* **Command'lar** state değiştirir; domain event yayınlar; outbox'a yazılır
* **Query'ler** read-only; ek olarak HybridCache pipeline behavior'ı ile cache'lenebilir
* Tek DB (read/write ayrımı yok); cache L2 read replikası rolü oynar

## Sırada ne var?

<CardGroup cols={2}>
  <Card title="Solution yapısı" href="/architecture/solution-structure">
    Tüm .csproj projeleri ve referansları.
  </Card>

  <Card title="Bağımlılık akışı" href="/architecture/dependency-flow">
    Hangi katman hangini kullanır — detaylı grafik.
  </Card>

  <Card title="Tasarım kararları" href="/architecture/design-decisions">
    Neden çift-realm? Neden Outbox? Neden HybridCache?
  </Card>

  <Card title="BuildingBlocks haritası" href="/building-blocks/overview">
    20 paylaşılan modülün her biri.
  </Card>
</CardGroup>
