-
No seu segundo projeto back-end, você construirá o sistema de gestão de uma locadora de jogos de tabuleiro!
-
Geral
- A porta utilizada pelo seu servidor deve ser a 4000
- Faça commits a cada funcionalidade implementada
-
CRUD de Categorias [Create|Read]
- Listar categorias
- Rota: GET /categories
- Inserir categoria
- Rota: POST /categories
- Listar categorias
-
CRUD de Jogos [Create|Read]
- Listar jogos
- Rota: GET /games
- Regras de Negócio
- Caso seja passado um parâmetro
name
na query string da requisição, os jogos devem ser filtrados para retornar somente os que começam com a string passada (case insensitive). Exemplo:- Para a rota
/games?name=ba
, deve ser retornado uma array somente com os jogos que comecem com "ba", como "Banco Imobiliário", "Batalha Naval", etc
- Para a rota
- Caso seja passado um parâmetro
- Inserir um jogo
- Rota: POST /games
- Regras de Negócio
name
não pode estar vazio;stockTotal
epricePerDay
devem ser transformados em números e serem maiores que 0;categoryId
deve ser um id de categoria existente; ⇒ nesses casos, deve retornar status 400name
não pode ser um nome de jogo já existente ⇒ nesse caso deve retornar status 409
- Listar jogos
-
CRUD de Clientes [Create|Read|Update]
- Listar clientes
- Rota: GET /customers
- Regras de Negócio
- Caso seja passado um parâmetro
cpf
na query string da requisição, os clientes devem ser filtrados para retornar somente os com CPF que comecem com a string passada. Exemplo:- Para a rota
/customers?cpf=012
, deve ser retornado uma array somente com os clientes que o CPF comece com "012", como "01234567890", "01221001200", etc
- Para a rota
- Caso seja passado um parâmetro
- Buscar um cliente por id
- Rota: GET /customers/:id
- Regras de Negócio:
- Se o cliente com id dado não existir, deve responder com status 404
- Inserir um cliente
- Rota: POST /customers
- Regras de negócio:
cpf
deve ser uma string com 11 caracteres numéricos;phone
deve ser uma string com 10 ou 11 caracteres numéricos;name
não pode ser uma string vazia;birthday
deve ser uma data válida; ⇒ nesses casos, deve retornar status 400cpf
não pode ser de um cliente já existente; ⇒ nesse caso deve retornar status 409
- Atualizar um cliente
- Rota: PUT /customers/:id
- Regras de negócio:
cpf
deve ser uma string com 11 caracteres numéricos;phone
deve ser uma string com 10 ou 11 caracteres numéricos;name
não pode ser uma string vazia;birthday
deve ser uma data válida ⇒ nesses casos, deve retornar status 400cpf
não pode ser de um cliente já existente ⇒ nesse caso deve retornar status 409
- Listar clientes
-
CRUD de Aluguéis [Create|Read|Update|Delete]
- Listar aluguéis
- Rota: GET /rentals
- Regras de Negócio
- Caso seja passado um parâmetro
customerId
na query string da requisição, os aluguéis devem ser filtrados para retornar somente os do cliente solicitado. Exemplo:- Para a rota
/rentals?customerId=1
, deve ser retornado uma array somente com os aluguéis do cliente com id 1
- Para a rota
- Caso seja passado um parâmetro
gameId
na query string da requisição, os aluguéis devem ser filtrados para retornar somente os do jogo solicitado. Exemplo:- Para a rota
/rentals?gameId=1
, deve ser retornado uma array somente com os aluguéis do jogo com id 1
- Para a rota
- Caso seja passado um parâmetro
- Inserir um aluguel
- Rota: POST /rentals
- Regras de Negócio
- Ao inserir um aluguel, os campos
rentDate
eoriginalPrice
devem ser populados automaticamente antes de salvá-lo:rentDate
: data atual no momento da inserçãooriginalPrice
:daysRented
multiplicado pelo preço por dia do jogo no momento da inserção
- Ao inserir um aluguel, os campos
returnDate
edelayFee
devem sempre começar comonull
- Ao inserir um aluguel, deve verificar se
customerId
se refere a um cliente existente. Se não, deve responder com status 400 - Ao inserir um aluguel, deve verificar se
gameId
se refere a um jogo existente. Se não, deve responder com status 400 daysRented
deve ser um número maior que 0. Se não, deve responder com status 400- Ao inserir um aluguel, deve-se validar que existem jogos disponíveis, ou seja, que não tem alugueis em aberto acima da quantidade de jogos em estoque. Caso contrário, deve retornar status 400
- Ao inserir um aluguel, os campos
- Finalizar aluguel
- Rota: POST /rentals/:id/return
- Regras de Negócio
- Ao retornar um aluguel, o campo
returnDate
deve ser populado com a data atual do momento do retorno - Ao retornar um aluguel, o campo
delayFee
deve ser automaticamente populado com um valor equivalente ao número de dias de atraso vezes o preço por dia do jogo no momento do retorno. Exemplo:- Se o cliente aluguel no dia 20/06 um jogo por 3 dias, ele deveria devolver no dia 23/06. Caso ele devolva somente no dia 25/06, o sistema deve considerar 2 dias de atraso. Nesse caso, se o jogo custava R$ 15,00 por dia, a
delayFee
deve ser de R$ 30,00 (3000 centavos)
- Se o cliente aluguel no dia 20/06 um jogo por 3 dias, ele deveria devolver no dia 23/06. Caso ele devolva somente no dia 25/06, o sistema deve considerar 2 dias de atraso. Nesse caso, se o jogo custava R$ 15,00 por dia, a
- Ao retornar um aluguel, deve verificar se o
id
do aluguel fornecido existe. Se não, deve responder com status 404 - Ao retornar um aluguel, deve verificar se o aluguel já não está finalizado. Se estiver, deve responder com status 400
- Ao retornar um aluguel, o campo
- Apagar aluguel
- Rota: DELETE /rentals/:id
- Regras de Negócio
- Ao excluir um aluguel, deve verificar se o
id
fornecido existe. Se não, deve responder com status 404 - Ao excluir um aluguel, deve verificar se o aluguel já não está finalizado (ou seja,
returnDate
já está preenchido). Se estiver, deve responder com status 400
- Ao excluir um aluguel, deve verificar se o
- Listar aluguéis
- Paginação
- GET /categories, /games, /customers, /rentals
- Caso seja passado um parâmetro
offset
na query string da requisição, deve-se obter somente os registros no banco após o offset determinado. Ex: se for passadooffset=20
e existirem 100 produtos no banco, só devem ser retornados os 80 últimos (do 21º ao 100º)- Dica: pesquise por SQL OFFSET
- Caso seja passado um parâmetro
limit
na query string da requisição, deve-se limitar a quantidade de registros retornados a esse limite no máximo. Ex: se for passadolimit=30
e existirem 100 produtos no banco, só devem ser retornados os 30 primeiros - Caso tanto
limit
quantooffset
sejam passados, ambos devem ser aplicados. Ex: se for passadooffset=20&limit=30
, caso existam 100 produtos no banco, só devem ser retornados os produtos do 21º ao 50º.
- Caso seja passado um parâmetro
- GET /categories, /games, /customers, /rentals
- Ordenação
- GET /categories, /games, /customers, /rentals
- Caso seja passado um parâmetro
order
na query string da requisição, deve-se retornar os registros ordenados pela coluna passada em ordem ascendente. Ex: se for passadoorder=name
, os registros devem ser ordenados alfabeticamente pela colunaname
- Caso seja passado também um parâmetro
desc
na query string, deve-se inverter esta ordem para descendente. Ex: se for passadoorder=name&desc=true
, os registros devem ser ordenados alfabeticamente invertidos pela colunaname
- Caso seja passado um parâmetro
- GET /categories, /games, /customers, /rentals
- Filtragem por data
- GET /rentals
- Caso seja passado um parâmetro
status
na query string da requisição, os aluguéis devem ser filtrados para retornar somente aqueles que estão naquele estado. Exemplo:- Para a rota
/rentals?status=open
, deve ser retornado uma array somente com os aluguéis não finalizados - Para a rota
/rentals?status=closed
, deve ser retornado uma array somente com os aluguéis finalizados
- Para a rota
- Caso seja passado um parâmetro
startDate
na query string da requisição, os aluguéis devem ser filtrados para retornar somente os que foram feitos a partir daquela data. Exemplo:- Para a rota
/rentals?startDate=2021-06-10
, deve ser retornado uma array somente com os aluguéis comrentDate
maior ou igual a2021-06-10
- Para a rota
- Caso seja passado um parâmetro
- GET /rentals
- Cálculo de faturamento
- GET /rentals/metrics
In the project directory, you can run:
-
First clone this repository
-
Run: npm i
-
Run: npm start
-
Run: npm run dev (with nodemon)