Domain-Driven Design
MangroveAI organizes code by business domain rather than by technical layer. Each domain encapsulates its routes, services, data layer, and models in a self-contained directory.Standard Domain Structure
Each domain follows this file layout:Layer Responsibilities
routes.py
- Defines the Flask-RESTX namespace
- Registers endpoint parsers and models
- Delegates all logic to the service layer
- Returns API responses with proper status codes
services.py
- Contains all business logic
- Calls data layers for persistence
- Calls integrations for external APIs
- Orchestrates multi-step operations
- Owns business-level logging
data_layer.py
- Executes SQL queries
- Manages database connections
- Returns plain dictionaries or domain objects
- Contains no business logic
Domain Interactions
Domains communicate through their service layers. Direct data layer access across domains is prohibited.Naming Conventions
- Domain directories: lowercase, underscores (
ai_copilot,crypto_assets) - Route files: always
routes.py - Service files: always
services.py - Data layer files: always
data_layer.py - Namespace prefixes: match the URL path (
/api/v1/signals,/api/v1/strategies)
Integration vs Domain
Integrations are external API clients, not business domains:integrations/coinapi/— Market data clientintegrations/coingecko/— Asset data clientintegrations/nansen/— On-chain analytics clientintegrations/x/— Social signals client