Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/juntossomosmais/code-challenge

Conheça nosso desafio para trabalhar conosco como engenheiro de software
https://github.com/juntossomosmais/code-challenge

apps back-end code-challenge csharp full-stack java javascript kotlin nodejs python

Last synced: 6 days ago
JSON representation

Conheça nosso desafio para trabalhar conosco como engenheiro de software

Awesome Lists containing this project

README

        

# Code Challenge Juntos Somos+

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? 😁

# O desafio

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,[email protected],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çã[email protected]","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+.

## Regras de negócio que você precisa implementar

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:

1. Transformar os contatos telefônicos no formato [E.164](https://en.wikipedia.org/wiki/E.164). Exemplo: (86) 8370-9831 vira +558683709831.
2. Inserir a nacionalidade. Como todos os clientes ainda são do brasil, o valor padrão será BR.
3. Alterar o valor do campo `gender` para `F` ou `M` em vez de `female` ou `male`.
4. Retirar o campo `age` de `dob` e `registered`.
5. Alterar estrutura para simplificar leitura e usar arrays em campos específicos (ver exemplo abaixo)

Exemplo de contrato de OUTPUT:

```json
{
"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": "[email protected]",
"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"
}

```

## Faça uma API

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

## Validação

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.

# Como entregar

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 [email protected] 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 😊

## Outros desafios

Se a sua vaga for específica para front-end, veja [este outro desafio](https://github.com/juntossomosmais/frontend-challenge).