Skip to main content

Clean Architecture FastAPI + CLI + Kafka Project Structure

user-management-api/
โ”‚
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ requirements.txt
โ”œโ”€โ”€ requirements-cli.txt # CLI-specific dependencies
โ”œโ”€โ”€ .env
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ docker-compose.yml # Include Kafka services
โ”œโ”€โ”€ Dockerfile
โ”œโ”€โ”€ Dockerfile.cli # Separate CLI container
โ”‚
โ”œโ”€โ”€ src/
โ”‚ โ”‚
โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚
โ”‚ โ”œโ”€โ”€ domain/ # ๐Ÿ›๏ธ DOMAIN LAYER (Core Business Logic)
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ entities/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ user.py # Domain entities with business rules
โ”‚ โ”‚ โ”œโ”€โ”€ exceptions/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ user_exceptions.py # Domain-specific exceptions
โ”‚ โ”‚ โ””โ”€โ”€ events/ # ๐Ÿ†• Domain events
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ base.py # Base domain event
โ”‚ โ”‚ โ””โ”€โ”€ user_events.py # User domain events
โ”‚ โ”‚
โ”‚ โ”œโ”€โ”€ application/ # ๐ŸŽฏ APPLICATION LAYER (Use Cases & Business Logic)
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ dtos/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ user_dtos.py # Data Transfer Objects
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ message_dtos.py # ๐Ÿ†• Message/Event DTOs
โ”‚ โ”‚ โ”œโ”€โ”€ interfaces/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ repositories/
โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ user_repository.py # Repository abstractions
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ messaging/ # ๐Ÿ†• Messaging interfaces
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ event_publisher.py # Event publishing interface
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ message_handler.py # Message handling interface
โ”‚ โ”‚ โ””โ”€โ”€ services/
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ user_service.py # Application services
โ”‚ โ”‚ โ””โ”€โ”€ event_service.py # ๐Ÿ†• Event handling service
โ”‚ โ”‚
โ”‚ โ”œโ”€โ”€ infrastructure/ # ๐Ÿ”ง INFRASTRUCTURE LAYER (External Concerns)
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ database/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ base.py # SQLAlchemy base
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ session.py # Database session
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ models/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ user_model.py # SQLAlchemy models
โ”‚ โ”‚ โ”œโ”€โ”€ repositories/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ user_repository.py # Repository implementations
โ”‚ โ”‚ โ”œโ”€โ”€ messaging/ # ๐Ÿ†• Kafka & Messaging
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ kafka/
โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ config.py # Kafka configuration
โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ producer.py # Kafka producer
โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ consumer.py # Kafka consumer
โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ topics.py # Topic definitions
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ publishers/
โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ user_event_publisher.py # User event publisher
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ handlers/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ user_message_handler.py # User message handler
โ”‚ โ”‚ โ”œโ”€โ”€ config/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ settings.py # Application configuration
โ”‚ โ”‚ โ””โ”€โ”€ dependencies.py # Dependency injection
โ”‚ โ”‚
โ”‚ โ”œโ”€โ”€ presentation/ # ๐ŸŒ PRESENTATION LAYER (API Controllers)
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ api/ # ๐Ÿ”„ Renamed for clarity
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ controllers/
โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ user_controller.py # FastAPI controllers
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ middleware/
โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ error_handler.py # Global exception handling
โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ cors.py # CORS configuration
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ schemas/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ responses.py # API response schemas
โ”‚ โ”‚ โ””โ”€โ”€ main.py # FastAPI app entry point
โ”‚ โ”‚
โ”‚ โ”œโ”€โ”€ cli/ # ๐Ÿ–ฅ๏ธ CLI LAYER (Command Line Interface)
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ commands/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ user_commands.py # User CLI commands
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ kafka_commands.py # Kafka CLI commands
โ”‚ โ”‚ โ”œโ”€โ”€ formatters/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ table_formatter.py # Table output formatting
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ json_formatter.py # JSON output formatting
โ”‚ โ”‚ โ”œโ”€โ”€ validators/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ input_validators.py # CLI input validation
โ”‚ โ”‚ โ””โ”€โ”€ main.py # CLI app entry point
โ”‚ โ”‚
โ”‚ โ””โ”€โ”€ messaging/ # ๐Ÿ”„ MESSAGING LAYER (Event-Driven Architecture)
โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”œโ”€โ”€ consumers/
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ user_consumer.py # User event consumer
โ”‚ โ”‚ โ””โ”€โ”€ base_consumer.py # Base consumer class
โ”‚ โ”œโ”€โ”€ processors/
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ””โ”€โ”€ user_event_processor.py # Event processing logic
โ”‚ โ””โ”€โ”€ main.py # Message consumer entry point
โ”‚
โ”œโ”€โ”€ tests/ # ๐Ÿงช TEST LAYER
โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”œโ”€โ”€ conftest.py
โ”‚ โ”œโ”€โ”€ unit/
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ domain/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ entities/
โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ test_user.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ events/ # ๐Ÿ†• Domain events tests
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ test_user_events.py
โ”‚ โ”‚ โ”œโ”€โ”€ application/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ services/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test_user_service.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ test_event_service.py # ๐Ÿ†• Event service tests
โ”‚ โ”‚ โ”œโ”€โ”€ infrastructure/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ repositories/
โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ test_user_repository.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ messaging/ # ๐Ÿ†• Messaging tests
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ test_kafka_producer.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ test_kafka_consumer.py
โ”‚ โ”‚ โ”œโ”€โ”€ cli/ # ๐Ÿ†• CLI tests
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ commands/
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ test_user_commands.py
โ”‚ โ”‚ โ””โ”€โ”€ messaging/ # ๐Ÿ†• Messaging layer tests
โ”‚ โ”‚ โ””โ”€โ”€ test_user_consumer.py
โ”‚ โ”œโ”€โ”€ integration/
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ test_user_endpoints.py
โ”‚ โ”‚ โ”œโ”€โ”€ test_kafka_integration.py # ๐Ÿ†• Kafka integration tests
โ”‚ โ”‚ โ””โ”€โ”€ test_cli_integration.py # ๐Ÿ†• CLI integration tests
โ”‚ โ””โ”€โ”€ e2e/
โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”œโ”€โ”€ test_user_flow.py
โ”‚ โ””โ”€โ”€ test_event_flow.py # ๐Ÿ†• Event-driven flow tests
โ”‚
โ”œโ”€โ”€ migrations/ # ๐Ÿ“ฆ DATABASE MIGRATIONS
โ”‚ โ”œโ”€โ”€ versions/
โ”‚ โ”œโ”€โ”€ alembic.ini
โ”‚ โ”œโ”€โ”€ env.py
โ”‚ โ””โ”€โ”€ script.py.mako
โ”‚
โ”œโ”€โ”€ docs/ # ๐Ÿ“š DOCUMENTATION
โ”‚ โ”œโ”€โ”€ architecture.md
โ”‚ โ”œโ”€โ”€ api.md
โ”‚ โ”œโ”€โ”€ cli.md # ๐Ÿ†• CLI documentation
โ”‚ โ”œโ”€โ”€ kafka.md # ๐Ÿ†• Kafka documentation
โ”‚ โ””โ”€โ”€ deployment.md
โ”‚
โ”œโ”€โ”€ scripts/ # ๐Ÿ”จ UTILITY SCRIPTS
โ”‚ โ”œโ”€โ”€ start-api.sh
โ”‚ โ”œโ”€โ”€ start-cli.sh # ๐Ÿ†• CLI startup script
โ”‚ โ”œโ”€โ”€ start-consumers.sh # ๐Ÿ†• Kafka consumers
โ”‚ โ”œโ”€โ”€ test.sh
โ”‚ โ””โ”€โ”€ migrate.sh
โ”‚
โ”œโ”€โ”€ docker/ # ๐Ÿณ DOCKER CONFIGURATIONS
โ”‚ โ”œโ”€โ”€ api.Dockerfile
โ”‚ โ”œโ”€โ”€ cli.Dockerfile # ๐Ÿ†• CLI container
โ”‚ โ”œโ”€โ”€ consumer.Dockerfile # ๐Ÿ†• Message consumer container
โ”‚ โ””โ”€โ”€ kafka/ # ๐Ÿ†• Kafka setup
โ”‚ โ”œโ”€โ”€ docker-compose.kafka.yml
โ”‚ โ””โ”€โ”€ kafka-setup.sh
โ”‚
โ””โ”€โ”€ .github/ # ๐Ÿš€ CI/CD & GitHub Configuration
โ”œโ”€โ”€ workflows/
โ”‚ โ”œโ”€โ”€ api-ci.yml
๏ฟฝ๏ฟฝ โ”œโ”€โ”€ cli-ci.yml # ๐Ÿ†• CLI CI/CD
โ”‚ โ”œโ”€โ”€ kafka-ci.yml # ๐Ÿ†• Kafka integration CI
โ”‚ โ””โ”€โ”€ integration-tests.yml
โ””โ”€โ”€ ISSUE_TEMPLATE/
โ”œโ”€โ”€ bug_report.md
โ””โ”€โ”€ feature_request.md

๐Ÿ—๏ธ Architecture Layers (Updated)โ€‹

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๐Ÿ–ฅ๏ธ CLI LAYER ๐ŸŒ PRESENTATION LAYER ๐Ÿ”„ MESSAGING LAYER โ”‚ โ† Level 3 (Outer)
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ๐Ÿ”ง INFRASTRUCTURE LAYER โ”‚ โ”‚ โ† Level 3 (Outer)
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ ๐ŸŽฏ APPLICATION LAYER โ”‚ โ”‚ โ”‚ โ† Level 2 (Middle)
โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ ๐Ÿ›๏ธ DOMAIN LAYER โ”‚โ”‚ โ”‚ โ”‚ โ† Level 1 (Core)
โ”‚ โ”‚ โ”‚ โ”‚ โ€ข Entities โ€ข Events โ€ข Exceptions โ”‚โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ€ข Services โ€ข DTOs โ€ข Interfaces โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚ โ”‚ โ€ข Repositories โ€ข Messaging โ€ข Database โ€ข Config โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ€ข API Routes โ€ข CLI Commands โ€ข Event Consumers โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜