API REST para votação em assembleia
Este projeto é um desafio técnico, descrição:
No cooperativismo, cada associado possui um voto e as decisões são tomadas em assembleias, por votação. Imagine que você deve criar uma solução backend para gerenciar essas sessões de votação.
Essa solução deve ser executada na nuvem e promover as seguintes funcionalidades através de uma API REST:
- Cadastrar uma nova pauta
- Abrir uma sessão de votação em uma pauta (a sessão de votação deve ficar aberta por um tempo determinado na chamada de abertura ou 1 minuto por default)
- Receber votos dos associados em pautas (os votos são apenas 'Sim'/'Não'. Cada associado é identificado por um id único e pode votar apenas uma vez por pauta)
- Contabilizar os votos e dar o resultado da votação na pauta
Tarefa Bônus 1 - Integração com sistemas externos
Integrar com um sistema que verifique, a partir do CPF do associado, se ele pode votar
GET https://user-info.herokuapp.com/users/{cpf}
Caso o CPF seja inválido, a API retornará o HTTP Status 404 (Not found). Você pode usar geradores de CPF para gerar CPFs válidos;
Caso o CPF seja válido, a API retornará se o usuário pode (ABLE_TO_VOTE) ou não pode (UNABLE_TO_VOTE) executar a operação Exemplos de retorno do serviço
Tarefa Bônus 2 - Mensageria e filas
Classificação da informação: Uso Interno O resultado da votação precisa ser informado para o restante da plataforma, isso deve ser feito preferencialmente através de mensageria. Quando a sessão de votação fechar, poste uma mensagem com o resultado da votação.
Tarefa Bônus 3 - Performance
Imagine que sua aplicação possa ser usada em cenários que existam centenas de milhares de votos. Ela deve se comportar de maneira performática nesses cenários;
Testes de performance são uma boa maneira de garantir e observar como sua aplicação se comporta.
Tarefa Bônus 4 - Versionamento da API
Como você versionaria a API da sua aplicação? Que estratégia usar?
- Java 8
- Spring
- Maven
- MongoDB
- ModelMapper
- Swagger
- JUnit
- Mockito
- Kafka
- Docker
- Maven 3.6+
- Java 8
- Docker instalado na máquina
O Docker deve estar rodando na maquina.
Clone o projeto e navegue até a pasta root do mesmo por um terminal.
Então, execute os comandos na sequencia abaixo para compilar, rodar os testes unitarios da aplicação e gerar as imagens docker:
- mvn clean
- mvn package
- docker-compose up
Caso deseje rodar apenas os testes:
- mvn test
Após subir os containers do docker, a api ficará disponivel em:
Para visualizar a documentação da api:
OBS: dependendo de como esta configurado o docker, o localhost poderá ser outro IP, então para acessar a aplicação deverá ir pelo ip do docker.
Foi implementado um servico 'CpfService' no qual realiza a integração com o serviço externo;
Foi utilizado o Kafka para mensageria:
O producer ficou responsável por enviar os resultados das votações;
O consumer ficou responsável por escutar os resultados das votações e apenas logar em console os resultados.
Não foi realizado.
Há varias formas de fazer o versionamento, para este teste foi escolhido pela url, onde as apis foram construidas como api/v1/ .
Surgindo a necessidade de uma nova versão, seria criado novos controllers/services e as apis do mesmo ficariam como api/v2/ .