{"id":24544339,"url":"https://github.com/cristian-sknz/ze_code_challenge","last_synced_at":"2025-09-09T06:41:02.342Z","repository":{"id":170767490,"uuid":"647002951","full_name":"Cristian-Sknz/ze_code_challenge","owner":"Cristian-Sknz","description":"Um serviço que implementa funcionalidades de GeoLocalização e gerenciamento de parceiros.","archived":false,"fork":false,"pushed_at":"2023-05-29T21:17:05.000Z","size":336,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-16T08:26:23.844Z","etag":null,"topics":["code-challenge","geo-spatial","spring-framework"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Cristian-Sknz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-29T21:04:39.000Z","updated_at":"2023-07-28T00:32:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"d58c82d4-649b-423c-9918-b89368d673bc","html_url":"https://github.com/Cristian-Sknz/ze_code_challenge","commit_stats":null,"previous_names":["cristian-sknz/ze_code_challenge"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Cristian-Sknz/ze_code_challenge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cristian-Sknz%2Fze_code_challenge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cristian-Sknz%2Fze_code_challenge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cristian-Sknz%2Fze_code_challenge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cristian-Sknz%2Fze_code_challenge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Cristian-Sknz","download_url":"https://codeload.github.com/Cristian-Sknz/ze_code_challenge/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cristian-Sknz%2Fze_code_challenge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274255022,"owners_count":25250552,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-09T02:00:10.223Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-challenge","geo-spatial","spring-framework"],"created_at":"2025-01-22T20:29:40.289Z","updated_at":"2025-09-09T06:41:02.312Z","avatar_url":"https://github.com/Cristian-Sknz.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cdiv\u003e\n    \u003cimg width=\"190px\" src=\".github/Ze_logo.png\" alt=\"logo\"/\u003e\n    \u003ch1 align=\"center\"\u003eZé Code Challenge\u003c/h1\u003e\n  \u003c/div\u003e\n\t\u003ch2\u003e\u003ca href=\"https://github.com/ZXVentures/ze-code-challenges/blob/master/backend_pt.md\"\u003eDesafio Backend Zé Delivery\u003c/a\u003e\u003c/h2\u003e\n\t\u003cp\u003eUm serviço que implementa funcionalidades de Geo Localização e gerenciamento de parceiros.\u003c/p\u003e\n\u003c/div\u003e\n\n---\n\n## Projeto\n\nEste é 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.\n\n\u003e Mais adiante, falarei sobre como este projeto foi desenvolvido.\n\n### Rotas da aplicação\n\nOs 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.\n\n| Método | Rota                | Descrição                                                                                                     |\n|--------|---------------------|---------------------------------------------------------------------------------------------------------------|\n| GET    | /partner            | Retorna todos os parceiros cadastrados (com paginação)                                                        |\n| POST   | /partner            | Cria um novo parceiro de acordo com os dados passados                                                         |\n| GET    | /partner/{id}       | Retorna um parceiro pelo ID (numérico)                                                                        |\n| GET    | /partner/{document} | Retorna um parceiro pelo documento (CPF ou CNPJ)                                                              |\n| DELETE | /partner/{id}       | Deleta um parceiro pelo ID (numérico)                                                                         |\n| GET    | /partner/nearby     | Retorna o(s) parceiro(s) mais próximo(s) da localização solicitada pelos parâmetros `longitude` e `latitude` |\n\n\nDecidi aprimorar as rotas solicitadas no desafio, adicionando parâmetros para uma busca mais personalizável e flexível.\n\n| Rota            | Parâmetro   | Descrição                                                                                                                                                |\n|-----------------|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|\n| /partner/{id}   | ?type       | Por padrão, definido como ID. Este parâmetro sinaliza se a pesquisa será por ID ou Documento (`type=document`).                                          |\n| /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`). |\n| /partner/nearby | ?kilometers | Por padrão, não é definido. Este parâmetro de pesquisa serve para filtrar parceiros em um raio por quilômetros.                                          |\n\n## Iniciar o ambiente\n\nPara poder executar o ambiente inteiro, você precisará atender a alguns requisitos:\n* Java 17+\n* Gradle 7.6.1 ou mais recente\n* Docker\n* Docker-compose\n\nApó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.\n\nCom o build realizado, só resta executar o projeto com o docker-compose, usando o comando `docker-compose up -d`.\n\nA aplicação está configurada corretamente e \"pronta\" para produção, sem necessidade de configurações adicionais.\n\n---\n\n## Conclusão\n\nEste 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.\n\nHouve uma dificuldade ao fazer os testes\n\n 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.\n\nTive 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.\n\nOutros 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.\n\nDeixarei alguns links de sites que pesquisei sobre GeoJSON que foram úteis no processo de desenvolvimento desta aplicação.\n\n#### Erro em testes\nCaso ocorra um erro nos testes, pode ser por causa do Embedded Mongo. Verifique se há um processo com o nome `mongod` e finalize-o.\n\n### Referências\n* [GeoJSON (wikipedia)](https://en.wikipedia.org/wiki/GeoJSON)\n* [MongoDB GeoSpatial Support (baeldung)](https://baeldung.com/mongodb-geospatial-support)\n* [MongoDB GeoSpatial (spring reference)](https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.geospatial)\n* [Flapdoodle Embed Mongo (github)](https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcristian-sknz%2Fze_code_challenge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcristian-sknz%2Fze_code_challenge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcristian-sknz%2Fze_code_challenge/lists"}