As premissas:
A 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
- Integração com sistemas externos
- 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
- 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
- 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
A abordagem foi utilizar uma arquitetura orientada a eventos, utilizando Rqueue para o gerenciamento dos eventos, Redis para notificações dos eventos, além de Kafka para notificação do resultado final da Sessão de votação de uma Pauta.
A documentação foi utilizado o Redoc para gerar o arquivo Html para ser disponibilizado o contrato e mais informações do comportamento da Api. A documentação pode ser encontrada no caminho http://<ip_da_aplicação:porta_da_aplicação/
A solução utiliza Java na versão 17, certifique de ter instalado. Assim como um banco de dados, recomentando Postgres, uma instância do Redis e também uma instância do Kafka configurado.
O arquivo docker-compose contém as configurações dos containers, de exemplo, para execução.
Com banco de dados, Redis e Kafka execute: mvn spring-boot:run
Controle de versão adotado foi adoção no dominio da api, Exemplo: https://ap.v1.coopvotes.online
Toda resposta da API contém um Header com chave Version-Api e o valor a versão da API exemplo: 1.0.0.
- Official Apache Maven documentation
- Spring Boot Maven Plugin Reference Guide
- Create an OCI image
- Testcontainers Kafka Modules Reference Guide
- Spring Configuration Processor
- Spring Data JPA
- Spring for Apache Kafka
- Spring Boot DevTools
- OpenFeign
- Testcontainers
- Spring Web
- Redoc
- Spring Cloud
- Wiremock
- OpenApi