Ignite - Chapter II - Desafio 01 - Introdução ao SOLID.
Nesse desafio, você deverá criar uma aplicação para treinar o que aprendeu até agora no Node.js!
Essa será uma aplicação de listagem e cadastro de usuários. Para que a listagem de usuários funcione, o usuário que solicita a listagem deve ser um admin (mais detalhes ao longo da descrição).
Para realizar esse desafio, criamos para você esse modelo que você deve utilizar como um template do GitHub.
O template está disponível na seguinte URL:
rocketseat-education/ignite-template-introducao-ao-SOLID
Dica: Caso não saiba utilizar repositórios do GitHub como template, temos um guia em nosso FAQ.
Agora navegue até a pasta criada, abra no Visual Studio Code e execute o comando yarn
no seu terminal para instalar todas as dependências. A estrutura do seu projeto deve estar assim:
A rota deve receber name
, e email
dentro do corpo da requisição para que seja possível cadastrar um usuário.
A rota deve receber, nos parâmetros da rota, o id
de um usuário e transformar esse usuário em admin.
A rota deve receber, nos parâmetros da rota, o id
de um usuário e devolver as informações do usuário encontrado pelo corpo da resposta.
A rota deve receber, pelo header da requisição, uma propriedade user_id
contendo o id
do usuário e retornar uma lista com todos os usuários cadastrados. O id
deverá ser usado para validar se o usuário que está solicitando a listagem é um admin. O retorno da lista deve ser feito apenas se o usuário for admin.
Em cada teste, tem uma breve descrição no que sua aplicação deve cumprir para que o teste passe.
💡 Caso você tenha dúvidas quanto ao que são os testes, e como interpretá-los, dê uma olhada em **[nosso FAQ](https://www.notion.so/FAQ-Desafios-ddd8fcdf2339436a816a0d9e45767664)**Para esse desafio, temos os seguintes testes:
-
Should be able to create an user with all props
Para que esse teste passe, você deve completar o código do model de usuários que está em src/modules/users/model/User.ts. O usuário deve ter as seguintes propriedades:
{
id: string;
name: string;
admin: boolean;
email: string;
created_at: Date;
updated_at: Date;
}
Lembre que a propriedade admin
deve sempre ser iniciada como false
e o id
deve ser um uuid
gerado automaticamente.
-
Should be able to create new users
Para que esse teste passe, é necessário que o método
create
do arquivo src/modules/users/repositories/implementations/UsersRepository permita receber oname
eemail
de um usuário, crie um usuário a partir do model (que foi completado no teste anterior). -
Should be able to list all users
Para que esse teste passe, é necessário que o método
list
do arquivo src/modules/users/repositories/implementations/UsersRepository retorne a lista de todos os usuários cadastrados na aplicação. -
Should be able to find user by ID
Para que esse teste passe, é necessário que o método
findById
do arquivo src/modules/users/repositories/implementations/UsersRepository receba oid
****de um usuário e ****retorne o usuário que possui o mesmoid
. -
Should be able to find user by e-mail address
Para que esse teste passe, é necessário que o método
findByEmail
do arquivo src/modules/users/repositories/implementations/UsersRepository receba oemail
****de um usuário e ****retorne o usuário que possui o mesmoemail
. -
Should be able to turn an user as admin
Para que esse teste passe, é necessário que o método
turnAdmin
do arquivo src/modules/users/repositories/implementations/UsersRepository receba o objeto do usuário completo, mude a propriedadeadmin
paratrue
, atualize também a propriedadeupdated_at
e retorne o usuário atualizado.
-
Should be able to create new users
Para que esse teste passe, é necessário que o método
execute
do arquivo src/modules/users/useCases/createUser/CreateUserUseCase.ts recebaname
eemail
do usuário a ser criado, crie o usuário através do métodocreate
do repositório e retorne o usuário criado. -
Should not be able to create new users when email is already taken
Para que esse teste passe, é necessário que o método
execute
do arquivo src/modules/users/useCases/createUser/CreateUserUseCase.ts não permita que um usuário seja criado caso já exista um usuário com o mesmo email e, nesse caso, lance um erro no seguinte formato:throw new Error("Mensagem do erro");
-
Should be able to turn an user as admin
Para que esse teste passe, é necessário que o método
execute
do arquivo src/modules/users/useCases/turnUserAdmin/TurnUserAdminUseCase.ts receba oid
de um usuário, chame o método do repositório que transforma esse usuário em administrador e retorne o usuário após a alteração. -
Should not be able to turn a non existing user as admin
Para que esse teste passe, é necessário que o método
execute
do arquivo src/modules/users/useCases/turnUserAdmin/TurnUserAdminUseCase.ts não permita que um usuário que não existe seja transformado em admin. Caso o usuário não exista, lance um erro no seguinte formato:throw new Error("Mensagem do erro");
-
Should be able to get user profile by ID
Para que esse teste passe, é necessário que o método
execute
do arquivo src/modules/users/useCases/showUserProfile/ShowUserProfileUseCase.ts receba oid
de um usuário, chame o método do repositório que busca um usuário peloid
e retorne o usuário encontrado. -
Should not be able to show profile of a non existing user
Para que esse teste passe, é necessário que o método
execute
do arquivo src/modules/users/useCases/showUserProfile/ShowUserProfileUseCase.ts não permita que um usuário que não existe seja retornado. Caso o usuário não exista, lance um erro no seguinte formato:throw new Error("Mensagem do erro");
-
Should be able to list all users
Para que esse teste passe, é necessário que o método
execute
do arquivo src/modules/users/useCases/listAllUsers/ListAllUsersUseCase.ts chame o método do repositório que retorna todos os usuários cadastrados e retorne essa informação. -
Should not be able to a non admin user get list of all users
Para que esse teste passe, é necessário que o método
execute
do arquivo src/modules/users/useCases/listAllUsers/ListAllUsersUseCase.ts receba oid
de um usuário e retorne a listagem de usuários cadastrados na aplicação apenas se oid
recebido pertencer a um usuário admin. Caso o usuário não seja admin, lance um erro no seguinte formato:throw new Error("Mensagem do erro");
-
Should not be able to a non existing user get list of all users
Para que esse teste passe, é necessário que o método
execute
do arquivo src/modules/users/useCases/listAllUsers/ListAllUsersUseCase.ts não permita que um usuário que não exista, acesse a listagem de usuários cadastrados na aplicação. Caso o usuário não exista, lance um erro no seguinte formato:throw new Error("Mensagem do erro");
Para que esses testes passem, você deve fazer alterações em todos os controllers da aplicação.
💡 Você pode olhar qual controller recebe o conteúdo de qual rota observando o arquivo **src/routes/users.routes.ts**.-
Rota - [POST] /users
-
Should be able to create new users
Para que esse teste passe, usando o useCase apropriado, você deve permitir que a rota crie um usuário e retorne um status
201
junto ao objeto do usuário criado. -
Should not be able to create new users when email is already taken
Para que esse teste passe, caso algum erro tenha acontecido no useCase, retorne a resposta com status
💡 Para capturar erros lançados por outros arquivos, você pode envolver o conteúdo do controller em um `try/catch` e acessar a propriedade `message` do erro recebido pelo `catch`400
e um json com um objeto{ error: "mensagem do erro" }
, onde o valor da propriedadeerror
deve ser a mensagem lançada pelo erro no useCase.
-
-
Rota - [PATCH] /users/:user_id/admin
-
Should be able to turn an user as admin
Para que esse teste passe, usando o useCase apropriado, você deve permitir que a rota mude um usuário padrão para um admin e retorne o usuário alterado no corpo da resposta.
-
Should not be able to turn a non existing user as admin
Para que esse teste passe, caso algum erro tenha acontecido no useCase, retorne a resposta com status
404
e um json com um objeto{ error: "mensagem do erro" }
, onde o valor da propriedadeerror
deve ser a mensagem lançada pelo erro no useCase.
-
-
Rota - [GET] /users/:user_id
-
Should be able to get user profile by ID
Para que esse teste passe, usando o useCase apropriado, você deve permitir que a rota receba o
id
de um usuário pelo parâmetro na rota e retorne, no corpo da resposta, o objeto do usuário encontrado. -
Should not be able to show profile of a non existing user
Para que esse teste passe, caso algum erro tenha acontecido no useCase, retorne a resposta com status
404
e um json com um objeto{ error: "mensagem do erro" }
, onde o valor da propriedadeerror
deve ser a mensagem lançada pelo erro no useCase.
-
-
Rota - [GET] /users
-
Should be able to list all users
Para que esse teste passe, usando o useCase apropriado, você deve permitir que a rota receba o
id
de um usuário admin pelo headeruser_id
da requisição e retorne, no corpo da resposta, a lista dos usuários cadastrados. -
Should not be able to a non admin user get list of all users
Should not be able to a non existing user get list of all users
Para que esses dois testes passem, caso algum erro tenha acontecido no useCase, retorne a resposta com status
400
e um json com um objeto{ error: "mensagem do erro" }
, onde o valor da propriedadeerror
deve ser a mensagem lançada pelo erro no useCase.
-