Projeto para voto de pautas em assembleia de cooperativas. É uma aplicação rest simples que consiste em alguns endpoints básico para realizar tal tarefa.
Usei a aplicação para refinar meus conhecimentos de arquitetura, afinal testes como esse são demorados então sempre os aproveito como objeto de estudo. Logo acabei causando adicionando alguma complexidade.
Para rodar atender aos requisitos e executar docker compose up
na raiz do projeto, aguardar iniciar e acessar https://localhost:8080/swagger-ui/index.html#/pauta-controller/resultados.
- Criar token no site invertext.com para usar seu validador de CPF e armazenar ele localmente em uma
variável de ambiente chamada
INVERTEXT_TOKEN
:
- Ter o docker instalado
A aplicação tem várias váriáveis de ambiente para configurar recursos internos e externos:
- STACKHERO_RABBITMQ_HOST: Host do rabbit
- STACKHERO_RABBITMQ_PASSWORD: Senha do RabbitMQ
- RABBITMQ_PORT: Porta do RabbitMQ
- RABBITMQ_USERNAME: Usuário do RabbitMQ
- RABBITMQ_VHOST: Host virtual do RabbitMQ
- STACKHERO_MYSQL_HOST: Host do mysql
- STACKHERO_MYSQL_PORT: Porta do mysql
- STACKHERO_MYSQL_USER: Usuário do mysql
- STACKHERO_MYSQL_ROOT_PASSWORD: Senha do mysql
- INVERTEXT_TOKEN: Token de acesso do invertext.com
- SESSION_DURATION: Duração padrão da sessão de votação
- PORT: Porta que a aplicação deve utilizar
Você pode acessar a aplicação online para testes neste link.
- GET /pautas: retorna pautas cadastradas
- POST /pautas: cadastra pauta. Abaixo exemplo de body da requisição:
{ "titulo": "Porcentagem de lucros", "descricao": "Diz respeito ao aumento de 1% na faixa de lucro distribuído" }
- POST /pautas/{pautaId}/votos: cadastra pauta. Abaixo exemplo de body da requisição:
{ "cpf": "06412721380", "voto": false }
- POST /pautas/{pautaId}/sessoes: abre sessão de votação.
- GET /pautas/{pautaId}/resultados: retorna resultados da votação
Eu utilizei arquitetura hexagonal para organizar e desacoplar as camadas da minha aplicação. Criei as seguintes camadas e estrutura:
├── api # Camada que expõe os endpoints
├── core
│ ├── application # Camada com os use cases da aplicação
│ └── domain # Camada com o domínio
└── infra # Camada de acesso a recursos externos
- Mysql: Banco de dados utilizado para armazenar os pautas, sessões, votos e resultados
- Invertext.com: API utilizada para validar CPF
- RabbitMQ: Mensageria utilizada para publicar os resultados para outros clientes
- Implementar restante dos endpoints;
- Salvar os resultados em um banco de dado com mais disponibilidades, tipo o mongodb, para disponibilizar os resultados de forma mais performática;
- Utilizar mais recursos do swagger para detalhar melhor o body e outras informações dos endpoints;
- Finalizar os testes de integração utilizando o testcontainers