122 lines
11 KiB
Markdown
122 lines
11 KiB
Markdown
# Architecture
|
|
|
|
Hexagonal (ports & adapters) architecture. Dependencies point inward — adapters implement domain ports, application orchestrates use cases, presentation handles HTTP.
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────────────┐
|
|
│ ENTRY POINTS │
|
|
│ │
|
|
│ ┌─────────────┐ ┌──────────┐ │
|
|
│ │ bootstrap │ │ worker │ │
|
|
│ │ (HTTP srv) │ │ (bg jobs) │ │
|
|
│ └──────┬───────┘ └─────┬─────┘ │
|
|
│ │ wires all deps │ consumes events │
|
|
└─────────┼────────────────────────┼──────────────────────────────────────┘
|
|
│ │
|
|
▼ ▼
|
|
┌─────────────────────────────────────────────────────────────────────────┐
|
|
│ INTERFACE LAYER │
|
|
│ │
|
|
│ ┌──────────────────┐ ┌────────────┐ │
|
|
│ │ presentation │ │ api-types │ │
|
|
│ │ (axum handlers, │◄───│ (DTOs, │ │
|
|
│ │ extractors, │ │ OpenAPI) │ │
|
|
│ │ AppState) │ └────────────┘ │
|
|
│ └────────┬──────────┘ │
|
|
│ │ calls use cases │
|
|
└───────────┼─────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────────────┐
|
|
│ APPLICATION LAYER │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────┐ │
|
|
│ │ application │ │
|
|
│ │ │ │
|
|
│ │ use_cases/ │ │
|
|
│ │ thoughts, social, profile, │ │
|
|
│ │ federation_management │ │
|
|
│ │ │ │
|
|
│ │ services/ │ │
|
|
│ │ FederationEventService │ │
|
|
│ │ (processes domain events → broadcasts) │ │
|
|
│ └──────────────────┬──────────────────────────┘ │
|
|
│ │ depends only on domain ports │
|
|
└─────────────────────┼───────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────────────┐
|
|
│ DOMAIN LAYER (core) │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────────────┐ │
|
|
│ │ domain │ │
|
|
│ │ │ │
|
|
│ │ models/ value_objects/ events/ errors/ │ │
|
|
│ │ Thought UserId DomainEvent DomainErr │ │
|
|
│ │ User ThoughtId EventEnvelope │ │
|
|
│ │ RemoteActor Username │ │
|
|
│ │ Follow,Like Content │ │
|
|
│ │ Boost,Block Email │ │
|
|
│ │ Notification PasswordHash │ │
|
|
│ │ Tag,FeedEntry │ │
|
|
│ │ │ │
|
|
│ │ ports/ (trait interfaces) │ │
|
|
│ │ UserRepository FederationContentRepository │ │
|
|
│ │ ThoughtRepository FederationBroadcastPort │ │
|
|
│ │ LikeRepository FederationLookupPort │ │
|
|
│ │ BoostRepository FederationFollowPort │ │
|
|
│ │ FollowRepository FederationFollowRequestPort │ │
|
|
│ │ BlockRepository FederationFetchPort │ │
|
|
│ │ TagRepository FederationBlockPort │ │
|
|
│ │ NotificationRepository FederationSchedulerPort │ │
|
|
│ │ FeedRepository FederationActionPort (supertrait) │ │
|
|
│ │ SearchPort EventPublisher / EventConsumer │ │
|
|
│ │ AuthService MediaStore / OutboxWriter │ │
|
|
│ │ PasswordHasher RemoteActorConnectionRepository │ │
|
|
│ │ ApiKeyRepository EngagementRepository │ │
|
|
│ └─────────────────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────────────┘
|
|
▲
|
|
│ implements ports
|
|
│
|
|
┌─────────────────────────────────────────────────────────────────────────┐
|
|
│ ADAPTER LAYER │
|
|
│ │
|
|
│ ┌──────────────────┐ ┌─────────────────────┐ ┌──────────────────┐ │
|
|
│ │ postgres │ │ activitypub │ │ auth │ │
|
|
│ │ │ │ │ │ │ │
|
|
│ │ UserRepository │ │ FederationActionPort│ │ AuthService │ │
|
|
│ │ ThoughtRepo │ │ FederationBroadcast │ │ ApiKeyService │ │
|
|
│ │ LikeRepo │ │ FederationContent.. │ └──────────────────┘ │
|
|
│ │ BoostRepo │ │ FederationScheduler │ │
|
|
│ │ FollowRepo │ │ │ ┌──────────────────┐ │
|
|
│ │ BlockRepo │ │ (wraps k-ap lib) │ │ storage │ │
|
|
│ │ TagRepo │ └─────────────────────┘ │ MediaStore │ │
|
|
│ │ NotificationRepo │ └──────────────────┘ │
|
|
│ │ ApiKeyRepo │ ┌─────────────────────┐ │
|
|
│ │ TopFriendRepo │ │ postgres-federation │ ┌──────────────────┐ │
|
|
│ │ FeedRepo │ │ (k-ap DB traits) │ │ nats │ │
|
|
│ │ EngagementRepo │ └─────────────────────┘ │ EventPublisher │ │
|
|
│ │ FederationContent│ │ EventConsumer │ │
|
|
│ │ OutboxWriter │ ┌─────────────────────┐ └──────────────────┘ │
|
|
│ │ RemoteActorRepo │ │ postgres-search │ │
|
|
│ │ RemoteActorConn │ │ SearchPort │ ┌──────────────────┐ │
|
|
│ └──────────────────┘ └─────────────────────┘ │ event-transport │ │
|
|
│ │ event-payload │ │
|
|
│ │ (serialization) │ │
|
|
│ └──────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Dependency rule
|
|
|
|
```
|
|
bootstrap/worker ──► presentation ──► application ──► domain ◄── adapters
|
|
```
|
|
|
|
- **domain** — zero framework deps, pure business logic, defines all port traits
|
|
- **application** — orchestrates use cases, depends only on domain
|
|
- **presentation** — HTTP handlers (axum), depends on domain + application
|
|
- **adapters** — implement domain ports, depend inward on domain only
|
|
- **bootstrap/worker** — composition roots, wire adapters into ports
|