_mediator.Send(...) çağırırlar. Tüm validasyon, yetkilendirme ve iş kuralları Application katmanındaki pipeline behavior’lar ve handler’lar tarafından işlenir.
Base controller’lar
İki ortak taban sınıf vardır (src/DiyanetCleanArchitecture.API/SeedWork/Controllers/):
| Base class | Kullanım | CORS policy |
|---|---|---|
AdminApiControllerBase | Yönetim paneli (Backoffice) | AllowedBackofficePolicy (sadece backoffice origin) |
WebsiteApiControllerBase | Vatandaş portali (kimlik doğrulamalı) | AllowedWebsitePolicy (sadece website origin) |
[ApiController] + [EnableCors(...)] taşır ama auth attribute’u kasten içermez.
Üç rota grubu
| Path prefix | Auth | Scheme | CORS |
|---|---|---|---|
api/admin/* | Personel | PersonelScheme (KeycloakSchemeNames.Personel) | Backoffice |
api/website/* | Vatandaş | VatandasScheme (KeycloakSchemeNames.Vatandas) | Website |
api/website/public/* | Anonim | — | Public (website + backoffice, sadece GET) |
api/website/public/* hem website hem backoffice origin’ine açıktır — admin panelindeki form dropdown’ları (il/ilçe lookup gibi) public veriye erişebilsin diye.
Named policy’ler Program.cs’te tanımlıdır:
AuthPolicies.PersonelAuthenticated→PersonelScheme+RequireAuthenticatedUser()AuthPolicies.VatandasAuthenticated→VatandasScheme+RequireAuthenticatedUser()AuthPolicies.AnyKeycloakAuthenticated→ her iki scheme +RequireAuthenticatedUser()
Bare
[Authorize(Schemes=X)] boş-requirement’lı bir policy üretir ve AuthorizationMiddleware’de 403’e düşebilir. Bu yüzden “sadece authenticated olsun yeter” senaryolarında named policy (RequireAuthenticatedUser()) kullanılır. DynamicPermissionPolicyProvider bu policy’leri ActiveAccountRequirement ile augment eder — yani Pending/Banned/Suspended kullanıcılar geçemez (gerekirse action’a [AllowPendingAccount] eklenir).Gerçek örnek: MeController (Admin)
src/DiyanetCleanArchitecture.API/Controllers/Admin/MeController.cs:
GET /api/admin/me → tam profil (frontend login sonrası bir kez çağırır). GET /api/admin/me/status → sadece hesap durumu; full /me 403 alırsa frontend “Onay bekliyor” ekranı için bunu okur.
Controller listesi
Admin (api/admin/*) — Users, Citizens, Roles, Announcements, Centers, Faqs, Locations, BagisBasvurular (+ BagisBasvuruPlanlari), EtkinlikBasvurular (+ EtkinlikBasvuruPlanlari), AdminNotifications, AdminSupportTickets, LegalDocuments, Me.
Website auth (api/website/*) — Me, Users, BagisBasvurular, EtkinlikBasvurular, LegalDocuments.
Website public (api/website/public/*) — Announcements, Centers, Faqs, Locations, Enums, BagisBasvuruPlanlari, EtkinlikBasvuruPlanlari.
Genel — AuthController (api/auth — login/refresh/logout/OTP/TOTP/OAuth), SiteSettingsController.
ResponseWrapper zarfı
Başarılı yanıtlarResponseWrapper<TResponse> ile sarılır:
result.IsSuccess üzerinden Ok(result) veya BadRequest(result) döner.
Hata yanıtları — RFC 7807 ProblemDetails
Exception’larHellang.Middleware.ProblemDetails ile yakalanıp application/problem+json olarak döndürülür (SeedWork/ProblemDetails/ProblemDetailsOptionsConfiguration.cs):
| Exception | HTTP status | Gövde |
|---|---|---|
DomainException | 400 | title = exception mesajı |
ApplicationException | 400 | title = exception mesajı |
FluentValidation.ValidationException | 422 | ValidationProblemDetails + errors (alan → mesaj[]) |
SmsServiceException | 503 | ”SMS servisi şu anda kullanılamıyor.” |
EmailServiceException | 503 | ”E-posta servisi şu anda kullanılamıyor.” |
UndefinedApplicationException | 500 | ”Beklenmeyen bir hata oluştu.” |
diğer Exception | 500 | fallback |
traceId extension’ı eklenir (Activity.Current?.Id ?? ctx.TraceIdentifier) — destek/log korelasyonu için tek bağlantı noktasıdır.
Örnek 422 yanıtı:
Sonraki adımlar
API genel bakış
Pipeline sırası ve servis kayıtları.
OpenAPI / Swagger
NSwag, security scheme’ler, client üretimi.
Frontend SPA'lar
axios interceptor RFC 7807 hatalarını nasıl işler.
Keycloak
Çift realm, scheme’ler, claim’ler.