├── README.md └── validate.sh /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Code Challenge Juntos Somos+ 3 | 4 | O objetivo desse code challenge é, mais do que seu currículo, formação e certificações, avaliarmos como você lida com esse desafio, quais ferramentas escolhe, a qualidade do seu código e a maneira de pensar nele. 5 | 6 | A solução desse desafio é extremamente importante para entendermos os seus requisitos de qualidade, organização do seu código, performance, portabilidade, etc. 7 | 8 | O desafio deve ser feito em Python ou C#, de acordo com a vaga do processo seltivo. Sinta-se à vontade para escolher as ferramentas que achar necessário. Queremos ser surpreendidos pela sua abordagem no desafio! 9 | 10 | Temos apenas dois pré-requisitos: código testado e pronto para produção. 11 | 12 | Topa? 😁 13 | 14 | # O desafio 15 | 16 | Recebemos insumos de clientes via arquivo CSV das empresas participantes todo mês, contudo, recebemos de alguns no formato JSON. 17 | 18 | Exemplo do CSV: 19 | 20 | ``` 21 | gender,name.title,name.first,name.last,location.street,location.city,location.state,location.postcode,location.coordinates.latitude,location.coordinates.longitude,location.timezone.offset,location.timezone.description,email,dob.date,dob.age,registered.date,registered.age,phone,cell,picture.large,picture.medium,picture.thumbnail 22 | male,mr,joselino,alves,2095 rua espirito santo ,são josé de ribamar,paraná,96895,-35.8687,-131.8801,-10:00,Hawaii,joselino.alves@example.com,1996-01-09T02:53:34Z,22,2014-02-09T19:19:32Z,4,(97) 0412-1519,(94) 6270-3362,https://randomuser.me/api/portraits/men/75.jpg,https://randomuser.me/api/portraits/med/men/75.jpg,https://randomuser.me/api/portraits/thumb/men/75.jpg 23 | ``` 24 | Exemplo do JSON: 25 | 26 | ``` 27 | {"gender":"male","name":{"title":"mr","first":"antonelo","last":"da conceição"},"location":{"street":"8986 rua rui barbosa ","city":"santo andré","state":"alagoas","postcode":40751,"coordinates":{"latitude":"-69.8704","longitude":"-165.9545"},"timezone":{"offset":"+1:00","description":"Brussels, Copenhagen, Madrid, Paris"}},"email":"antonelo.daconceição@example.com","dob":{"date":"1956-02-12T10:38:37Z","age":62},"registered":{"date":"2005-12-05T15:22:53Z","age":13},"phone":"(85) 8747-8125","cell":"(87) 2414-0993","picture":{"large":"https://randomuser.me/api/portraits/men/8.jpg","medium":"https://randomuser.me/api/portraits/med/men/8.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/8.jpg"}} 28 | ``` 29 | 30 | Precisamos aplicar nossa regra de negócio a fim de casar com necessidades internas da Juntos Somos+. 31 | 32 | ## Regras de negócio que você precisa implementar 33 | 34 | Costumamos trabalhar com os **clientes pelas 5 regiões do país**: 35 | 36 | - Norte 37 | - Nordeste 38 | - Centro-Oeste 39 | - Sudeste 40 | - Sul 41 | 42 | Como a concentração de consultores nossos é mais forte em alguns pontos, dependendo da localidade do cliente pode ficar mais fácil nosso time atendê-lo. Considere os pontos abaixo **(bounding box) para classificá-lo de acordo com os rótulos**: 43 | 44 | - **ESPECIAL** 45 | 46 | ``` 47 | minlon: -2.196998 48 | minlat -46.361899 49 | maxlon: -15.411580 50 | maxlat: -34.276938 51 | ``` 52 | ``` 53 | minlon: -19.766959 54 | minlat -52.997614 55 | maxlon: -23.966413 56 | maxlat: -44.428305 57 | ``` 58 | 59 | - **NORMAL** 60 | 61 | ``` 62 | minlon: -26.155681 63 | minlat -54.777426 64 | maxlon: -34.016466 65 | maxlat: -46.603598 66 | ``` 67 | 68 | - **TRABALHOSO:** Qualquer outro usuário que não se encaixa nas regras acima. 69 | 70 | Outro ponto é que temos intenção de expandir os serviços para outros países, então **quanto mais genérico o cadastro, melhor**. Infelizmente os registros CSVs e JSONs não estão 100% prontos. Para melhorá-los, precisamos: 71 | 72 | 1. Transformar os contatos telefônicos no formato [E.164](https://en.wikipedia.org/wiki/E.164). Exemplo: (86) 8370-9831 vira +558683709831. 73 | 2. Inserir a nacionalidade. Como todos os clientes ainda são do brasil, o valor padrão será BR. 74 | 3. Alterar o valor do campo `gender` para `F` ou `M` em vez de `female` ou `male`. 75 | 4. Retirar o campo `age` de `dob` e `registered`. 76 | 5. Alterar estrutura para simplificar leitura e usar arrays em campos específicos (ver exemplo abaixo) 77 | 78 | Exemplo de contrato de OUTPUT: 79 | 80 | ```json 81 | { 82 | "type": "laborious" 83 | "gender": "m", 84 | "name": { 85 | "title": "mr", 86 | "first": "quirilo", 87 | "last": "nascimento" 88 | }, 89 | "location": { 90 | "region": "sul" 91 | "street": "680 rua treze ", 92 | "city": "varginha", 93 | "state": "paraná", 94 | "postcode": 37260, 95 | "coordinates": { 96 | "latitude": "-46.9519", 97 | "longitude": "-57.4496" 98 | }, 99 | "timezone": { 100 | "offset": "+8:00", 101 | "description": "Beijing, Perth, Singapore, Hong Kong" 102 | } 103 | }, 104 | "email": "quirilo.nascimento@example.com", 105 | "birthday": "1979-01-22T03:35:31Z", 106 | "registered": "2005-07-01T13:52:48Z", 107 | "telephoneNumbers": [ 108 | "+556629637520" 109 | ], 110 | "mobileNumbers": [ 111 | "+553270684089" 112 | ], 113 | "picture": { 114 | "large": "https://randomuser.me/api/portraits/men/83.jpg", 115 | "medium": "https://randomuser.me/api/portraits/med/men/83.jpg", 116 | "thumbnail": "https://randomuser.me/api/portraits/thumb/men/83.jpg" 117 | }, 118 | "nationality": "BR" 119 | } 120 | 121 | ``` 122 | 123 | ## Faça uma API 124 | 125 | Pense em uma API que dada a **região do usuário** e seu **tipo de classificação**, responda a **listagem dos elegíveis**. Não existe routing definido para a aplicação, fica a seu gosto. 126 | 127 | É **obrigatório** trabalhar com toda manipulação dos dados **em memória**. O carregamento dos dados de input deve ser por meio de request HTTP **ao subir a sua aplicação**, ou seja, antes do seu App estar `ready`, você fará um request para os links fornecidos abaixo. 128 | 129 | Além da lista dos usuários elegíveis, para permitir navegação entre os registros, **deve ser implementado** os seguintes metadados de paginação: 130 | 131 | ``` 132 | { 133 | pageNumber: X, 134 | pageSize: P, 135 | totalCount: T, 136 | users: [ 137 | ... 138 | ] 139 | } 140 | ``` 141 | 142 | Imagine que essa API possa ser acessada por consumidores específicos, então coloque o que mais achar necessário. 143 | 144 | Use como input os links abaixo (~1000 registros cada): 145 | 146 | - https://storage.googleapis.com/juntossomosmais-code-challenge/input-backend.csv 147 | - https://storage.googleapis.com/juntossomosmais-code-challenge/input-backend.json 148 | 149 | ## Validação 150 | 151 | O arquivo [validate.sh](./validate.sh) contém um teste mínimo da chamada da API. O teste só será avaliado se a API for validada corretamente com esse script. 152 | 153 | 154 | # Como entregar 155 | 156 | Você deve disponibilizar seu código em seu repositório do Github e manter o repositório como privado. 157 | 158 | É obrigatório ter um **README** com todas as instruções sobre o seu desafio. 159 | 160 | Assim que finalizar, nos avise pelo e-mail vagas-dev@juntossomosmais.com.br com: 161 | 162 | - Assunto: [Back-end Developer] Seu Nome; 163 | - Link do repositório para testes 164 | - Informações sobre você: Github, LinkedIn e o que mais achar relevante. 165 | 166 | Em seguida enviaremos o(s) usuário(s) do github que você deve liberar acesso ao código. 167 | 168 | O prazo para envio é de 7 dias, mas se precisar de mais tempo é só nos avisar 😊 169 | 170 | ## Outros desafios 171 | 172 | Se a sua vaga for específica para front-end, veja [este outro desafio](https://github.com/juntossomosmais/frontend-challenge). 173 | -------------------------------------------------------------------------------- /validate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | API_URL="http://localhost:8080/api/v1/users?pageNumber=1&pageSize=10" 4 | 5 | # Make the API call and capture the response 6 | response=$(curl -s --location $API_URL) 7 | 8 | # Validate the response body structure using grep and awk 9 | if echo "$response" | grep -q '"pageNumber"' && \ 10 | echo "$response" | grep -q '"pageSize"' && \ 11 | echo "$response" | grep -q '"totalCount"' && \ 12 | echo "$response" | grep -q '2000' && \ 13 | echo "$response" | grep -q '"users"'; then 14 | echo "Response body is valid." 15 | else 16 | echo "Response body is invalid." 17 | fi --------------------------------------------------------------------------------