From f197eccc4eae117a85bff291be527a0070da89f3 Mon Sep 17 00:00:00 2001 From: tuliogontijo Date: Fri, 3 May 2024 11:34:49 -0300 Subject: [PATCH 1/3] =?UTF-8?q?chore:=20inclus=C3=A3o=20dos=20reposit?= =?UTF-8?q?=C3=B3rios=20como=20submodulos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 6 ++++++ backend | 1 + frontend | 1 + 3 files changed, 8 insertions(+) create mode 100644 .gitmodules create mode 160000 backend create mode 160000 frontend diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..6fbc188 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "backend"] + path = backend + url = https://github.com/tuliogontijo/desafio-votacao-dbserver-backend.git +[submodule "frontend"] + path = frontend + url = https://github.com/tuliogontijo/desafio-votacao-dbserver-frontend.git diff --git a/backend b/backend new file mode 160000 index 0000000..ebb53c3 --- /dev/null +++ b/backend @@ -0,0 +1 @@ +Subproject commit ebb53c37936baf2091b9c2876070276e1b1793db diff --git a/frontend b/frontend new file mode 160000 index 0000000..26ace81 --- /dev/null +++ b/frontend @@ -0,0 +1 @@ +Subproject commit 26ace81393756ca9432fae41854ee73ed7ba9c8d From 2e51aff5398ab25be6c025792fa17c37d8584a69 Mon Sep 17 00:00:00 2001 From: tuliogontijo Date: Sat, 4 May 2024 16:01:40 -0300 Subject: [PATCH 2/3] =?UTF-8?q?doc:=20alteracao=20do=20readme=20e=20instru?= =?UTF-8?q?=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- INSTRUCOES_DEASAFIO.md | 99 ++++++++++++++++++++++++++++++++++++++++++ README.md | 99 ------------------------------------------ 2 files changed, 99 insertions(+), 99 deletions(-) create mode 100644 INSTRUCOES_DEASAFIO.md diff --git a/INSTRUCOES_DEASAFIO.md b/INSTRUCOES_DEASAFIO.md new file mode 100644 index 0000000..a7e5303 --- /dev/null +++ b/INSTRUCOES_DEASAFIO.md @@ -0,0 +1,99 @@ +# votacao-react-java + +## Objetivo + +Imagine que você deve criar uma solução web para gerenciar e participar de 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 nas pautas (os votos são apenas 'Sim'/'Não'. Cada usuário é 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 + +Para fins de exercício a solução deve ser construída em Java (SpringBoot) no backend e React no frontend. Frameworks e bibliotecas são de livre escolha (desde que não infrinja direitos de uso). + +É importante que as pautas e os votos sejam persistidos e que não sejam perdidos com o restart da aplicação. + +O foco dessa avaliação é a comunicação entre o backend e o frontend. Essa comunicação é feita através de mensagens no formato JSON, onde essas mensagens serão interpretadas pelo cliente para montar as telas onde o usuário vai interagir com o sistema. O formato fica a seu criterio e as telas estão descritas no anexo 1. + +## Como proceder + +Por favor, realize o FORK desse repositório e implemente sua solução no FORK em seu repositório GitHub, ao final, notifique da conclusão para que possamos analisar o código implementado. + +Lembre-se de deixar todas as orientações necessárias para executar o seu código. + +## Tarefas bônus + +### Tarefa Bônus 1 - Controle de usuários + +- Criar cadastro de usuários para votação (apenas CPFs validos) +- Adicionar usuários específicos como admin +- Apenas usuários admin podem acessar alguns recursos + - Criar pautas + - Cadastrar usuários votantes + +### Tarefa Bônus 2 - 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 3 - Versionamento da API + +- Como você versionaria a API da sua aplicação? Que estratégia usar? + +## Dicas e observações + +- Teste bem sua solução, evite bugs; +- Não inicie o teste sem sanar todas as dúvidas; +- Iremos executar a aplicação para testá-la, cuide com qualquer dependência externa e deixe claro caso haja instruções especiais para execução do mesmo; + +## Anexo 1 + +### Introdução + +A seguir serão detalhados quais telas são necessárias para a conclusão do desafio, assim como os tipos de campos disponíveis para a interação do usuário. + +### Tipo de tela – FORMULARIO + +Criar um formulário para cadastro de uma pauta com o tempo de sessão. + +### Tipo de tela – SELECAO + +Exibir uma lista de pautas para que o usuário acesse e consiga votar. + +Apenas pautas com sessão disponíveis devem ser exibidas. + +Deve ser possível filtrar uma pauta por **categoria** + +### Tipo de tela – VOTACAO + +Exibir os dados da pauta e as opções de voto disponíveis. + +Ao acessar a votação uma sessão precisa estar aberta para a pauta em questão. + +Pautas com sessão expiradas não podem receber votos. + +A votação pode ser acessada por qualquer pessoa com link, sendo necessário informar o CFP antes de votar. + +### Tipo de tela – DETALHES + +Exibir os dados da pauta, quantidade de votos total e se a mesma foi aprovada. + +Ao acessar os detalhes deve exibir se a sessão já terminou. + +## O que será analisado + +- Simplicidade no design da solução (evitar over engineering) +- Organização do código +- Arquitetura do projeto +- Boas práticas de programação (manutenibilidade, legibilidade etc) +- Possíveis bugs +- Tratamento de erros e exceções +- Explicação breve do porquê das escolhas tomadas durante o desenvolvimento da solução +- Uso de testes automatizados e ferramentas de qualidade +- Limpeza do código +- Documentação do código e da API +- Logs da aplicação +- Mensagens e organização dos commits +- Layout responsivo diff --git a/README.md b/README.md index a7e5303..e69de29 100644 --- a/README.md +++ b/README.md @@ -1,99 +0,0 @@ -# votacao-react-java - -## Objetivo - -Imagine que você deve criar uma solução web para gerenciar e participar de 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 nas pautas (os votos são apenas 'Sim'/'Não'. Cada usuário é 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 - -Para fins de exercício a solução deve ser construída em Java (SpringBoot) no backend e React no frontend. Frameworks e bibliotecas são de livre escolha (desde que não infrinja direitos de uso). - -É importante que as pautas e os votos sejam persistidos e que não sejam perdidos com o restart da aplicação. - -O foco dessa avaliação é a comunicação entre o backend e o frontend. Essa comunicação é feita através de mensagens no formato JSON, onde essas mensagens serão interpretadas pelo cliente para montar as telas onde o usuário vai interagir com o sistema. O formato fica a seu criterio e as telas estão descritas no anexo 1. - -## Como proceder - -Por favor, realize o FORK desse repositório e implemente sua solução no FORK em seu repositório GitHub, ao final, notifique da conclusão para que possamos analisar o código implementado. - -Lembre-se de deixar todas as orientações necessárias para executar o seu código. - -## Tarefas bônus - -### Tarefa Bônus 1 - Controle de usuários - -- Criar cadastro de usuários para votação (apenas CPFs validos) -- Adicionar usuários específicos como admin -- Apenas usuários admin podem acessar alguns recursos - - Criar pautas - - Cadastrar usuários votantes - -### Tarefa Bônus 2 - 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 3 - Versionamento da API - -- Como você versionaria a API da sua aplicação? Que estratégia usar? - -## Dicas e observações - -- Teste bem sua solução, evite bugs; -- Não inicie o teste sem sanar todas as dúvidas; -- Iremos executar a aplicação para testá-la, cuide com qualquer dependência externa e deixe claro caso haja instruções especiais para execução do mesmo; - -## Anexo 1 - -### Introdução - -A seguir serão detalhados quais telas são necessárias para a conclusão do desafio, assim como os tipos de campos disponíveis para a interação do usuário. - -### Tipo de tela – FORMULARIO - -Criar um formulário para cadastro de uma pauta com o tempo de sessão. - -### Tipo de tela – SELECAO - -Exibir uma lista de pautas para que o usuário acesse e consiga votar. - -Apenas pautas com sessão disponíveis devem ser exibidas. - -Deve ser possível filtrar uma pauta por **categoria** - -### Tipo de tela – VOTACAO - -Exibir os dados da pauta e as opções de voto disponíveis. - -Ao acessar a votação uma sessão precisa estar aberta para a pauta em questão. - -Pautas com sessão expiradas não podem receber votos. - -A votação pode ser acessada por qualquer pessoa com link, sendo necessário informar o CFP antes de votar. - -### Tipo de tela – DETALHES - -Exibir os dados da pauta, quantidade de votos total e se a mesma foi aprovada. - -Ao acessar os detalhes deve exibir se a sessão já terminou. - -## O que será analisado - -- Simplicidade no design da solução (evitar over engineering) -- Organização do código -- Arquitetura do projeto -- Boas práticas de programação (manutenibilidade, legibilidade etc) -- Possíveis bugs -- Tratamento de erros e exceções -- Explicação breve do porquê das escolhas tomadas durante o desenvolvimento da solução -- Uso de testes automatizados e ferramentas de qualidade -- Limpeza do código -- Documentação do código e da API -- Logs da aplicação -- Mensagens e organização dos commits -- Layout responsivo From 026461b6ddcc64048ec407bedd74e1161fea07d1 Mon Sep 17 00:00:00 2001 From: tuliogontijo Date: Sat, 4 May 2024 16:08:55 -0300 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20atualiza=C3=A7=C3=A3o=20de=20submod?= =?UTF-8?q?ulos=20e=20documenta=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 92 ++++++++++++++++++ backend | 2 +- .../INSTRUCOES_DEASAFIO.md | 0 docs/img/desafio_votacao.png | Bin 0 -> 23868 bytes frontend | 2 +- 5 files changed, 94 insertions(+), 2 deletions(-) rename INSTRUCOES_DEASAFIO.md => docs/INSTRUCOES_DEASAFIO.md (100%) create mode 100644 docs/img/desafio_votacao.png diff --git a/README.md b/README.md index e69de29..7931579 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,92 @@ +# Desafio Votação - Full Stack + +Este é um projeto desenvolvido como parte de um desafio técnico para criar uma solução para dispositivos móveis que gerenciem e participem de sessões de votação em cooperativas. A solução foi implementada em Java, utilizando o framework Spring Boot para o backend e Javascript com a biblioteca React para o frontend. + +👉 As instruções para este desafio foram propostas **[aqui](docs/INSTRUCOES_DEASAFIO.md)** + +## Tecnologias Utilizadas + +### Backend *(IDE: IntelliJ)* +- Java 17 +- Spring Boot +- Maven +- PostgreSQL +- JUnit +- Mockito + +### Frontend *(IDE: Visual Studio Code)* +- Javascript +- React +- Vite +- Ant Design +- Axios + +## Modelagem de banco de dados + +Para a modelagem do banco de dados fora considerada a existências de duas entidades a serem persistidas: **Pautas** e **Votos**. O controle de abertura e fechamento de sessão foi feito com a manipulação de atributos da entidade Pauta. + +Modelagem do banco de dados + +## Pré-requisitos + +Para executar este projeto, é necessário ter instalado: + +- JDK 17 ou superior +- Npm ou yarn +- PostgreSQL 16 +- Git + +## Como Executar o Projeto Localmente + +Siga as instruções abaixo para executar o projeto localmente: + +1. Abra o terminal em um diretório na sua máquina local e clone este repositório; +``` +git clone https://github.com/tuliogontijo/votacao-react-java.git +``` +2. Inicie o serviço postgreSQL e crie um datasource como nome "desafio_votacao"; + +### Backend + +3. Navegue até o diretório do backend; +``` +cd backend +``` +4. Instale as dependências; +``` +./mvnw clean install +``` +5. Rode a aplicação +``` +./mvnw springboot:app +``` +- Se tudo estiver correto a aplicação Java Spring Boot estará disponível em http://localhost:8080 e o banco PostgreSQL na porta padrão 5432. + +- Também é possível acessar a documentação e executar as requisições através do endereço: **http://localhost:8080/swagger-ui/index.html** + +### Frontend + +6. Navegue até o diretório do frontend +``` + cd .. + cd frontend +``` +7. Instale as dependências do projeto +``` + yarn +``` +8. Rode o seguinte script pré-configurado pelo vite para rodar o projeto +``` + yarn dev +``` + +A aplicação rodará e estará acessível no seu localhost na porta padrão do vite: 5173 (http://localhost:5173) + +## Funcionalidades da Aplicação + +A aplicação oferece as seguintes funcionalidades: + +- Cadastro de uma nova pauta +- Abertura de uma sessão de votação em uma pauta +- Recebimento de votos nas pautas (apenas 'Sim'/'Não') +- Contabilização dos votos e resultado da votação na pauta \ No newline at end of file diff --git a/backend b/backend index ebb53c3..2a104af 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit ebb53c37936baf2091b9c2876070276e1b1793db +Subproject commit 2a104afa41480c1b2dba32659b34c3b6c1d656fb diff --git a/INSTRUCOES_DEASAFIO.md b/docs/INSTRUCOES_DEASAFIO.md similarity index 100% rename from INSTRUCOES_DEASAFIO.md rename to docs/INSTRUCOES_DEASAFIO.md diff --git a/docs/img/desafio_votacao.png b/docs/img/desafio_votacao.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfb2a9df9aa9630c171a6e8f6c79da521fe5243 GIT binary patch literal 23868 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

=JKS(=1xm%r0Sl8b3_m8G4y_H$l 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 Y6$mgxVp^|)#q&S(w2dJZn)Z?Z2FG4t@&Et; literal 0 HcmV?d00001 diff --git a/frontend b/frontend index 26ace81..d8ea3cf 160000 --- a/frontend +++ b/frontend @@ -1 +1 @@ -Subproject commit 26ace81393756ca9432fae41854ee73ed7ba9c8d +Subproject commit d8ea3cf0e3296a00ee4ea803a7b627a44fd7fe01