İçindekiler
Katmanlar
| Katman | Yol | Sorumluluk |
|---|---|---|
| Domain | internal/domain/* |
Entity, value object, domain event, repository port |
| Application | internal/application/* |
Use-case, DTO, orchestration, CQRS komut/sorgu |
| Adapters | internal/adapters/{http,goui,persistence,shared} |
Fiber handler, GoUI, sqlc repo, ortak adapter yardımcıları |
| Infrastructure | internal/infrastructure/* |
Config, DB, JWT/Argon2/TOTP, SMTP, SMS, ödeme gateway, outbox, cache |
| Bootstrap | internal/bootstrap (Build + wire_*.go) |
Manuel DI; composition root parçalı wiring |
Domain, application dışına bağımlı olmaz. Application yalnızca domain portlarına ve kendi DTO’larına bakar.
Bounded context’ler
| Context | Domain | Application | Not |
|---|---|---|---|
| User | domain/user |
application/user |
CRUD, profil, soft-delete |
| Auth | domain/auth |
application/auth |
Token, MFA, OAuth olayları |
| Authz / RBAC | domain/rbac |
application/authz |
Rol/izin aggregate; çözümleme authz’de |
| Notification | domain/notification |
application/notification |
Dispatcher, inbox, bulk |
| Settings | domain/settings |
application/settings |
Aktif SMS/ödeme sağlayıcı |
| Payment | domain/payment |
application/payment |
3DS, transaction |
| Contact | domain/contact |
application/contact |
Public form + admin kutu |
| Upload | domain/upload |
application/upload |
Güvenli dosya yükleme |
| Audit | — | application/audit |
Domain aggregate yok; uygulama servisi |
| Idempotency / Outbox | — | application/{idempotency,outbox} |
Altyapı destekli |
Paylaşılan domain tipleri: domain/shared.
pkg/ sözleşmeleri
Bunlar domain değildir; çapraz yardımcı paketlerdir.
| Paket | Kullanım |
|---|---|
pkg/rbac |
Perm* sabitleri, Catalog, Checker — aggregate domain/rbac, use-case application/authz |
pkg/recipients |
CSV/XLSX alıcı içe aktarma (bildirim bulk) — iletişim formu domain/contact |
pkg/tabular |
Liste dışa aktarma (CSV/XLSX) |
pkg/i18n |
Locale dosyaları (locales/tr.json, en.json) |
pkg/validation |
go-playground tag kayıtları + alan mesajları |
pkg/pagination |
Offset/limit yardımcıları |
pkg/fieldenc |
Hassas alan şifreleme (ödeme kartı vb.) |
pkg/user yoktur; kullanıcı yalnızca internal/domain/user altındadır.
Yüzeyler (adapters)
HTTP API — internal/adapters/http
- Kayıt:
server.go→/api/v1/... - Handler’lar:
handler/*.go - Middleware: auth, i18n, idempotency, permission
Özet gruplar:
- Public: health, OpenAPI, contact submit, auth login/refresh/oauth, payment callback/webhook
- Protected:
/me, users, notifications send/bulk, rbac, settings, payments, audit, contacts, uploads
GoUI panel — internal/adapters/goui
- Sayfa rotaları:
routes.go→pageRoutes() - Controller’lar:
controller_*.go - Export:
export_routes.go - Yardımcı (OAuth, dil, 3DS start):
utility_routes.go
Web oturumu HttpOnly cookie; API Bearer JWT. İkisi aynı application use-case’lerini çağırır.
Örnek panel yolları: /dashboard, /dashboard/users, /dashboard/notifications/bulk, /dashboard/payments/checkout, /dashboard/audit/logs.
Veri
| Parça | Yol |
|---|---|
| Migration | migrations/000001_schema.*, 000002_seed.* (embed: migrations.go) |
| sqlc kaynak | db/queries/*.sql |
| sqlc çıktı | internal/adapters/persistence/postgres/db/ |
Geliştirmede şema tek dosyada tutulur (000001). Canlıya çıktıktan sonra incremental migration eklenir.
Bildirim akışı (kısa)
- Use-case →
Dispatcher(kanal:inapp|sms|email) - Alıcı çözümü: kullanıcı ID, e-posta, telefon veya
pkg/recipientsparse - In-app: DB kaydı +
/api/v1/wsüzerindeninbox.updated(panel/mobil/API) - SMS/e-posta: aktif sağlayıcı (settings) + worker/async
İlişkili dokümanlar
- İlk okuma / golden path → READING.md
- Context haritaları → map/ (
user,auth,contact,notification,audit) - Auth/RBAC ayrıntı → AUTH.md
- Ödeme → PAYMENT.md
- Yeni modül → YENI_MODUL_EKLEME.md