Você está na página 1de 12

TESTE DE FULL STACK PHP (API)

A proposta desse teste para o candidato é o desenvolvimento de uma API RestFUL para ser
consumida por um frontend que será desenvolvido para controlar os eventos dos usuários, deverá
ser utilizado laravel, PostgreSQL e redis e serão avaliados características como legibilidade do
código, boa documentação do código e versionamento, abstração de classes, técnicas avançadas de
desenvolvimento, entre outras características.

Requisitos

- Deverá criar um repositório público no github.

- Cada arquivo novo criado deverá ser executado commit com a devida descrição e push.

- A cada 30 minutos de desenvolvimento deverá ser executado commit com a devida descrição do
que foi desenvolvido no período e push.

- O banco de dados deve ser PostgreSQL e a criação das tabelas deve ser usando o Migrations do
laravel

- Deve ser cadastrado um usuário inicial usando Seeding do laravel com os seguintes dados:
Nome: Administrador do Sistema
E-mail: administrador@sistema.com.br
Telefone: (85) 9.8888-7777
Data de Nascimento: 27/04/1995
Senha: Imts@2019

- O token de acesso deve ser gerado usando JWT.


https://jwt.io

- O token de acesso deve ser ARMAZENADO e CONSULTADO no REDIS


https://redis.io

- O token de acesso deverá ter validade de até 1 hora.

- Os e-mails da API deverão ser enviados através do Mailtrap


https://mailtrap.io

- Toda rota privada deverá passar pelo middleware IsLogged que deverá ser criado para com a
finalidade de verificar aos três seguintes requisitos:
1 - O usuário está logado (token no redis)
2 - A assinatura do token é válida
3 - O token está dentro do prazo de expiração, caso não atenda a, deve retornar a seguinte resposta:
CÓDIGO HTTP 401
BODY {title: 'Oops!', message: 'Token inválido'}.

- A resposta de erro padrão deve ser a seguinte:


CÓDIGO HTTP 400.
BODY {title: 'Oops!', message: 'O servidor se comportou de forma inexperada, contate o
administrador.'}
- O padrão de senhas do sistema deve ser entre 6 e 8 caracteres, contendo pelo menos uma letra
minuscula [a-z], uma letra maiúscula [A-Z], um número [0-9] e um caractere especial com exceção
de aspas simples ou duplas.
Exemplo: imtS@19
SERVIÇO DE AUTENTICAÇÃO DO USUÁRIO

Request:
Endpoint: /login
Method: POST
Body: {email: string, password: string}
Response Success:
Code: 200
Body: {message: 'Olá <NOME_USUARIO>, seja bem vindo ao sistema.'}
Response Error:
Code: 400
Body: {title: 'Oops!', message: 'Usuário ou senha inválidos'}
SERVIÇO DE RECUPERAÇÃO DE SENHA
Request:
Endpoint: /recovery-password
Method: POST
Body: {email: string}
Response Success:
Code: 200
Body: {message: 'Olá <NOME_USUARIO>, enviamos uma nova senha para seu e-mail.'}
Response Error:
Padrão

Requisitos
- Quando solicitada a recuperação de senha, a api deverá criar uma nova senha seguindo o padrão
de senhas da api e enviá-la por e-mail.
- Após gerada a senha, deverá manter a senha antiga e a atual salva para seguir os seguintes fluxos
1 - Se o usuário se logar com a senha antiga, a senha nova deverá ser apagada e no próximo acesso
só será possível se logar usando a senha antiga desconsiderando assim a senha nova.
2 - Se o usuário se logar com a nova senha, deverá sobrescrever a senha antiga e no próximo acesso
só será possível se logar usando a senha nova desconsiderando assim a senha antiga.
SERVIÇO DE LISTAGEM DE USUÁRIO

Request:
Endpoint: /user
Method: GET
Response Success:
Code: 200
Body:
{
"pagination": {
"page": {
"current": 1,
"last": 1
},
"rows": {
"from": 1,
"to": 2
}
},
"rows": [
{
"id": 1,
"name": "Maria",
"email": "maria@imts.com.br",
"birthday": "06/09/1990",
"phone": "85987321564"
},
{
"id": 2,
"name": "José",
"email": "jose@imts.com.br",
"birthday": "09/06/1990",
"phone": "85987146547"
}
]
}
Response Error:
Padrão

Requisitos
- Deve ser possível paginar o resultados informando a página atual e a quantidade de registros que
deve ser retornado.
- Deve ser possível pesquisar por qualquer parte do nome, e-mail ou telefone
- Deve ser possível pesquisar por data de nascimento informando um intervalo de datas.
SERVIÇO DE CADASTRO DE USUÁRIO

Request:
Endpoint: /user
Method: POST
Body: {name: string, email: string, birthday: date, phone: string, password: string}
Response Success:
Code: 200
Body: {message: 'Usuário inserido com sucesso'}
Response Error:
Padrão

Requisitos
- Todos os campos são obrigatórios
SERVIÇO DE EDIÇÃO DE USUÁRIO

Request:
Endpoint: /user/{id}
Method: PUT
Body: {name: string, e-mail: string, birthday: date, phone: string, password: string}
Response Success:
Code: 200
Body: {message: 'Usuário atualizado com sucesso'}
Response Error:
Padrão

Requisitos
- Todos os campos são obrigatórios
SERVIÇO DE REMOÇÃO DE USUÁRIO

Request:
Endpoint: /user/{id}
Method: DELETE
Response Success:
Code: 200
Body: {message: 'Usuário removido com sucesso'}
Response Error:
Padrão

Requisitos
- Um usuário só poderá ser removido se o mesmo não possuir nenhum evento cadastrado.
SERVIÇO DE LISTAGEM DE EVENTO

Request:
Endpoint: /event
Method: GET
Response Success:
Code: 200
Body:
{
"pagination": {
"page": {
"current": 1,
"last": 1
},
"rows": {
"from": 1,
"to": 2
}
},
"rows": [
{
"id": 1,
"responsible": "Francisco",
"title": "Aniversário do João",
"description": "Aniversário do João",
"start": "06/09/1990 08:00",
"end": "06/09/1990 10:00"
},
{
"id": 2,
"responsible": "Maria",
"title": "Reunião",
"description": "Reunião",
"start": "06/09/2019 08:00",
"end": "06/09/ 2019 10:00"
}
]
}
Response Error:
Padrão

Requisitos
- Deve ser possível paginar o resultados informando a página atual e a quantidade de registros que
deve ser retornado.
- Deve ser possível pesquisar por qualquer parte do título;
- Deve ser possível pesquisar por responsável.
- Deve ser possível pesquisar por data de início informando um intervalo de datas.
Serviço de CADASTRO de evento

Request:
Endpoint: /event
Method: POST
Body: {title: string, description: string, responsible: int, start: datetime, end: datetime}
Response Success:
Code: 200
Body: {message: 'Evento inserido com sucesso'}
Response Error:
Padrão

Requisitos
- Os campos obrigatórios são title e start
- Ao ser cadastrado um evento e se um responsável for informado, deverá disparar um e-mail para o
responsável.
Serviço de EDIÇÃO de evento

Request:
Endpoint: /event/{id}
Method: PUT
Body: {title: string, description: string, responsible: int, start: datetime, end: datetime}
Response Success:
Code: 200
Body: {message: 'Evento inserido com sucesso'}
Response Error:
Padrão

Requisitos
- Os campos obrigatórios são title e start
Serviço de REMOÇÃO de evento

Request:
Endpoint: /event/{id}
Method: DELETE
Response Success:
Code: 200
Body: {message: 'Evento removido com sucesso'}
Response Error:
Padrão

Você também pode gostar