İçindekiler
Bu rehber, GoCore’a yeni bir domain alanı eklerken izlenecek sırayı verir.
Örnek isim: Note (notes).
Okuma sırası (yazmadan önce)
- READING.md — harita, isim sözlüğü, golden path
- Mevcut benzer context — map/user.md veya map/auth.md
- DOMAIN.md — katman kuralları
Yeni context ekledikten sonra docs/map/<context>.md kısa haritasını da ekle (isteğe bağlı ama önerilir).
Yazma checklist
- Domain + port (
internal/domain/...) - Migration +
db/queries+sqlc generate - Persistence repo (
adapters/persistence/postgres) - Application use-case’ler (
application/...) + Service facade - RBAC izni (
pkg/rbac+ route) — gerekiyorsa - HTTP handler +
server.gogrubu (handler’a yalnızca Service ver) - GoUI route + controller — gerekiyorsa (Deps’e Service)
- Bootstrap ilgili
wire_*.go(+ GoUI*Depsgrubu) - OpenAPI / i18n — gerekiyorsa
- Test +
docs/map/veya DOMAIN tablosu
1. Domain
internal/domain/note/
entity.go— aggregate / entity, invariant’larrepository.go— port arayüzü (infrastructure bilmez)- Gerekirse
events.go, value object’ler
Domain yalnızca kendi paketine ve domain/shared’e bağımlı olsun.
2. Migration + sqlc
migrations/altına incremental SQL (up/down)db/queries/notes.sql— sqlc sorgularısqlc generate→ çıktıinternal/adapters/persistence/postgres/db/
Geliştirmede henüz canlıya çıkmadıysanız şemayı 000001_schema içinde birleştirmeyi tercih edebilirsiniz; canlı sonrası yalnızca incremental.
3. Persistence adapter
internal/adapters/persistence/postgres/note_repository.go
- sqlc
Queries→ domain entity map domain/note.Repositoryimplementasyonu
4. Application
internal/application/note/
- Komut / sorgu use-case’leri (CQRS
*Handler) service.gofacade — HTTP/GoUI yalnızca buna bağlanır- DTO’lar (HTTP/GoUI’ye sızmayan domain tipleri)
- Port’lara bağımlılık (repo, clock, event publisher…)
Gerekirse application/shared servis kayıtlarına ekleyin.
5. RBAC (korumalıysa)
pkg/rbac—PermNotesListvb. sabit +Cataloggirdisi- Seed / sync ile DB’ye yazıldığını doğrula
- Route’larda
RequirePermission/ GoUIpermissionalanı
6. HTTP handler
internal/adapters/http/handler/note_handler.go
server.go içinde /api/v1/notes grubunu kaydet.
- Public / protected ayrımı
- Mutasyonlarda idempotency middleware (projede kullanılan kalıp)
- Problem JSON + validation hataları
OpenAPI: api/openapi.yaml güncelle.
7. GoUI (dashboard)
routes.go→pageRoutes()satırı (screen,path,permission, …)- Factory:
controllers.gozincirindeki ilgili*Controller(screen)switch’ine tip ekle - Controller (
controller_*.go):Mount/HandleEventmantığı; Render şablonla - View:
internal/adapters/goui/views/pages/<ad>.goui.html - Controller’da:
Dosya yolureturn p.RenderView("pages.<ad>", map[string]any{ /* … */ })views/pages/user_show.goui.html→ view adı"pages.user_show"(underscore → dot-path). - Ortak parçalar:
views/components/*(input,select,pagination,export_links, …) veviewmodels.goyardımcıları (viewPagination,viewExportLinks,viewFieldError, …) - Layout/shell zaten
layouts.shell+ partial’larda; sayfa yalnızca gövde HTML üretir - i18n:
dashboard.*anahtarları (panel_i18n.go+pkg/i18n/locales/tr.json&en.json) - Export gerekiyorsa
export_routes.go+pkg/tabular
Dev’de şablon hot-reload açıktır (WatchForChanges); prod’da gömülü views kullanılır.
8. Bootstrap
internal/bootstrap içinde bağımlılık grafiği bootstrap.go (Build orkestrasyonu) ve
wire_*.go dosyalarına bölünmüştür (wire_infra, wire_repos, wire_authz, …).
Yeni modül eklerken ilgili wire_*.go dosyasında:
- repo oluştur
- use-case oluştur
- handler / GoUI deps’e bağla
Yeni bağımlılık constructor injection ile eklenir; global singleton yok.
Testler için internal/bootstrap/testkit paket yorumuna bakın.
9. Test
- Domain entity unit test
- Application use-case (mock port — mockery)
- Handler / middleware gerekirse
go test ./...ve CI yeşil
10. Doküman
- README özellik listesine bir satır
- Gerekirse
DOMAIN.mdtablosuna context satırı - Public API ise OpenAPI +
/docs - Önerilir:
docs/map/<context>.md(user/auth örneklerine bak)
Yapılmayacaklar
- Domain’den Fiber, sqlc veya env okumak
pkg/altında aggregate koymak (pkg/rbacyalnızca izin sabiti)- İletişim formu ile alıcı CSV’yi karıştırmak (
contact≠pkg/recipients) - Secret’ı panel/DB’ye yazmak (SMS/ödeme kimlikleri env’de kalır)
Kontrol listesi dosyanın başındaki Yazma checklist ile aynıdır.