Project Structure¶
This document outlines the typical project structure generated by architect when creating a new application. The structure is designed to promote separation of concerns and align with Domain-Driven Design (DDD) principles.
The boilerplate for new applications is available as a Cookiecutter template on GitLab.
Generated Directory Tree¶
project_root/
├── app/
│ ├── __init__.py
│ ├── api/
│ │ ├── __init__.py
│ │ ├── deps.py
│ │ └── <version>/
│ │ ├── __init__.py # API version module
│ │ ├── dtos/
│ │ │ └── <dto_name>.py
│ │ └── routers/
│ │ └── <router_name>.py
│ ├── application/
│ │ ├── __init__.py
│ │ └── <bounded_ctx>/
│ │ ├── __init__.py # Bounded context application services
│ │ ├── commands/
│ │ │ └── <command_name>.py
│ │ ├── handlers/
│ │ │ ├── <handler_name>.py
│ │ │ └── <handler_permission_name>.py
│ │ ├── queries/
│ │ │ └── <query_name>.py
│ │ ├── sagas/
│ │ │ └── <domain_saga_orchestrator_name>.py
│ │ └── di.py
│ ├── config.py
│ ├── di.py
│ ├── domain/
│ │ ├── __init__.py
│ │ ├── <bounded_context_name>/
│ │ │ ├── __init__.py
│ │ │ ├── aggregates/
│ │ │ │ └── <domain_aggregate_name>.py
│ │ │ ├── events/
│ │ │ │ └── <domain_event_name>.py
│ │ │ ├── services/
│ │ │ │ └── <domain_service_name>.py
│ │ │ └── di.py
│ │ └── shared_kernel/
│ │ ├── __init__.py
│ │ ├── aggregates/
│ │ │ └── <shared_aggregate_name>.py
│ │ ├── events/
│ │ │ └── <shared_event_name>.py
│ │ ├── services/
│ │ │ └── <shared_service_name>.py
│ │ ├── sagas/
│ │ │ └── <shared_saga_orchestrator_name>.py
│ │ └── di.py
│ ├── infrastructure/
│ │ ├── __init__.py
│ │ ├── di.py
│ │ ├── <infrastructure_module_name>/
│ │ │ ├── __init__.py
│ │ │ └── <infra_service_name>.py
│ │ ├── messaging/
│ │ │ ├── __init__.py
│ │ │ ├── <event_consumer_name>.py
│ │ │ └── <event_publisher_name>.py
│ │ └── persistence/
│ │ ├── __init__.py
│ │ └── <bounded_context_name>/
│ │ ├── __init__.py
│ │ ├── models/
│ │ │ └── <model_name>.py
│ │ └── repositories/
│ │ └── <repo_name>.py
│ └── main.py
├── migrations/
├── tests/
│ └── ... (Project tests)
├── .env
├── .gitignore
├── pyproject.toml
└── README.md
Note on Placeholders:
* <version>: Represents the API version (e.g., v1).
* <bounded_context_name>: The name of a specific domain area (e.g., user_management, order_processing).
* <dto_name>, <command_name>, etc.: Specific names for components, typically in snake_case (e.g., user_details_dto, create_order_command).
Key Directories Explained¶
app/: Contains the core application code.app/api/: FastAPI routers, DTOs (Data Transfer Objects) for API requests/responses, and API-specific dependencies.app/api/<version>/: Versioned API endpoints.
app/application/: Application services, command handlers, query handlers. Organized by bounded contexts.app/application/<bounded_context_name>/sagas/: Saga orchestrators for managing long-running processes or distributed transactions within a bounded context.
app/domain/: Domain logic, including aggregates, domain events, domain services, and value objects.app/domain/<bounded_context_name>/: Domain logic specific to a bounded context.app/domain/shared_kernel/: Domain logic shared across multiple bounded contexts.app/domain/shared_kernel/sagas/: Saga orchestrators that might coordinate across multiple bounded contexts or deal with shared concerns.
app/infrastructure/: Implementation details for external concerns like databases, message brokers, external APIs, etc.app/infrastructure/persistence/: Database models (SQLModel) and repositories.app/infrastructure/messaging/: Event consumers and publishers for asynchronous communication.app/infrastructure/<infrastructure_module_name>/: Other infrastructure services (e.g., email, file storage, specific external API clients).
app/config.py: Application configuration settings (e.g., database URLs, API keys).app/di.py: Root dependency injection container setup for the application.app/main.py: FastAPI application instantiation and main entry point.
migrations/: Database migration scripts (typically managed by Alembic) to handle schema changes.tests/: Unit, integration, and end-to-end tests for the application..env: Environment variables for local development (should not be committed to version control)..gitignore: Specifies intentionally untracked files that Git should ignore.pyproject.toml: Project metadata, dependencies (managed byuvorpip), and tool configurations (e.g., Ruff, Pytest).README.md: Project overview, setup instructions, and other relevant information.
This structure provides a solid foundation for building scalable and maintainable applications. The cookiecutter template is available at https://gitlab.com/castlecraft/framework/architect. Use cruft instead of cookiecutter for help in upgrading boilerplate.