Nesse desafio, temos uma aplicação Node.js que está em processo de desenvolvimento mas que já possui os testes necessários para fazer toda a validação dos requisitos (você não deve mexer nos testes). Após algumas alterações no código da aplicação, parte dos testes deixaram de passar e agora só você pode resolver esse problema. Bora lá? 🚀
Essa aplicação realiza o CRUD (Create, Read, Update, Delete) de repositórios de projetos. Além disso, é possível dar likes em repositórios cadastrados, aumentando a quantidade de likes em 1 a cada vez que a rota é chamada.
A estrutura de um repositório ao ser criado é a seguinte:
{
id: uuid(),
title,
url,
techs,
likes: 0
}
Descrição de cada propriedade:
- id deve ser um uuid válido;
- title é o título do repositório (por exemplo "unform");
- url é a URL que aponta para o repositório (por exemplo "https://github.com/unform/unform");
- techs é um array onde cada elemento deve ser uma string com o nome de uma tecnologia relacionada ao repositório (por exemplo: ["react", "react-native", "form"]);
- likes é a quantidade de likes que o repositório recebeu (e que vai ser incrementada de 1 em 1 a cada chamada na rota de likes).
Note que a quantidade de likes deve sempre ser zero no momento de criação.
- Aqui eu crio um middleware para verificar se existe um repositório com o id passado na rota. Caso não exista, retorna um erro, caso exista, passa para o próximo middleware ou código enviando o
repositoryIndex
para utilização.
function middlewareFindRepositoryByIndex(request, response, next){
const { id } = request.params;
const repositoryIndex = repositories.findIndex(
(repository) => repository.id === id
);
if (repositoryIndex < 0) {
return response.status(404).json({
error: "Repository not found."
});
}
request.repositoryIndex = repositoryIndex;
return next();
}
- Adicionado o comando para incluir o objeto
repository
no arrayrepositories
.
app.post("/repositories", (request, response) => {
const { title, url, techs } = request.body;
const repository = {
id: uuid(),
title,
url,
techs,
likes: 0,
};
/*
A correção ocorreu aqui!
*/
repositories.push(repository);
return response.json(repository);
});
- Adicionado o middleware
middlewareFindRepositoryByIndex
para verificar se existe um repositório com o id passado na rota. Caso não exista, retorna um erro, caso exista, passa para o próximo middleware ou código enviando orepositoryIndex
para utilização. - Remoção do código antigo que buscava o repositório pelo id passado na rota.
- Ajustado código para utilizar o
repositoryIndex
passado pelo middlewaremiddlewareFindRepositoryByIndex
. - Removido código que fazia o update de todo o objeto
repository
e adicionado código que faz o update preservando o valor delikes
do objetorepository
.
app.put("/repositories/:id", middlewareFindRepositoryByIndex, (request, response) => {
const { id } = request.params;
const { title, url, techs } = request.body;
const { repositoryIndex } = request;
/*
A correção ocorreu aqui!
*/
const repository = {
id,
title,
url,
techs,
likes: repositories[repositoryIndex].likes,
};
repositories[repositoryIndex] = repository;
return response.json(repository);
});
- Adicionado o middleware
middlewareFindRepositoryByIndex
para verificar se existe um repositório com o id passado na rota. Caso não exista, retorna um erro, caso exista, passa para o próximo middleware ou código enviando orepositoryIndex
para utilização. - Remoção do código antigo que buscava o repositório pelo id passado na rota.
- Ajustado código para utilizar o
repositoryIndex
passado pelo middlewaremiddlewareFindRepositoryByIndex
.
app.delete("/repositories/:id", middlewareFindRepositoryByIndex, (request, response) => {
const { repositoryIndex } = request;
/*
A correção ocorreu aqui!
*/
repositories.splice(repositoryIndex, 1);
return response.status(204).send();
});
- Adicionado o middleware
middlewareFindRepositoryByIndex
para verificar se existe um repositório com o id passado na rota. Caso não exista, retorna um erro, caso exista, passa para o próximo middleware ou código enviando orepositoryIndex
para utilização. - Remoção do código antigo que buscava o repositório pelo id passado na rota.
- Ajustado código para utilizar o
repositoryIndex
passado pelo middlewaremiddlewareFindRepositoryByIndex
. - Ajustado retorno da rota para enviar um objeto
repository
com o valor delikes
incrementado em 1 no formato JSON.
app.post("/repositories/:id/like", middlewareFindRepositoryByIndex, (request, response) => {
const { repositoryIndex } = request;
/*
A correção ocorreu aqui!
*/
const likes = ++repositories[repositoryIndex].likes;
/*
A correção ocorreu aqui!
*/
return response.json({ likes: likes });
});