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.
A solução desse desafio é extremamente importante para entendermos os seus requisitos de qualidade, organização do seu código, performance, portabilidade, etc.
Sinta-se à vontade para escolher a tecnologia e ferramentas que achar necessário. Queremos ser surpreendidos pela sua abordagem no desafio!
Temos apenas dois pré-requisitos: código testado e pronto para produção.
Topa? 😁
Recebemos insumos de clientes via arquivo CSV das empresas participantes todo mês, contudo, recebemos de alguns no formato JSON.
Exemplo do CSV:
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
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
Exemplo do JSON:
{"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"}}
Precisamos aplicar nossa regra de negócio a fim de casar com necessidades internas da Juntos Somos+.
Costumamos trabalhar com os clientes pelas 5 regiões do país:
- Norte
- Nordeste
- Centro-Oeste
- Sudeste
- Sul
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:
- ESPECIAL
minlon: -2.196998
minlat -46.361899
maxlon: -15.411580
maxlat: -34.276938
minlon: -19.766959
minlat -52.997614
maxlon: -23.966413
maxlat: -44.428305
- NORMAL
minlon: -26.155681
minlat -54.777426
maxlon: -34.016466
maxlat: -46.603598
- TRABALHOSO: Qualquer outro usuário que não se encaixa nas regras acima.
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:
- Transformar os contatos telefônicos no formato E.164. Exemplo: (86) 8370-9831 vira +558683709831.
- Inserir a nacionalidade. Como todos os clientes ainda são do brasil, o valor padrão será BR.
- Alterar o valor do campo
gender
paraF
ouM
em vez defemale
oumale
. - Retirar o campo
age
dedob
eregistered
. - Alterar estrutura para simplificar leitura e usar arrays em campos específicos (ver exemplo abaixo)
Exemplo de contrato de OUTPUT:
{
"type": "laborious"
"gender": "m",
"name": {
"title": "mr",
"first": "quirilo",
"last": "nascimento"
},
"location": {
"region": "sul"
"street": "680 rua treze ",
"city": "varginha",
"state": "paraná",
"postcode": 37260,
"coordinates": {
"latitude": "-46.9519",
"longitude": "-57.4496"
},
"timezone": {
"offset": "+8:00",
"description": "Beijing, Perth, Singapore, Hong Kong"
}
},
"email": "quirilo.nascimento@example.com",
"birthday": "1979-01-22T03:35:31Z",
"registered": "2005-07-01T13:52:48Z",
"telephoneNumbers": [
"+556629637520"
],
"mobileNumbers": [
"+553270684089"
],
"picture": {
"large": "https://randomuser.me/api/portraits/men/83.jpg",
"medium": "https://randomuser.me/api/portraits/med/men/83.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/men/83.jpg"
},
"nationality": "BR"
}
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.
É 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.
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:
{
pageNumber: X,
pageSize: P,
totalCount: T,
users: [
...
]
}
Imagine que essa API seja possa ser acessada por consumidores específicos, então coloque o que mais achar necessário.
Use como input os links abaixo (~1000 registros cada):
- https://storage.googleapis.com/juntossomosmais-code-challenge/input-backend.csv
- https://storage.googleapis.com/juntossomosmais-code-challenge/input-backend.json
O arquivo 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.
Você deve disponibilizar seu código em seu repositório do Github e manter o repositório como privado.
É obrigatório ter um README com todas as instruções sobre o seu desafio.
Assim que finalizar, nos avise pelo e-mail vagas-dev@juntossomosmais.com.br com:
- Assunto: [Back-end Developer] Seu Nome;
- Link do repositório para testes
- Informações sobre você: Github, LinkedIn e o que mais achar relevante.
Em seguinda enviaremos o(s) usuário(s) do github que você deve liberar acesso ao código.
O prazo para envio é de 7 dias, mas se precisar de mais tempo é só nos avisar 😊
Se a sua vaga for específica para front-end, veja este outro desafio.