https://github.com/cristian-sknz/ze_code_challenge
Um serviço que implementa funcionalidades de GeoLocalização e gerenciamento de parceiros.
https://github.com/cristian-sknz/ze_code_challenge
code-challenge geo-spatial spring-framework
Last synced: 3 months ago
JSON representation
Um serviço que implementa funcionalidades de GeoLocalização e gerenciamento de parceiros.
- Host: GitHub
- URL: https://github.com/cristian-sknz/ze_code_challenge
- Owner: Cristian-Sknz
- Created: 2023-05-29T21:04:39.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2023-05-29T21:17:05.000Z (about 2 years ago)
- Last Synced: 2025-01-22T20:35:15.726Z (5 months ago)
- Topics: code-challenge, geo-spatial, spring-framework
- Language: Kotlin
- Homepage:
- Size: 328 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
![]()
Zé Code Challenge
Desafio Backend Zé Delivery
Um serviço que implementa funcionalidades de Geo Localização e gerenciamento de parceiros.
---
## Projeto
Este é um projeto que implementa o serviço e as funcionalidades descritas no [Desafio de backend do Zé](https://github.com/ZXVentures/ze-code-challenges/blob/master/backend_pt.md), utilizando Spring Webflux e Reactive MongoDB, incluindo testes de integração.
> Mais adiante, falarei sobre como este projeto foi desenvolvido.
### Rotas da aplicação
Os testes foram feitos com os [dados gerados pela equipe do Zé](https://github.com/ZXVentures/ze-code-challenges/blob/master/files/pdvs.json). Ao iniciar a aplicação, o banco de dados não estará populado.
| Método | Rota | Descrição |
|--------|---------------------|---------------------------------------------------------------------------------------------------------------|
| GET | /partner | Retorna todos os parceiros cadastrados (com paginação) |
| POST | /partner | Cria um novo parceiro de acordo com os dados passados |
| GET | /partner/{id} | Retorna um parceiro pelo ID (numérico) |
| GET | /partner/{document} | Retorna um parceiro pelo documento (CPF ou CNPJ) |
| DELETE | /partner/{id} | Deleta um parceiro pelo ID (numérico) |
| GET | /partner/nearby | Retorna o(s) parceiro(s) mais próximo(s) da localização solicitada pelos parâmetros `longitude` e `latitude` |Decidi aprimorar as rotas solicitadas no desafio, adicionando parâmetros para uma busca mais personalizável e flexível.
| Rota | Parâmetro | Descrição |
|-----------------|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| /partner/{id} | ?type | Por padrão, definido como ID. Este parâmetro sinaliza se a pesquisa será por ID ou Documento (`type=document`). |
| /partner/nearby | ?type | Por padrão, não é definido. Este parâmetro sinaliza qual o tipo de dados o cliente deseja: apenas um parceiro (`type=?`) ou todos ao redor (`type=all`). |
| /partner/nearby | ?kilometers | Por padrão, não é definido. Este parâmetro de pesquisa serve para filtrar parceiros em um raio por quilômetros. |## Iniciar o ambiente
Para poder executar o ambiente inteiro, você precisará atender a alguns requisitos:
* Java 17+
* Gradle 7.6.1 ou mais recente
* Docker
* Docker-composeApós atender aos requisitos, será necessário fazer o build da aplicação com o Gradle, apenas execute o comando `gradlew build` na raiz do projeto.
Com o build realizado, só resta executar o projeto com o docker-compose, usando o comando `docker-compose up -d`.
A aplicação está configurada corretamente e "pronta" para produção, sem necessidade de configurações adicionais.
---
## Conclusão
Este projeto foi relativamente tranquilo de ser feito. No processo, aprendi como lidar com GeoJSON no Spring Data MongoDB e descobri que o MongoDB tem uma ótima compatibilidade com geometria espacial. Decidi usar o MongoDB porque ele é um ótimo banco não relacional para armazenar dados complexos e ainda manter um bom desempenho.
Houve uma dificuldade ao fazer os testes
de integração, pois tive que desenvolver uma forma de rodar o MongoDB de forma embutida e reativa nos testes. Utilizei a biblioteca `de.flapdoodle.embed.mongo`, porém tive que tentar várias formas de implementar a conexão com os testes. Consegui configurar e está funcionando corretamente.
Tive que criar alguns serializadores e deserializadores para o Jackson, porque queria que a resposta das requisições HTTP fosse idêntica ao exemplo dado no desafio.
Outros detalhes do desafio que não deixei passar foram a questão do campo `document`, que foi exigido ser um campo único. Nos dados disponibilizados, havia inconsistências como documentos com máscara (tinha CNPJ/CPF com e sem máscara). Decidi armazenar esses campos sem máscara em formato de string.
Deixarei alguns links de sites que pesquisei sobre GeoJSON que foram úteis no processo de desenvolvimento desta aplicação.
#### Erro em testes
Caso ocorra um erro nos testes, pode ser por causa do Embedded Mongo. Verifique se há um processo com o nome `mongod` e finalize-o.### Referências
* [GeoJSON (wikipedia)](https://en.wikipedia.org/wiki/GeoJSON)
* [MongoDB GeoSpatial Support (baeldung)](https://baeldung.com/mongodb-geospatial-support)
* [MongoDB GeoSpatial (spring reference)](https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.geospatial)
* [Flapdoodle Embed Mongo (github)](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo)