src/
├── domain/ # Camada de Domínio
│ ├── entities/
│ │ └── item.py # Entidade Item com validações
│ └── repositories/
│ └── item_repository.py # Interface do repositório (Port)
│
├── application/ # Camada de Aplicação
│ ├── use_cases/
│ │ └── item_use_cases.py # 7 casos de uso implementados
│ └── schemas/
│ └── item_schema.py # Schemas Pydantic
│
├── infrastructure/ # Camada de Infraestrutura
│ ├── database/
│ │ ├── config.py # Configuração SQLAlchemy
│ │ └── models.py # Modelo ORM ItemModel
│ └── repositories/
│ └── item_repository_impl.py # Implementação concreta
│
└── presentation/ # Camada de Apresentação
└── api/
└── routes/
└── item_routes.py # Endpoints FastAPI
- Dataclass com todos os atributos do diagrama
- Validações de negócio no
__post_init__ - Métodos de domínio:
marcar_como_devolvido()atualizar_descricao()
- Independente de frameworks
- Abstração (Port) para acesso a dados
- Métodos definidos:
create()- Criar itemget_by_id()- Buscar por IDget_all()- Listar todosupdate()- Atualizardelete()- Deletarget_by_categoria()- Buscar por categoriaget_by_status()- Buscar por status
7 casos de uso implementados:
CreateItemUseCase- Criar novo itemGetItemByIdUseCase- Buscar item por IDGetAllItemsUseCase- Listar todos os itensUpdateItemUseCase- Atualizar itemDeleteItemUseCase- Deletar itemGetItemsByCategoriaUseCase- Buscar por categoriaGetItemsByStatusUseCase- Buscar por status
ItemBase- Schema baseItemCreate- Para criaçãoItemUpdate- Para atualização (campos opcionais)ItemResponse- Para respostaItemListResponse- Para listagem paginada
- Setup do SQLAlchemy com async
- Engine assíncrono
- Session maker
- Função
get_session()para dependency injection - Função
init_db()para criar tabelas
ItemModel- Modelo SQLAlchemy- Mapeamento completo da tabela
items - IMPORTANTE - Fase 1: Foreign Keys temporariamente removidas
local_ideresponsavel_idsão campos INTEGER simples- As constraints serão adicionadas quando as entidades Local e Responsável forem implementadas
- Isso permite testar a entidade Item isoladamente
- Timestamps automáticos (created_at, updated_at)
- Implementação concreta de
ItemRepository - Conversões entre Entity e Model:
_model_to_entity()- ORM → Domain_entity_to_model()- Domain → ORM
- Implementação de todos os métodos da interface
- Uso de SQLAlchemy async
Endpoints REST implementados:
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/v1/items/ |
Criar novo item |
| GET | /api/v1/items/{id} |
Buscar item por ID |
| GET | /api/v1/items/ |
Listar todos (paginado) |
| PUT | /api/v1/items/{id} |
Atualizar item |
| PATCH | /api/v1/items/{id} |
Atualização parcial |
| DELETE | /api/v1/items/{id} |
Deletar item |
| GET | /api/v1/items/categoria/{categoria} |
Buscar por categoria |
| GET | /api/v1/items/status/{status} |
Buscar por status |
- Dependency Injection do repositório
- Tratamento de erros com HTTPException
- Validação automática via Pydantic
- Documentação automática (OpenAPI/Swagger)
- FastAPI app com metadados
- Lifespan para inicializar DB
- Inclusão das rotas
- Endpoint raiz com informações
- Dependências necessárias adicionadas:
fastapi[standard]sqlalchemyaiosqlitepydanticpydantic-settings
- Documentação completa da arquitetura
- Explicação de cada camada
- Princípios SOLID aplicados
- Exemplos de uso
- Domain não conhece banco de dados
- Infrastructure não conhece regras de negócio
- Presentation não conhece detalhes de persistência
- Domain pode ser testado sem banco
- Use Cases podem ser testados com mocks
- Fácil criar testes unitários
- Código organizado e limpo
- Fácil localizar funcionalidades
- Mudanças isoladas em camadas
- Trocar banco de dados sem afetar domínio
- Adicionar novos endpoints facilmente
- Substituir implementações
poetry installpoetry run uvicorn main:app --reload --port 5000- Swagger UI: http://localhost:5000/docs
- ReDoc: http://localhost:5000/redoc
curl -X POST "http://localhost:5000/api/v1/items/" \
-H "Content-Type: application/json" \
-d '{
"nome": "Carteira de couro",
"categoria": "documentos",
"data_encontro": "2026-02-12T14:30:00",
"descricao": "Carteira de couro marrom encontrada na biblioteca",
"status": "disponivel",
"local_id": 1,
"responsavel_id": 1
}'curl -X GET "http://localhost:5000/api/v1/items/"curl -X GET "http://localhost:5000/api/v1/items/1"curl -X PUT "http://localhost:5000/api/v1/items/1" \
-H "Content-Type: application/json" \
-d '{
"status": "devolvido"
}'curl -X DELETE "http://localhost:5000/api/v1/items/1"A primeira entidade foi implementada completamente seguindo a Arquitetura Diplomata. As foreign keys foram temporariamente removidas para permitir o funcionamento isolado nesta fase inicial.
- Local - Onde o item foi encontrado
- Após implementação, adicionar FK:
items.local_id→locais.id
- Após implementação, adicionar FK:
- Responsável - Quem registrou o item
- Após implementação, adicionar FK:
items.responsavel_id→responsaveis.id
- Após implementação, adicionar FK:
- Reclamante - Quem reivindica o item
- Devolução - Registro da devolução
- Relacionamento com Item e Reclamante
- Relacionamentos entre entidades
- Testes unitários e integração
- Autenticação JWT
- Paginação avançada
- Filtros e buscas
- Migrations com Alembic
- Docker e Docker Compose
- CI/CD
- Separação em camadas
- Regra de dependência
- Inversão de dependências
- Single Responsibility
- Open/Closed
- Liskov Substitution
- Interface Segregation
- Dependency Inversion
- Repository Pattern
- Dependency Injection
- DTO (Data Transfer Object)
- Use Case Pattern
- FastAPI Documentation
- SQLAlchemy Documentation
- Clean Architecture (Robert C. Martin)
- Arquitetura Diplomata
Grupo Ditko.br Projeto Frameworks Full Stack - Prof. Giovani Bontempo - Faculdade Impacta