graph TB
HTTP[HTTP Request] --> Chi[Chi Router]
Chi --> MW[Middleware: Auth, CORS, Rate Limit, Logger]
MW --> H[Handler]
H --> S[Service: бизнес-логика]
S --> R[Repository: PostgreSQL/pgx]
S --> C[Cache: Redis]
S --> FS[File Storage: MinIO/S3]
R --> PG[(PostgreSQL + PostGIS)]
| Паттерн | Где реализовано | Заметка |
|---|---|---|
| Sentinel errors | services/*.go |
[[atomic-sentinel-errors-go]] |
| Dependency Injection (интерфейсы) | services/*.go |
[[atomic-dependency-inversion-go]] |
| Graceful shutdown | cmd/api/main.go |
[[atomic-graceful-shutdown]] |
| Refresh token rotation | services/auth.go |
[[decision-jwt-refresh-storage]] |
| Rate limiting (Redis) | middleware/ratelimit_redis.go |
[[decision-rate-limiter-redis]] |
| WebSocket origin check | handlers/websocket.go |
[[atomic-websocket-origin-check]] |
| Refresh token race fix | services/auth.go |
[[atomic-refresh-token-race-condition]] |
| SSRF protection via MaxBytesReader | handlers/*.go |
[[atomic-request-body-limit]] |
sequenceDiagram
Handler->>Service: call
Service->>Repo: query
Repo-->>Service: pgx error
Service-->>Handler: sentinel error (%w)
Handler->>Handler: errors.Is() -> HTTP status
Все хендлеры, принимающие JSON, обёрнуты в http.MaxBytesReader(w, r.Body, 1MB). Это предотвращает атаки исчерпания памяти через гигантские payloads.
Убраны appEnv из конструкторов 6 хендлеров, где он не использовался ([[atomic-unused-appenv-parameter]]).
| Уровень | Инструмент | Пример |
|---|---|---|
| Unit (сервисы) | testing + моки |
[[atomic-test-patterns-go]] |
| Integration | testcontainers-go |
[[decision-test-strategy]] |
| E2E | Playwright | [[decision-test-strategy]] |
#architecture #backend #golang #MOC #best-practice