API para jogo UNO implementada com FastAPI, seguindo os princípios SOLID e Clean Architecture.
O projeto está organizado em camadas seguindo Clean Architecture:
.
├── domain/ # Camada de Domínio (Regras de negócio puras)
│ ├── entities/ # Entidades do domínio (Card, Game, Player)
│ └── repositories/ # Interfaces de repositórios
├── application/ # Camada de Aplicação (Casos de uso)
│ ├── use_cases/ # Casos de uso da aplicação
│ └── services/ # Serviços de aplicação
├── infrastructure/ # Camada de Infraestrutura (Implementações)
│ └── repositories/ # Implementação dos repositórios
├── presentation/ # Camada de Apresentação (API)
│ ├── dto/ # Data Transfer Objects
│ ├── dependencies/ # Container de dependências
│ └── routes/ # Rotas da API
└── main.py # Ponto de entrada da aplicação
pip install -r requirements.txtpython main.pyOu usando uvicorn diretamente:
uvicorn main:app --reloadA aplicação estará disponível em: http://localhost:8000
Acesse a documentação interativa em:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
GET /novoJogo?num_jogadores={numero}
Inicia um novo jogo com o número especificado de jogadores.
Exemplo:
GET /novoJogo?num_jogadores=3
Resposta:
{
"id_jogo": 1,
"message": "Jogo criado com sucesso!",
"players_count": 3
}GET /jogo/{id_jogo}/{id_jogador}
Retorna as cartas na mão de um jogador específico.
Exemplo:
GET /jogo/1/0
Resposta:
{
"id_jogo": 1,
"id_jogador": 0,
"cartas": [
{
"id": 1,
"color": "vermelho",
"value": "5"
},
{
"id": 2,
"color": "azul",
"value": "3"
}
]
}GET /jogo/{id_jogo}/jogado_da_vez
Retorna o ID do jogador da vez.
Exemplo:
GET /jogo/1/jogado_da_vez
Resposta:
{
"id_jogo": 1,
"id_jogador_da_vez": 0
}PUT /jogo/{id_jogo}/jogar?id_jogador={id}&id_carta={indice}
Joga uma carta da mão do jogador.
Exemplo:
PUT /jogo/1/jogar?id_jogador=0&id_carta=0
Resposta:
{
"message": "Carta jogada com sucesso",
"won": false
}Se o jogador ganhar:
{
"message": "Você ganhou o jogo!",
"won": true
}PUT /jogo/{id_jogo}/passa?id_jogador={id}
Passa a vez do jogador, adicionando uma carta à sua mão.
Exemplo:
PUT /jogo/1/passa?id_jogador=0
Resposta:
{
"message": "Vez passada. Uma carta foi adicionada à sua mão."
}- Cada jogador recebe 5 cartas no início do jogo
- A ordem de jogadas é sempre: jogador 0, jogador 1, jogador 2...
- Uma carta pode ser jogada se:
- For da mesma cor da carta do topo, OU
- For do mesmo valor da carta do topo, OU
- For uma carta coringa
- Se o jogador ficar sem cartas, ele vence o jogo
- Ao passar a vez, o jogador recebe uma carta adicional
- Cada classe tem uma única responsabilidade
DeckService: responsável apenas por gerenciar o baralhoCreateGameUseCase: responsável apenas por criar jogos- Cada caso de uso tem uma responsabilidade específica
- As interfaces de repositórios permitem extensão sem modificação
- Novos repositórios podem ser criados (ex:
DatabaseGameRepository) sem alterar o código existente
- Qualquer implementação de
GameRepositorypode ser substituída sem quebrar o código
- Interfaces específicas e focadas (como
GameRepository)
- As camadas superiores dependem de abstrações (interfaces)
- A implementação concreta está na camada de infraestrutura
- Entidades puras sem dependências externas
- Interfaces de repositórios
- Casos de uso (orquestram as regras de negócio)
- Serviços de domínio
- Implementação concreta dos repositórios
- Pode incluir: banco de dados, APIs externas, etc.
- DTOs para comunicação com o cliente
- Rotas da API
- Container de dependências
- FastAPI: Framework web moderno e rápido
- Pydantic: Validação de dados
- Uvicorn: Servidor ASGI
Implementado seguindo a arquitetura do repositório: FastAPI-The-Complete-Course