Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 114 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,127 @@
![PicPay](https://user-images.githubusercontent.com/1765696/26998603-711fcf30-4d5c-11e7-9281-0d9eb20337ad.png)
# Example Java Spring Boot API

# Teste Backend
## Prerequisites

O desafio é criar uma API REST que busca usuarios pelo nome e username a partir de uma palavra chave. Faça o download do arquivo [users.csv.gz](https://s3.amazonaws.com/careers-picpay/users.csv.gz) que contém o banco de dados que deve ser usado na busca. Ele contém os IDs, nomes e usernames dos usuários.
Docker

###### Exemplo
| ID | Nome | Username |
|--------------------------------------|-------------------|----------------------|
| 065d8403-8a8f-484d-b602-9138ff7dedcf | Wadson marcia | wadson.marcia |
| 5761be9e-3e27-4be8-87bc-5455db08408 | Kylton Saura | kylton.saura |
| ef735189-105d-4784-8e2d-c8abb07e72d3 | Edmundo Cassemiro | edmundo.cassemiro |
| aaa40f4e-da26-42ee-b707-cb81e00610d5 | Raimundira M | raimundiram |
| 51ba0961-8d5b-47be-bcb4-54633a567a99 | Pricila Kilder | pricilakilderitaliani|
## Installing

Baixe este projeto. No prompt de comando, acesse o diretório do projeto e execute o comando para subir os containers:

```
$ docker-compose up --build
```

Também são fornecidas duas listas de usuários que devem ser utilizadas para priorizar os resultados da busca. A lista 1 tem mais prioridade que a lista 2. Ou seja, se dois usuarios casam com os criterios de busca, aquele que está na lista 1 deverá ser exibido primeiro em relação àquele que está na lista 2. Os que não estão em nenhuma das listas são exibidos em seguida.
O Docker realizará o download do Banco de Dados remoto disponibilizado (cerca de 500mb). Dependendo da velocidade da internet, realizar o download e subir os containers poderá demorar de 30 a 40 minutos.
Aguarde a execução da aplicação. Ao final, o sistema irá retornar uma mensagem nos logs:
```
Started ExampleApiApplication in x seconds
```

As listas podem ser encontradas na raiz deste repositório ([lista_relevancia_1.txt](lista_relevancia_1.txt) e [lista_relevancia_2.txt](lista_relevancia_2.txt)).
Os resultados devem ser retornados paginados de 15 em 15 registros.
Este procedimento deverá levar alguns minutos devido às migrações executadas para o banco de dados da aplicação.

Escolha as tecnologias que você vai usar e tente montar uma solução completa para rodar a aplicação.
## Getting Started

Faça um ***Fork*** deste repositório e abra um ***Pull Request***, **com seu nome na descrição**, para participar. Assim que terminar, envie um e-mail para ***desafio@picpay.com*** com o seu usuário do Github nos avisando.
Para ter acesso aos serviços criados para este teste, utilize a URL abaixo para importar o projeto no Postman e realizar através dele as requisições necessárias para teste.
Todas as requisições já estarão pré criadas, necessitando apenas a solicitação de um novo token para autenticação.
```
https://www.getpostman.com/collections/850a6e83659cebf54efa
```

-----
## Running the tests

### Diferenciais
Realizar um POST na seguinte URL:

- Criar um frontend para realizar a busca com uma UX elaborada
- Criar uma solução de autenticação entre o frontend e o backend
- Ter um desempenho elevado num conjunto de dados muito grande
- Utilizar o Docker
```
http://localhost:8083/oauth/token
```

### Authorization

Utilizar a Basic Auth com as seguintes informações:
* Username = my-frontend
* Password = myFr0nt3nd


O corpo da requisição (Content-Type: application/x-www-form-urlencoded) deverá conter as seguintes informações (key=value):
* client = my-frontend
* username = admin
* password = admin
* grant_type = password

O sistema retornará um "access_token", que deverá ser utilizado como autenticação (Bearer Token) nas requisições de busca de pessoas:
```
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSJdLCJleHAiOjE1NDQ0MTIwOTYsImF1dGhvcml0aWVzIjpbIlJPTEVfU0VBUkNIX1BFUlNPTiJdLCJqdGkiOiI5NGE3ZDQ4OC0yZjAwLTRiNDktYmVkNC02YjI4ZjcyMTM4YmQiLCJjbGllbnRfaWQiOiJteS1mcm9udGVuZCIsInVzZXJuYW1lIjoiYWRtaW4ifQ.gQDucn1CuAiyKrnvSfLJlvYVocTw21TkPZb3Nl2eEsk",
"token_type": "bearer",
"expires_in": 3599,
"scope": "read write",
"username": "admin",
"jti": "94a7d488-2f00-4b49-bed4-6b28f72138bd"
}
```

### Renew Token

Ao obter a mensagem de token expirado, basta enviar um POST para a mesma URL, porém o corpo da requisição (Content-Type: application/x-www-form-urlencoded) deverá conter apenas:
* grant_type = refesh_token

### Search Users

Realizar um GET com a seguinte URL:

```
http://localhost:8083/people?searchString=
```

Para passar uma String de busca, basta preencher o parâmetro searchString com o valor desejado.
O sistema retornará a primeira página de resultados.

A lista de prioridades foi incorporada à tabela de pessoas e o valor da prioridade também será retornada no resultado busca.

```
{
"content": [
{
"id": "6e172695-c76c-4364-8dd9-44e6d2d3aed9",
"name": "Heitor Rovaron",
"username": "heitor.rovaron",
"priority": null
}
],
"pageable": {
"sort": {
"unsorted": true,
"sorted": false,
"empty": true
},
"pageSize": 15,
"pageNumber": 0,
"offset": 0,
"paged": true,
"unpaged": false
},
"totalPages": 1,
"totalElements": 1,
"last": true,
"first": true,
"sort": {
"unsorted": true,
"sorted": false,
"empty": true
},
"numberOfElements": 1,
"size": 15,
"number": 0,
"empty": false
}
```

## Stopping Containers

Para parar os containers em execução:

```
$ docker-compose stop
```

25 changes: 25 additions & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
Binary file added app/.mvn/wrapper/maven-wrapper.jar
Binary file not shown.
1 change: 1 addition & 0 deletions app/.mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
17 changes: 17 additions & 0 deletions app/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#FROM alpine:3.8 as dwnldr
#
#RUN apk --update add wget \
# gzip

#RUN wget "http://res.cloudinary.com/dbgv8nukd/raw/upload/v1537738980/picpay/users.csv.gz"
#RUN wget "https://s3.amazonaws.com/careers-picpay/users.csv.gz"

#RUN gunzip users.csv.gz
#RUN cp users.csv /tmp
#RUN mv users.csv /tmp

FROM maven:3.5-jdk-8

#COPY --from=dwnldr /tmp /tmp

#RUN ls /tmp
Loading