Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Entrega do desafio-votacao-fullstack #6

Open
wants to merge 33 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ddbf968
🎉started project
gabrielwp87 Dec 6, 2024
de52f7b
✨feature/ created entities
gabrielwp87 Dec 7, 2024
c1fe4ae
✨feature/ created repositories
gabrielwp87 Dec 7, 2024
0e85599
🚧 stared services and created voteDTO
gabrielwp87 Dec 8, 2024
48e662c
🚧 refactored DTOs
gabrielwp87 Dec 9, 2024
f3b1ff4
🚧 refactored voteDTO and created VoteResponseDTO
gabrielwp87 Dec 10, 2024
1826598
🚧 fixed the repositories
gabrielwp87 Dec 10, 2024
8a51f34
🚧 fixed the agenda repository
gabrielwp87 Dec 10, 2024
4f54ce9
🚧 cleaned initial test from main springApplication run
gabrielwp87 Dec 10, 2024
bd1d2bf
🚧 created the endpoints and adjusted their services
gabrielwp87 Dec 10, 2024
5367e01
🚧 refactored the query form to RequestParam and removed the status fr…
gabrielwp87 Dec 10, 2024
73d3eb9
✨feature/ added api to validate a cpf and if the cpf is able to vote
gabrielwp87 Dec 10, 2024
459a375
✨feature/ added exceptions handlers
gabrielwp87 Dec 10, 2024
9835f94
🎉 frontend created the projetc prototipe and navigation
gabrielwp87 Dec 12, 2024
2acc750
🚧 created a simple flux to exemplify the frontend
gabrielwp87 Dec 13, 2024
94d69cb
✨feature/ created unit tests
gabrielwp87 Dec 13, 2024
d465af4
✨feature/ add docker compose to make it easy to use mongoDB
gabrielwp87 Dec 13, 2024
ff67cbe
✨added the cpf already exists exception and cleaned the code
gabrielwp87 Dec 13, 2024
89ce5af
📝 added documentation to the backend
gabrielwp87 Dec 13, 2024
c75e618
♻️ refactored code creating a global exception handler and cleaning t…
gabrielwp87 Dec 13, 2024
89817bc
♻️ refactored agenda service using beanUtils cleaning the createAgenda
gabrielwp87 Dec 13, 2024
987e516
🚧 started integration with backend
gabrielwp87 Dec 14, 2024
28e17ae
✨ added favicon and integration with backend
gabrielwp87 Dec 14, 2024
c41efef
♻️ refactored a comparison in result.tsx
gabrielwp87 Dec 14, 2024
ba613b7
🐛 fixed bug from agenda status being null
gabrielwp87 Dec 15, 2024
e462f4c
🐛 fixed some bugs in the pages integration
gabrielwp87 Dec 15, 2024
8d2cf46
🐛 fixed bug in the voting register process
gabrielwp87 Dec 15, 2024
dcffa01
Update README.md
gabrielwp87 Dec 15, 2024
b117a24
📝 updated readme
gabrielwp87 Dec 15, 2024
541b9c7
📝 updated readme with cpfs examples for tests and how to run the project
gabrielwp87 Dec 15, 2024
0ad70ac
🐛 changed the java version, bc it wasn't compiling by command line
gabrielwp87 Dec 15, 2024
0d1298f
📝 updated readme bits of whys of my code
gabrielwp87 Dec 16, 2024
4b7fd97
📝 updated readme with the whys of my code
gabrielwp87 Dec 16, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Votação

## Instruções de como rodar o projeto
As instruções de como rodar o frontend do projeto estão no diretório /frontend, assim como as instruções de como rodar o backend do projeto estão no diretório /backend, cada em seus
respectivos README's.


## Objetivo

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 we para gerenciar e participar dessas sessões de votação.
Expand Down
2 changes: 2 additions & 0 deletions backend/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf
113 changes: 113 additions & 0 deletions backend/.gitingore
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
### Intellij+all ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf

# AWS User-specific
.idea/**/aws.xml

# Generated files
.idea/**/contentModel.xml

# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml

# Gradle
.idea/**/gradle.xml
.idea/**/libraries

# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr

# CMake
cmake-build-*/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml

# File-based project format
*.iws

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# SonarLint plugin
.idea/sonarlint/

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

# Editor-based Rest Client
.idea/httpRequests

# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

### Intellij+all Patch ###
# Ignore everything but code style settings and run configurations
# that are supposed to be shared within teams.

.idea/*

!.idea/codeStyles
!.idea/runConfigurations

### Java ###
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
11 changes: 11 additions & 0 deletions backend/.idea/desafio-votacao-backend.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions backend/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions backend/.idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions backend/.idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions backend/.mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
128 changes: 128 additions & 0 deletions backend/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# Sistema de Votação

Este projeto foi desenvolvido para o desafio de desenvolvimento de uma API de
votação para uma cooperativa.

## Technologias Utilizadas

- Java 21
- Spring Boot
- Maven
- MongoDB
- Docker
- Docker Compose

## Estrutura do Projeto

Esse projeto foi criado utilizando a abordagem de design
de DDD (Domain Driven Development) e "Clean Architecture".


- `src/main/java/com/votacao/desafiovotacao`: Contém o código principal do aplicativo.
- `application`: Contém controladores e DTOs.
- `domain`:Contém entidades, serviços e exceções.
- `infra`: Contém as interfaces dos repositórios.


### Prerequisitos

- Java 21
- Maven
- MongoDB
- Docker
- Docker Compose

## Alguns CPFs para teste

- 086.492.750-95
- 984.928.230-46
- 582.106.150-41
- 263.220.420-84
- 333.535.550-48

Caso seja necessário mais CPFs para teste, pode-se utilizar o site
https://www.4devs.com.br/gerador_de_cpf

Pois adicionei um serviço para validar o CPF informado.

## Como rodar o backend do projeto

Para rodar o projeto é necessário ter o Java e o Maven e o Docker funcionando.

- Subir o banco de dados
```
docker compose up -d
```

- Execute a aplicação Spring Boot.
```
mvn clean
```
```
mvn spring-boot:run
```

- Para acessar a aplicação:
```
http://localhost:8080/
```


### Versionamento da API

"Como você versionaria a API da sua aplicação? Que estratégia usar?"

A versão da API pode ser controlada por meio da URL. Aconselhável quando a API sofre
mudanças significativas.
Por exemplo, a versão 1 da API seria acessada através de `/api/v1/`.

Outra estratégia seria usar o content-type para controlar a versão da API,
por exemplo: content-type: `application/vnd.api.v1+json`. Aconselhável quando a API sofre
mudanças incrementais ou mesmo mundanças de no conteúdo trocado com o cliente.

Portanto, eu versionaria a API conforme a mundança que seria feita no código.


### Explicação breve do porquê das escolhas tomadas durante o desenvolvimento da solução

Escolhi de usar o design DDD e o clean architecture para facilitar a manutenção
e o entendimento do projeto. Tendo sempre em vista uma boa organização e
bom entendimento do fluxo de dados e ações, o que permitindo o código ser
facilmente compreendido e alterado.

Com isso em mente o projeto foi divido em 3 camadas:
- a camada de Aplicação: onde ficam os controladores, os DTOS que são transmitidos para
a camada de domínio e o handler global de exceções.
- a camada do Domínio: onde se encontram as entidades, serviços e exceções.
- a camada da Infraestutura (infra): no qual estão as interfaces dos repositórios que estão na camada de
- infraestrutura. E as entidades são o núcleo do projeto, onde ficam as regras de negócio.

Escolhi usar o MongoDB por ser um banco de dados NoSQL que traz a proposta de ser
mais performático que um banco relacional, isso ocorre devido ao MongoDB ser um
banco de dados CP (do Teorema CAP) o que oferece consistência e tolerância à
partição em detrimento da disponibilidade.

O uso do MongoDB, portanto, é ideal para o cenário de votação permite que existam
centenas de milhares de votos, conforme exigido pela "Tarefa Bônus 2 - Performance".

Foi criado o serviço para validar o CPF informado conforme solicitado na
"Tarefa Bônus 1 - Validação do Associado". Entretanto optei por não integrar essa
funcionalidade de retornar aleatoriamente "ABLE_TO_VOTE" ou "UNABLE_TO_VOTE"
no projeto, sendo feito apenas um endpoint para sua utilização. Já a validação
do CPF foi adicionado ao código para garantir que não há CPFs
inválidos no banco de dados.

Só se altera o status de uma sessão para encerrada quando se procura por uma sessão e
se verifica que o tempo de duração da sessão foi alcançado.

O Status da pauta não fecha, pois não há um limite para quantas sessões
podem ser criadas nela.

Criei o CRUD completo dos endpoints para caso sejam úteis ao testar a aplicação.

Escolhi deixar que o ID dos diversos itens nesse projeto sejam inseridos diretamente pelo
o usuário para facilitar a utilização e teste da aplicação.

Apenas o voto não está em inglês e esse readme, no backend, para facilitar o transporte de
de dados do voto entre o frontend e o backend e por que o readme do desafio esta em
português.
8 changes: 8 additions & 0 deletions backend/desafiovotacao.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="AdditionalModuleElements">
<content url="file://$MODULE_DIR$" dumb="true">
<excludeFolder url="file://$MODULE_DIR$/.idea" />
</content>
</component>
</module>
15 changes: 15 additions & 0 deletions backend/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
version: '3.8'

services:

mongo:
image: mongo
restart: always
ports:
- 27017:27017

mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081
Loading