Skip to content

danielarrais/voting-system

Repository files navigation

Sistema de votos de cooperativa

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.

Importante

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.

Execução local

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.

Requisitos

  1. 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:

image

  1. Ter o docker instalado

Variáveis de ambiente

A aplicação tem várias váriáveis de ambiente para configurar recursos internos e externos:

RabbitMQ

  • 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

MySQL

  • 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

API de validação de CPF

  • INVERTEXT_TOKEN: Token de acesso do invertext.com

Aplicação

  • SESSION_DURATION: Duração padrão da sessão de votação
  • PORT: Porta que a aplicação deve utilizar

Acesso em cloud

Você pode acessar a aplicação online para testes neste link.

Endpoints

  • 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

Arquitetura

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

Diagrama sem nome drawio

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

Melhorias

  • 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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published