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

# Domain Katmanı

> DDD yapı taşları, klasör yapısı ve aggregate listesi ile Domain katmanının rolü.

Domain katmanı sistemin **kalbidir**: iş kuralları, davranışlar ve değişmezler (invariant) burada yaşar. Hiçbir framework, veritabanı ya da HTTP detayına bağımlı değildir. CQRS handler'ları, EF Core yapılandırmaları ve servisler hep bu çekirdeğin **etrafında** konumlanır.

İki proje vardır:

* **`DiyanetCleanArchitecture.Domain`** — aggregate'ler, domain event'ler, factory ve domain service'ler.
* **`DiyanetCleanArchitecture.Domain.SharedKernel`** — DDD yapı taşları (`Entity`, `ValueObject`, `Enumeration`, `DomainEvent`), guard yardımcıları ve paylaşılan value object'ler.

<Note>
  Bağımlılık yönü tek taraflıdır: `Domain` yalnızca `SharedKernel`'e bağımlıdır. `SharedKernel` ise sadece `MediatR` (INotification için) ve `Ardalis.Specification` (repository arayüzleri için) gibi minimal paketlere dayanır. Domain, **Application/Infrastructure'a asla bağımlı değildir.**
</Note>

## DDD yapı taşları

<CardGroup cols={2}>
  <Card title="Entity" icon="fingerprint">
    Kimliği (`Id`) olan, yaşam döngüsü boyunca takip edilen nesneler. `Entity : EntityBase<Guid>`.
  </Card>

  <Card title="Value Object" icon="gem">
    Kimliği olmayan, değerine göre eşitlenen, değişmez (immutable) nesneler. `FullName`, `Email`, `Phone`.
  </Card>

  <Card title="Aggregate Root" icon="cubes">
    Tutarlılık sınırı. Dışarıdan yalnızca root üzerinden erişilir. `IAggregateRoot` marker arayüzü ile işaretlenir.
  </Card>

  <Card title="Domain Event" icon="bolt">
    Aggregate içinde olup biteni anlatan olaylar. `DomainEvent` + `INotification`. `AddDomainEvent` ile yayılır.
  </Card>

  <Card title="Enumeration" icon="list-ol">
    Tip-güvenli, davranış taşıyabilen sabit küme (enum yerine). `UserStatus`, `Role`, `OtpType`.
  </Card>

  <Card title="Factory / Domain Service" icon="industry">
    Karmaşık oluşturma ve tek aggregate'e sığmayan iş kuralları. `IUserFactory`, `UserRegistrationService`.
  </Card>
</CardGroup>

## Klasör yapısı

```text theme={null}
DiyanetCleanArchitecture.Domain/
├── AggregatesModel/              # Her aggregate kendi klasöründe
│   ├── UserAggregate/
│   │   ├── User.cs               # Aggregate root
│   │   ├── UserSession.cs        # Çocuk entity
│   │   ├── UserOtpChallenge.cs
│   │   ├── UserIdentityProvider.cs
│   │   ├── UserRole.cs
│   │   ├── UserStatus.cs         # Enumeration
│   │   └── Specifications/       # Ardalis.Specification sorguları
│   ├── CitizenAggregate/
│   ├── OrganizationAggregate/    # Organization + Branch + StaffMember
│   ├── BagisBasvuruAggregate/
│   └── ...
├── Events/                       # Tüm domain event'ler
│   ├── UserCreatedDomainEvent.cs
│   ├── BagisBasvuruOnaylandiDomainEvent.cs
│   └── ...
├── Factories/                    # IUserFactory / UserFactory, ICitizenFactory
└── Services/                     # IUserUniquenessChecker, UserRegistrationService

DiyanetCleanArchitecture.Domain.SharedKernel/
├── SeedWork/                     # EntityBase, ValueObject, Enumeration, DomainEvent...
├── ValueObjects/                 # FullName, Email, Phone, OtpCode, TCKimlikNo...
├── Enumerations/                 # OtpType, AuthProviderType, City...
└── Utils/                        # Check (guard), GuidFactory, MobilePhoneUtility...
```

<Tip>
  Her aggregate kendi klasöründe **kapalı bir paket** gibi durur: root, çocuk entity'ler, o aggregate'e özgü enumeration'lar ve `Specifications/` alt klasörü. Yeni bir aggregate eklerken bu deseni birebir takip edin.
</Tip>

## Aggregate listesi

| Aggregate             | Root türü                         | Kısa açıklama                                                        |
| --------------------- | --------------------------------- | -------------------------------------------------------------------- |
| `User`                | `Entity, IAggregateRoot`          | Personel (back-office) kullanıcısı. OTP, TOTP, oturum, rol, dış IdP. |
| `Citizen`             | `Entity, IAggregateRoot`          | Vatandaş portal kullanıcısı. `User`'a **paralel ayrı** aggregate.    |
| `Organization`        | `Entity, IAggregateRoot`          | Kurum/tenant. Çocuklar: `Branch`, `StaffMember`, `StaffPermission`.  |
| `RolePermission`      | `Entity, IAggregateRoot`          | Rol–izin eşlemesi (RBAC).                                            |
| `Announcement`        | `Entity, IAggregateRoot`          | Duyuru. Kapak görseli (`AnnouncementImageInfo`).                     |
| `BagisBasvuru`        | `Entity, IAggregateRoot`          | Bağış başvurusu. State machine + status history.                     |
| `BagisBasvuruPlan`    | `Entity, IAggregateRoot`          | Bağış planı (başvuru şablonu).                                       |
| `EtkinlikBasvuru`     | `Entity, IAggregateRoot`          | Etkinlik başvurusu. State machine + kontenjan.                       |
| `EtkinlikBasvuruPlan` | `Entity, IAggregateRoot`          | Etkinlik planı.                                                      |
| `SupportTicket`       | `Entity, IAggregateRoot`          | Destek talebi. Yorum, ek, durum geçmişi.                             |
| `AdminNotification`   | `Entity, IAggregateRoot`          | Admin bildirimi (SSE yayını).                                        |
| `LegalDocument`       | `Entity, IAggregateRoot`          | Yasal metin + versiyon (`LegalDocumentVersion`).                     |
| `Faq`                 | `Entity, IAggregateRoot`          | Sık sorulan soru.                                                    |
| `Center`              | `Entity, IAggregateRoot`          | Merkez/şube lokasyonu.                                               |
| `SiteSettings`        | `Entity, IAggregateRoot`          | Site geneli ayarlar (tekil).                                         |
| `District`            | `EntityBase<int>, IAggregateRoot` | İlçe — sabit reference data (seed).                                  |

<Info>
  `District`, `Guid` yerine **`int`** kimlik kullanan tek aggregate'tir (`EntityBase<int>`). Sabit reference data olduğu için audit alanları boş kalır.
</Info>

## Sonraki adımlar

<CardGroup cols={2}>
  <Card title="SharedKernel" icon="layer-group" href="/domain/shared-kernel">
    `EntityBase`, `ValueObject`, `Enumeration`, `DomainEvent` ve guard altyapısı.
  </Card>

  <Card title="Aggregate'ler" icon="cubes" href="/domain/aggregates">
    `User` aggregate'i derinlemesine + tüm aggregate'lerin özeti.
  </Card>

  <Card title="Value Object'ler" icon="gem" href="/domain/value-objects">
    Değişmezlik, ctor validasyonu ve hazır VO kataloğu.
  </Card>

  <Card title="Domain Event'ler" icon="bolt" href="/domain/domain-events">
    Olay yayma, MediatR dispatch ve domain vs integration event ayrımı.
  </Card>
</CardGroup>
