We are adding a REST API adapter using FastAPI + Uvicorn. This adapter will sit alongside the existing CLI adapter, reusing the Application and Core layers.
New directory: src/archive_manager/adapters/api
Structure:
adapters/api/
├── __init__.py
├── main.py # FastAPI App definition
├── deps.py # Dependency Injection (Database, Services)
├── routers/ # API Endpoints
│ ├── __init__.py
│ └── contacts.py # Contact endpoints
└── schemas.py # Pydantic models (if separate from DTOs)
- The existing CLI instantiates services manually.
- The API will use FastAPI's
Dependssystem. deps.pywill handle opening/closing database sessions and creating Service instances per request.
- Request:
ContactCreate(Pydantic model) ->ContactService - Response:
ContactDTO->ContactResponse(Pydantic model) - Goal: Minimize duplication. If possible, adapt
ContactDTOto be Pydantic-compatible or create lightweight wrappers.
- Middleware or centralized exception handler in
main.py. - Map
AppValidationErrors-> HTTP 400 Bad Request. - Map
AppNotFoundError(if exists) -> HTTP 404 Not Found. - Internal errors -> HTTP 500.
- Add
APISettingstosrc/archive_manager/infrastructure/config/settings.py. - Defaults: Host
127.0.0.1, Port8000.
- Settings: Update
settings.py. - Dependencies: Create
adapters/api/deps.pyfor DB session handling. - Router: Create
adapters/api/routers/contacts.pyimplementing CRUD usingContactService. - App: Create
adapters/api/main.pyassembling the app. - Entry Point: Add
archive-apiscript topyproject.toml.
- Service Reference - The business logic we are wrapping.