Uma aplicação web moderna construΓda com FastAPI, SQLModel e princΓpios de Clean Architecture.
Este projeto segue os princΓpios da Clean Architecture para manter a separação de responsabilidades e garantir testabilidade e manutenibilidade.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Camada de Apresentação β
β β
β βββββββββββββββββββ βββββββββββββββββββββ β
β β Controllers β β Schemas β β
β βββββββββββββββββββ βββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Camada de Use Cases β
β β
β βββββββββββββββββββ ββββββββββββββββββββββββ β
β β Casos de Uso β β Interface de Casos β β
β βββββββββββββββββββ β de Uso β β
β ββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Camada de DomΓnio β
β β
β βββββββββββββββββββ βββββββββββββββββ β
β β Entidades β β Interfaces de β β
β βββββββββββββββββββ β RepositΓ³rio β β
β βββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Camada de Infraestrutura β
β β
β βββββββββββββββββββ βββββββββββββββββββββββββ β
β β Configuração β β Implementaçáes de β β
β β do Banco β β RepositΓ³rio β β
β βββββββββββββββββββ βββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββ β
β β DependΓͺncias β β
β βββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Os estΓ£o em desenvolvimento, mas jΓ‘ Γ© possΓvel ver a cobertura de testes.
All checks passed!
================ test session starts =================
platform linux -- Python 3.13.2, pytest-8.3.4, pluggy-1.5.0
cachedir: .pytest_cache
configfile: pyproject.toml
testpaths: tests
plugins: order-1.3.0, anyio-4.8.0, cov-6.0.0, asyncio-0.25.3
asyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=session
collected 38 items
tests/unit/infrastructure/repositories/test_sqlmodel_user_repository.py::test_create_user PASSED
tests/unit/presentation/controllers/test_create_user_user_controller.py::test_create_user_endpoint PASSED
tests/unit/presentation/controllers/test_get_user_user_controller.py::test_get_user_success PASSED
tests/unit/presentation/controllers/test_list_users_user_controller.py::test_list_users_endpoint PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_create_request_valid_data PASSED
tests/unit/use_cases/user/test_create_user.py::test_create_user_use_case_success PASSED
tests/unit/use_cases/user/test_get_user.py::test_get_user_use_case_success PASSED
tests/unit/use_cases/user/test_list_users.py::test_list_users_use_case_success PASSED
tests/unit/infrastructure/repositories/test_sqlmodel_user_repository.py::test_find_by_email PASSED
tests/unit/presentation/controllers/test_create_user_user_controller.py::test_create_user_endpoint_value_error PASSED
tests/unit/presentation/controllers/test_get_user_user_controller.py::test_get_user_not_found PASSED
tests/unit/presentation/controllers/test_list_users_user_controller.py::test_list_users_empty PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_create_request_invalid_name_characters PASSED
tests/unit/use_cases/user/test_create_user.py::test_create_user_use_case_email_already_exists PASSED
tests/unit/use_cases/user/test_get_user.py::test_get_user_use_case_user_not_found PASSED
tests/unit/use_cases/user/test_list_users.py::test_list_users_use_case_empty_result PASSED
tests/unit/infrastructure/repositories/test_sqlmodel_user_repository.py::test_list_users PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_create_request_short_name PASSED
tests/unit/use_cases/user/test_list_users.py::test_list_users_use_case_exact_page_size PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_create_request_short_password PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_create_request_password_no_uppercase PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_create_request_password_no_digit PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_create_request_password_no_special_character PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_empty PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_name_only PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_email_only PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_password_only PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_all_fields PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_invalid_name_characters PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_short_name PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_name_capitalization PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_invalid_email PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_short_password PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_password_no_uppercase PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_password_no_digit PASSED
tests/unit/presentation/schemas/user/test_request.py::test_user_update_request_password_no_special_character PASSED
tests/unit/domain/entities/test_user.py::test_user_entities_creation PASSED
tests/unit/infrastructure/security/test_password.py::test_password_hash PASSED
---------- coverage: platform linux, python 3.13.2-final-0 -----------
Name Stmts Miss Cover
-------------------------------------------------------------------------------------
src/app/__init__.py 0 0 100%
src/app/constants.py 12 0 100%
src/app/domain/__init__.py 0 0 100%
src/app/domain/entities/__init__.py 3 0 100%
src/app/domain/entities/user.py 14 0 100%
src/app/domain/repositories/__init__.py 0 0 100%
src/app/domain/repositories/user_repository.py 13 0 100%
src/app/infrastructure/__init__.py 0 0 100%
src/app/infrastructure/config/__init__.py 0 0 100%
src/app/infrastructure/config/database.py 12 3 75%
src/app/infrastructure/config/settings.py 8 0 100%
src/app/infrastructure/dependencies/__init__.py 0 0 100%
src/app/infrastructure/dependencies/user_dependencies.py 11 0 100%
src/app/infrastructure/repositories/__init__.py 0 0 100%
src/app/infrastructure/repositories/sqlmodel_user_repository.py 26 0 100%
src/app/infrastructure/security/__init__.py 0 0 100%
src/app/infrastructure/security/password.py 6 0 100%
src/app/main.py 5 0 100%
src/app/presentation/__init__.py 0 0 100%
src/app/presentation/controllers/__init__.py 0 0 100%
src/app/presentation/controllers/user_controller.py 30 0 100%
src/app/presentation/schemas/__init__.py 0 0 100%
src/app/presentation/schemas/common/__init__.py 0 0 100%
src/app/presentation/schemas/common/pagination.py 13 0 100%
src/app/presentation/schemas/user/__init__.py 0 0 100%
src/app/presentation/schemas/user/request.py 45 0 100%
src/app/presentation/schemas/user/response.py 10 0 100%
src/app/use_cases/__init__.py 0 0 100%
src/app/use_cases/interfaces/__init__.py 0 0 100%
src/app/use_cases/interfaces/use_case.py 7 0 100%
src/app/use_cases/user/__init__.py 0 0 100%
src/app/use_cases/user/create_user.py 26 0 100%
src/app/use_cases/user/get_user.py 18 0 100%
src/app/use_cases/user/list_users.py 23 0 100%
-------------------------------------------------------------------------------------
TOTAL 282 3 99% 294 38 87%
- PadrΓ£o de design Clean Architecture
- FastAPI para desenvolvimento de API de alto desempenho
- SQLModel para operaçáes de banco de dados com segurança de tipos
- Docker e Docker Compose para fÑcil implantação
- Poetry para gerenciamento de dependΓͺncias
- Banco de dados PostgreSQL
- Python 3.13+
- Docker e Docker Compose
- Poetry
- Clone o repositΓ³rio:
git clone https://github.com/walber-vaz/learn_clean_arch_fastapi.git
cd learn_clean_arch_fastapi
- Instale as dependΓͺncias:
poetry install
- Inicie o ambiente de desenvolvimento:
docker-compose up -d
- Execute a aplicação:
poetry run uvicorn src.app.main:app --reload
- Acesse a documentação da API:
http://localhost:8000/docs
.
βββ alembic.ini
βββ compose.yml
βββ Dockerfile
βββ .editorconfig
βββ .gitignore
βββ LICENSE
βββ poetry.lock
βββ .pre-commit-config.yaml
βββ pyproject.toml
βββ .python-version
βββ README.md
βββ requirements-dev.txt
βββ requirements.txt
βββ migrations
βΒ Β βββ env.py
βΒ Β βββ README
βΒ Β βββ script.py.mako
βΒ Β βββ versions
βΒ Β βββ b4d2e3210ead_init.py
βββ postgres
βΒ Β βββ create-databases.sh
βΒ Β βββ Dockerfile
βββ src
βΒ Β βββ app
βΒ Β βββ constants.py
βΒ Β βββ main.py
βΒ Β βββ domain
βΒ Β βΒ Β βββ entities
βΒ Β βΒ Β βΒ Β βββ user.py
βΒ Β βΒ Β βββ repositories
βΒ Β βΒ Β βββ user_repository.py
βΒ Β βββ infrastructure
βΒ Β βΒ Β βββ config
βΒ Β βΒ Β βΒ Β βββ database.py
βΒ Β βΒ Β βΒ Β βββ settings.py
βΒ Β βΒ Β βββ dependencies
βΒ Β βΒ Β βΒ Β βββ user_dependencies.py
βΒ Β βΒ Β βββ repositories
βΒ Β βΒ Β βΒ Β βββ sqlmodel_user_repository.py
βΒ Β βΒ Β βββ security
βΒ Β βΒ Β βββ password.py
βΒ Β βββ presentation
βΒ Β βΒ Β βββ controllers
βΒ Β βΒ Β βΒ Β βββ user_controller.py
βΒ Β βΒ Β βββ schemas
βΒ Β βΒ Β βββ common
βΒ Β βΒ Β βΒ Β βββ pagination.py
βΒ Β βΒ Β βββ user
βΒ Β βΒ Β βββ request.py
βΒ Β βΒ Β βββ response.py
βΒ Β βββ use_cases
βΒ Β βββ interfaces
βΒ Β βΒ Β βββ use_case.py
βΒ Β βββ user
βΒ Β βββ create_user.py
βΒ Β βββ get_user.py
βΒ Β βββ list_users.py
βββ tests
βββ conftest.py
βββ mocks
βΒ Β βββ user.py
βββ unit
βββ domain
βΒ Β βββ entities
βΒ Β βββ test_user.py
βββ infrastructure
βΒ Β βββ repositories
βΒ Β βΒ Β βββ test_sqlmodel_user_repository.py
βΒ Β βββ security
βΒ Β βββ test_password.py
βββ presentation
βΒ Β βββ controllers
βΒ Β βΒ Β βββ test_create_user_user_controller.py
βΒ Β βΒ Β βββ test_get_user_user_controller.py
βΒ Β βΒ Β βββ test_list_users_user_controller.py
βΒ Β βββ schemas
βΒ Β βββ user
βΒ Β βββ test_request.py
βββ use_cases
βββ user
βββ test_create_user.py
βββ test_get_user.py
βββ test_list_users.py
O núcleo da aplicação, contendo:
- Entidades: Objetos de negΓ³cio
- Interfaces de RepositΓ³rio: Interfaces abstratas para acesso a dados
- Casos de Uso: Regras de negΓ³cio especΓficas da aplicação
Lida com preocupaçáes externas:
- Implementaçáes de Repositório: Implementaçáes concretas das interfaces de repositório
- Configuração de Banco de Dados: Configuração de conexão e gerenciamento de sessão
- DependΓͺncias: Injeção de dependΓͺncias para casos de uso e repositΓ³rios
Lida com requisiçáes e respostas HTTP:
- Controllers: Endpoints de API
- Schemas: Modelos de dados para Requisição/Resposta
- Crie a entidade em
domain/entities/
- Defina a interface do repositΓ³rio em
domain/repositories/
- Implemente os casos de uso em
domain/use_cases/
- Adicione a implementação do repositório em
infrastructure/repositories/
- Adicione as dependΓͺncias em
infrastructure/dependencies/
- Crie os schemas em
presentation/schemas/
- Adicione o controller em
presentation/controllers/
poetry run pytest
A aplicação estÑ containerizada para fÑcil implantação:
# Construir e iniciar containers
docker-compose up --build
# Executar em modo desanexado
docker-compose up -d
graph TD
subgraph "Presentation Layer"
direction TB
Controllers["Controllers\nuser_controller.py"]
Schemas["Schemas\nuser/request.py\nuser/response.py"]
end
subgraph "Use Cases Layer"
direction TB
UseCases["User Use Cases\ncreate_user.py\nget_user.py\nlist_users.py"]
UseCaseInterface["Use Case Interface\ninterfaces/use_case.py"]
end
subgraph "Domain Layer"
direction TB
Entities["Entities\nuser.py"]
Repositories["Repository Interfaces\nuser_repository.py"]
end
subgraph "Infrastructure Layer"
direction TB
DbConfig["Database Config\ndatabase.py\nsettings.py"]
RepImpl["Repository Implementation\nsqlmodel_user_repository.py"]
Dependencies["Dependencies\nuser_dependencies.py"]
Security["Security\npassword.py"]
end
Controllers --> Schemas
Controllers --> UseCases
UseCases --> UseCaseInterface
UseCases --> Entities
UseCases --> Repositories
RepImpl --> Repositories
RepImpl --> DbConfig
RepImpl --> Entities
Dependencies --> RepImpl
Dependencies --> UseCases
Security --> UseCases
classDef presentation fill:#FFB6C1,stroke:#fff,stroke-width:1px;
classDef usecases fill:#FFA07A,stroke:#fff,stroke-width:1px;
classDef domain fill:#87CEEB,stroke:#fff,stroke-width:1px;
classDef infrastructure fill:#98FB98,stroke:#fff,stroke-width:1px;
class Controllers,Schemas presentation;
class UseCases,UseCaseInterface usecases;
class Entities,Repositories domain;
class DbConfig,RepImpl,Dependencies,Security infrastructure;
DistribuΓdo sob a licenΓ§a BSD-3. Veja LICENSE
para mais informaçáes.