Nessa etapa você deverá construir uma API Restful com as melhores práticas de desenvolvimento.
Obrigatório 1 - Você deverá atender aos seguintes casos de uso:
- Como usuário, devo ser capaz de realizar login com usuário e senha
- Como usuário, devo ser capaz de visualizar a lista de palavras do dicionário
- Como usuário, devo ser capaz de guardar no histórico palavras já visualizadas
- Como usuário, devo ser capaz de visualizar o histórico de palavras já visualizadas
- Como usuário, deve ser capaz de guardar uma palavra como favorita
- Como usuário, deve ser capaz de apagar uma palavra favorita
- Internamente, a API deve fazer proxy da Words API, pois assim o front irá acessar somente a sua API
Obrigatório 2 - Você deverá desenvolver as seguintes rotas com suas requisições e respostas:
[GET] /
Retornar a mensagem "Fullstack Challenge 🏅 - Dictionary"
{
"message": "Fullstack Challenge 🏅 - Dictionary"
}
[POST] /auth/signup
{
"name": "User 1",
"email": "[email protected]",
"password": "test"
}
{
"id": "f3a10cec013ab2c1380acef",
"name": "User 1",
"token": "Bearer JWT.Token"
}
[POST] /auth/signin
{
"email": "[email protected]",
"password": "test"
}
{
"id": "f3a10cec013ab2c1380acef",
"name": "User 1",
"token": "Bearer JWT.Token"
}
[GET] /entries/en
Retornar a lista de palavras do dicionário, com paginação e suporte a busca. O endpoint de paginação de uma busca hipotética deve retornar a seguinte estrutura:
[GET]/entries/en?search=fire&limit=4
{
"results": [
"fire",
"firefly",
"fireplace",
"fireman"
],
"totalDocs": 20,
"page": 1,
"totalPages": 5,
"hasNext": true,
"hasPrev": false
}
[GET] /entries/en/:word
Retornar as informações da palavra especificada e registra o histórico de acesso.
[POST] /entries/en/:word/favorite
Salva a palavra na lista de favoritas (retorno de dados no body é opcional)
[DELETE] /entries/en/:word/unfavorite
Remover a palavra da lista de favoritas (retorno de dados no body é opcional)
[GET] /user/me
Retornar o perfil do usúario
[GET] /user/me/history
Retornar a lista de palavras visitadas
{
"results": [
{
"word": "fire",
"added": "2022-05-05T19:28:13.531Z"
},
{
"word": "firefly",
"added": "2022-05-05T19:28:44.021Z"
},
{
"word": "fireplace",
"added": "2022-05-05T19:29:28.631Z"
},
{
"word": "fireman",
"added": "2022-05-05T19:30:03.711Z"
}
],
"totalDocs": 20,
"page": 2,
"totalPages": 5,
"hasNext": true,
"hasPrev": true
}
[GET] /user/me/favorites
Retornar a lista de palavras marcadas como favoritas
{
"results": [
{
"word": "fire",
"added": "2022-05-05T19:30:23.928Z"
},
{
"word": "firefly",
"added": "2022-05-05T19:30:24.088Z"
},
{
"word": "fireplace",
"added": "2022-05-05T19:30:28.963Z"
},
{
"word": "fireman",
"added": "2022-05-05T19:30:33.121Z"
}
],
"totalDocs": 20,
"page": 2,
"totalPages": 5,
"hasNext": true,
"hasPrev": true
}
Além disso, os endpoints devem utilizar os seguintes códigos de status:
- 200: sucesso com body ou sem body
- 204: sucesso sem body
- 400: mensagem de erro em formato humanizado, ou seja, sem informações internas e códigos de erro:
{
"message": "Error message"
}
Obrigatório 3 - Você deve criar um script para baixar a lista de palavras do repositório e importar estas palavras para o banco de dados. A API não possui endpoint com a lista de palavras. Para criar seu endpoint será necessário alimentar o seu banco de dados com o arquivo existente dentro do projeto no Github.
Obrigatório 4 - Salvar em cache o resultado das requisições a API, para agilizar a resposta em caso de buscas com parâmetros repetidos. Sugestões são usar o Redis e/ou MongoDB;
O cache pode ser feito a guardar todo o corpo das respostas ou para guardar o resultado das queries do banco. Para identificar a presença de cache, será necessário adicionar os seguintes headers nas respostas:
- x-cache: valores HIT (retornou dados em cache) ou MISS (precisou buscar no banco)
- x-response-time: duração da requisição em milissegundos
Diferencial 1 - Descrever a documentação da API utilizando o conceito de Open API 3.0;
Diferencial 2 - Escrever Unit Tests para os endpoints da API;
Diferencial 3 - Configurar Docker no Projeto para facilitar o Deploy da equipe de DevOps;
Diferencial 4 - Deploy em algum servidor, com ou sem automatização do CI.
Diferencial 5 - Implementar paginação com cursores ao inves de usar page e limit . Ao realizar este diferencial, o retorno dos endpoints deve possuir a seguinte estrutura:
{
"results": [
"fire",
"firefly",
"fireplace",
"fireman"
],
"totalDocs": 20,
"previous": "eyIkb2lkIjoiNTgwZmQxNmjJkOGI5In0",
"next": "eyIkb2lkIjoiNTgwZmQxNm1NjJkOGI4In0",
"hasNext": true,
"hasPrev": true,
}
- Deve conter o título do projeto
- Uma descrição sobre o projeto em frase
- Deve conter uma lista com linguagem, framework e/ou tecnologias usadas
- Como instalar e usar o projeto (instruções)
- Não esqueça o .gitignore
- Se está usando github pessoal, referencie que é um challenge by coodesh:
This is a challenge by Coodesh
- Adicione o link do repositório com a sua solução no teste
- Verifique se o Readme está bom e faça o commit final em seu repositório;
- Envie e aguarde as instruções para seguir. Caso o teste tenha apresentação de vídeo, dentro da tela de entrega será possível gravar após adicionar o link do repositório. Sucesso e boa sorte. =)
Para tirar dúvidas sobre o processo envie uma mensagem diretamente a um especialista no chat da plataforma.