Essa é uma aplicação de listagem e cadastro de usuários.
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.
- 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
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. Para capturar erros lançados por outros arquivos, você pode envolver o conteúdo do controller em umtry/catch
e acessar a propriedademessage
do erro recebido pelocatch
- 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
- 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.
- 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
- 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.
- Should be able to list all users
Para que esse teste passe, usando o useCase apropriado, você deve permitir que a rota receba o
# Clone this project
$ git clone https://github.com/araujo-jp/ignite-introducao-ao-SOLID.git
# Access
$ cd ignite-introducao-ao-SOLID
# Install dependencies
$ yarn install
# Run the project
$ yarn dev
# The server will initialize in the http://localhost:3333
Esse projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Feito com ❤️ by João Paulo Araújo 👋🏻