Neste artigo dou continuidade à construção da uma aplicação baseada em microserviços, utilizando Java e Spring Boot para gerenciar cartas e decks de Yu-Gi-Oh, com arquitetura hexagonal. Neste segundo artigo incluo o suporte multi usuário.
Recapitulando
Na Parte 1 abordamos:
- Modelagem baseada na orientação a objetos pura, explorando a herança entre cartas (Monster, Spell, Trap)
- Foi feita a integração com API externa YGOProDeck
- Uso do padrão de projeto factory através da classe:
CardFactory
eFeignClient
- Arquitetura Hexagonal aplicada
Agora evoluímos para:
- Persistência com Spring Data JPA (Usando o banco de dados local h2)
- Criação de cartas personalizadas via
POST
- Filtragem de cartas por usuário com o parâmetro
ownerId
- Endpoint de listagem exclusiva
GET /cards/custom?ownerId=
O Cenário Atual
Cada carta agora carrega um campo ownerId
, que identifica o usuário que a criou. Isso permite separar cartas criadas manualmente daquelas importadas via API externa.
Obs: O fato de incluirmos um simples campo na nossa aplicação faz com que seja necessário alterar todas as outras estruturas que contavam com a ausência desse campo, por exemplo: o teste de persistencia não incluia esse novo campo, nosso mapper não esperava esse campo e todas as outras estruturas que fazem parte da criação e persistencia desse campo no banco de dados.
Exemplo de objeto Card
salvo:
{
"id": 99999999,
"name": "Teste Dragão Sombrio",
"type": "MONSTER",
"ownerId": "user123"
}
Endpoints
POST /cards/custom
Cria uma carta customizada:
POST /cards/custom
Content-Type: application/json
{
"name": "Teste Dragão Sombrio",
"type": "MONSTER",
"attack": 2500,
"defense": 2100,
"level": 7,
"attribute": "DARK",
"monsterType": "DRAGON",
"subTypes": ["NORMAL", "EFFECT"],
"ownerId": "user123"
}
GET /cards/custom?ownerId=user123
Lista apenas as cartas criadas por user123
:
[
{
"id": 99999999,
"name": "Teste Dragão Sombrio",
"type": "MONSTER",
"ownerId": "user123"
}
]
Arquitetura Hexagonal Aplicada
-
Domínio:
Card
,MonsterCard
,SpellCard
,TrapCard
-
Portas:
CardPersistencePort
-
Adapters:
-
CardRepositoryAdapter
(saida) -
CustomCardQueryController
(entrada) -
SaveCardUseCase
eListCustomCardsUseCase
(aplicação)
-
-
Infraestrutura:
-
JpaRepository
separados por tipo de carta -
H2
como banco em memória
-
Destaques
- Modularização limpa para cada tipo de carta
-
ownerId
como chave de multi-tenancy - Separando responsabilidade por camadas (entrada, saída, domínio)
- Fácil evolução futura com autenticação (JWT)
Próximos Passos
- Na próxima parte, vamos abordar a criação e gerenciamento de decks personalizados com persistência e exportação em formato ydk.
- Criação do validador das cartas(konami) customizadas.
Repositório: github.com/odevpedro/yu-gi-oh-deck-management
Dúvidas ou sugestões? Comente abaixo ⬇️. Na próxima parte, vamos abordar a criação e gerenciamento de decks personalizados com persistência e exportação.
Representação visual da nova implementação: