İçindekiler

Katmanlar

KatmanYolSorumluluk
Domaininternal/domain/*Entity, value object, domain event, repository port
Applicationinternal/application/*Use-case, DTO, orchestration, CQRS komut/sorgu
Adaptersinternal/adapters/{http,goui,persistence,shared}Fiber handler, GoUI, sqlc repo, ortak adapter yardımcıları
Infrastructureinternal/infrastructure/*Config, DB, JWT/Argon2/TOTP, SMTP, SMS, ödeme gateway, outbox, cache
Bootstrapinternal/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

ContextDomainApplicationNot
Userdomain/userapplication/userCRUD, profil, soft-delete
Authdomain/authapplication/authToken, MFA, OAuth olayları
Authz / RBACdomain/rbacapplication/authzRol/izin aggregate; çözümleme authz’de
Notificationdomain/notificationapplication/notificationDispatcher, inbox, bulk
Settingsdomain/settingsapplication/settingsAktif SMS/ödeme sağlayıcı
Paymentdomain/paymentapplication/payment3DS, transaction
Contactdomain/contactapplication/contactPublic form + admin kutu
Uploaddomain/uploadapplication/uploadGüvenli dosya yükleme
Auditapplication/auditDomain aggregate yok; uygulama servisi
Idempotency / Outboxapplication/{idempotency,outbox}Altyapı destekli

Paylaşılan domain tipleri: domain/shared.

pkg/ sözleşmeleri

Bunlar domain değildir; çapraz yardımcı paketlerdir.

PaketKullanım
pkg/rbacPerm* sabitleri, Catalog, Checker — aggregate domain/rbac, use-case application/authz
pkg/recipientsCSV/XLSX alıcı içe aktarma (bildirim bulk) — iletişim formu domain/contact
pkg/tabularListe dışa aktarma (CSV/XLSX)
pkg/i18nLocale dosyaları (locales/tr.json, en.json)
pkg/validationgo-playground tag kayıtları + alan mesajları
pkg/paginationOffset/limit yardımcıları
pkg/fieldencHassas 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.gopageRoutes()
  • 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çaYol
Migrationmigrations/000001_schema.*, 000002_seed.* (embed: migrations.go)
sqlc kaynakdb/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)

  1. Use-case → Dispatcher (kanal: inapp | sms | email)
  2. Alıcı çözümü: kullanıcı ID, e-posta, telefon veya pkg/recipients parse
  3. In-app: DB kaydı + /api/v1/ws üzerinden inbox.updated (panel/mobil/API)
  4. SMS/e-posta: aktif sağlayıcı (settings) + worker/async

İlişkili dokümanlar