---
layout: 'page'
uri: '/framework/architecture'
position: 10
slug: 'framework-architecture'
parent: 'framework'
navTitle: 'Architecture'
title: 'Architecture'
description: 'DDD vrstvy s CQRS, pravidla závislostí, lifecycle, cross-domain izolace.'
---
# Architecture
Architektura stojí na DDD s CQRS a bus patternem: čtyři vrstvy s přísnými pravidly závislostí. Komunikace přes CommandBus/QueryBus/EventBus drží vrstvy volně provázané (loose coupling) — command handlery neznají HTTP ani databázi.
> Tahle stránka je **mentální model**. Detailní návody („jak přidat repo / command / handler / run …") jsou ve skillech `/gk-*` — napiš `/gk` pro přehled, nebo rovnou `/gk-architecture`, `/gk-feature`.
## Čtyři vrstvy
| Vrstva | Složka | Balíčky | Popis |
|---|---|---|---|
| **Domain** | `domain/` | `shared/`, `user/`, `token/`, `run/`, `tenant/` | Entity, value objects, interfaces, errors, events. Žádné závislosti. |
| **Application** | `application/` | `bus/`, `<domain>/command/`, `<domain>/query/`, `<domain>/event/` | CQRS handlery organizované po doménách, bus middleware. Závisí jen na domain. |
| **Infrastructure** | `infrastructure/` | `config/`, `database/`, `sqlite/`, `security/`, `scheduler/`, `worker/`, `di/` | Implementace domain interfaces, databáze, security, background práce. |
| **Presentation** | `presentation/` | `http/handler/`, `http/middleware/`, `http/request/`, `http/response/`, `http/server/`, `console/` | HTTP a CLI vrstva. |
```
presentation --> application --> domain <-- infrastructure
| ^
+----------------------------------------+
```
## Startup sequence
```
cmd/main.go
-> config.LoadStartup() + logger + Sentry reporter Startup env pro logging/reporting
-> signal.NotifyContext(SIGINT, SIGTERM) Root ctx s signal handlingem
-> di.CreateApplication(logger, reporter) Wire DI vytvoří vše
-> config.LoadConfig() Načtení .env
-> database.NewSqliteManager() Připojení k SQLite
-> database.NewMigrationManager() Vytvoření migration manageru
-> bus.NewCommandBus/NewQueryBus/NewEventBus/NewSystemCommandBus CQRS busy s middleware chain
-> server.NewServer(config, handlers, ...) HTTP server
-> console.NewRootCommand() Cobra CLI
-> application.Run(ctx)
-> database.MigrationManager.RunUp() Automatické migrace
-> rootCmd.Execute(ctx) Cobra parsuje "serve" (ExecuteContext)
-> server.Start(cmd.Context()) Naslouchá na portu, drainuje při ctx.Done()
```
## Toky (flows)
Tahle stránka je mentální model. Konkrétní cesta requestu napříč vrstvami — middleware chain, transakce, autorizace, mapování chyb — žije na samostatných stránkách:
- [Request](/framework/request) — společný HTTP middleware chain a kudy request vstupuje do busu.
- [Command](/framework/command) — write operace: Recovery → Logging → Authorize → Tenant → Audit → RunDispatcher → DispatchEvents → Transaction, commit a rozeslání eventů.
- [Query](/framework/query) — read operace: Recovery → Logging → Authorize → Tenant, typovaný návrat přes `bus.Query`.
- [Events](/framework/events) — domain eventy po commitu: per-request collector, synchronní dispatch přes EventBus.
## Pravidla a rozšiřování
### go-arch-lint konfigurace
Soubor `.go-arch-lint.yml` v kořeni projektu. Spuštění:
```bash
make arch-check # go-arch-lint se instaluje automaticky přes make install
```
Hlavní body konfigurace:
- `workdir: app` — všechny cesty relativně k `app/`
- `commonComponents: [domain_shared]` — všem je dostupné pouze `domain/shared/` (sdílené typy a porty); bounded kontexty (`domain_user`, `domain_token`, …) common **nejsou**
- `deepScan: true` — analýza call-grafů zachytí i cross-layer wiring mimo importy
- `exclude: [infrastructure/di/**, internal/testfx/**]` — DI balíček a test fixture (deepScan nemá per-komponentní vypnutí) bez omezení
- `excludeFiles` — lifecycle soubor `infrastructure/database/migration_manager.go` + sada test souborů (black-box self-importy, `zz_*` konformní testy) mimo kontrolu
- Každá komponenta má `mayDependOn` seznam povolených závislostí
### Cross-domain izolace
Každý doménový kontext (`domain/user/`, `domain/token/`, ...) je izolovaný balíček. `domain/shared/` obsahuje sdílené typy (errors, interfaces, auth context). Pravidla:
- **Bounded context nesmí importovat jiný bounded context.** `domain/user/` nesmí importovat `domain/token/` a naopak.
- Komunikace mezi kontexty: **QueryBus** (synchronní) nebo **Domain Events** (po commitu; dispatch je synchronní — pro asynchronní návaznou práci slouží `RunDispatcher`).
- Eventy používají jen primitivy (string ID, ne celé entity).
- go-arch-lint zachytí cross-domain import při `make arch-check`.
Nový kontext (např. `domain/order/`) **vyžaduje** vlastní komponentu v `.go-arch-lint.yml` — právě to, že každý kontext je samostatná komponenta (a `domain/**` není jeden společný wildcard), je důvod, proč go-arch-lint cross-context import vůbec zachytí. Cenou za tu izolaci je explicitní zápis: přidat komponentu `domain_order`, povolit ji v `mayDependOn` u každého konzumenta (`application`, `sqlite_repos`, `testfx`, …) a přidat `infrastructure/sqlite/order/**` do `sqlite_repos`. Naproti tomu broad-glob komponenty (`application/**`, `presentation/http/handler/**`) nové podbalíčky pokrývají automaticky.
### Přidání nové feature (checklist)
1. `domain/` — entity, value objects, interfaces
2. `infrastructure/sqlite/` — repository implementace
3. `application/<domain>/command/` nebo `application/<domain>/query/` — CQRS handler s `Permissioned` nebo `SkipPermission`
4. `presentation/http/handler/` — HTTP handler přes bus
5. `presentation/http/server/` — registrace route
6. `infrastructure/di/` — Wire provider
7. `make di && make arch-check`
Krok za krokem (s permissions, route, DI bindingem) vede skill `/gk-feature`; pravidla vrstev a importů rozebírá `/gk-architecture`.
---
[← 🏗️ Framework](/framework.md) | [Installation →](/framework/installation.md)