Seidor Car
Projeto de teste técnico para Seidor. Esse é um sistema Web que permite controlar a utilização de automóveis de uma empresa, para isso foi criado um registro para carros, motorista e também as requisições de veículos
Requisitos
Este é um projeto base utilizando o NestJS como framework para desenvolvimento de servidores em Node.js, o Prisma para ORM (Object-Relational Mapping) e o Docker para facilitar a gestão do ambiente de desenvolvimento.
- Docker
- Node ^18
- Nestjs
- Prisma ORM
- Class Validator
- Class Transformer
- Eslint
- Jest
Executar
Para executar o projeto, basta rodar o docker compose:
Antes, copie o arquivo .env.example e renomei ele para .env. Caso alguma das porta utilizada de erro, basta alterar no .env e no docker-compose.yml
docker compose up -d
em seguida execute o codigo para fazer o deploy do banco de dados dentro do docker
docker exec -ti seidor-car-api sh
e
yarn prisma generate | yarn prisma migrate deploy
Regras de negocio
Para esse projeto tomei a liberdade de adicionar algumas regras de negócio:
-
Carros: A placa do veículo deve ser única no sistema, ao qual verifica se existe quando cadastrar e atualizar, gerando uma exceção caso já exista Para o cadastro do veículo, todos os campos do body são obrigatórios.
{ "brand": "Ford", "color": "green", "plate": "ABC-132A" }
-
Motorista: O email de cadastro é único, ao qual se verifica se existe quando cadastrar e atualizar, gerando uma exceção caso já exista.
{ "name": "Fulano de tal", "document": "00000000000", "license": "ABC-1234", "email": "test@com.com", "phone" : "31999999999" }
Rotas
Aqui tem as principais rotas do sistema.
O projeto está rodando na porta http://localhost:3000
Criar Carro
Rota Post
http://localhost:3000/car
body:
{
"brand": "Ford",
"color": "green",
"plate": "ABC-132A"
}
curl --location 'http://localhost:3000/car' \
--header 'Content-Type: application/json' \
--data '{
"brand": "Ford",
"color": "green",
"plate": "ABC-132A"
}'
Buscar Carro
Rota Get
http://localhost:3000/car
Variações dessa rota:
-Paginado
'http://localhost:3000/car?limit=10&page=1'
-Busca por Cor
http://localhost:3000/car?limit=10&page=1&color=blue
-Busca por Marca
http://localhost:3000/car?limit=10&page=1&color=blue&Bland=Ford
curl --location 'http://localhost:3000/car?limit=10&page=1&color=blue&brand=Ford'
Buscar Carro por Id
Rota Get
http://localhost:3000/car/cf789bf2-42f7-499d-a8da-fe9fe55a8772
bash curl --location 'http://localhost:3000/car/cf789bf2-42f7-499d-a8da-fe9fe55a8772'
Criar motorista
Rota Post:
http://localhost:3000/driver
Body:
{
"name": "Fulano de tal",
"document": "00000000000",
"license": "ABC-1234",
"email": "test@com.com",
"phone" : "31999999999"
}
curl --location 'http://localhost:3000/driver' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Fulano de tal",
"document": "00000000000",
"license": "ABC-1234",
"email": "test@com.com",
"phone" : "31999999999"
}'
Buscar Motorista
Rota Get
http://localhost:3000/driver
Variações dessa rota:
-Paginado
'http://localhost:3000/driver?limit=10&page=1'
-Busca por nome
http://localhost:3000/driver?limit=10&page=1&name=Fulano
curl --location 'http://localhost:3000/driver?limit=10&page=1&name=Fulano'
Buscar Por Id
Rota get
http://localhost:3000/driver/cf789bf2-42f7-499d-a8da-fe9fe55a8772
bash curl --location 'http://localhost:3000/driver/cf789bf2-42f7-499d-a8da-fe9fe55a8772'
Solicitação de carro
Criar Solicitação
Rota Post
http://localhost:3000/pick-up-car
Body:
{
"idCar": "f259bfff-4b00-42b5-a52c-331480084eaa",
"idDriver": "3a158048-8442-40d5-8f1d-e5a3a0382af4",
"description": "levando o chefe para o trabalho",
"initPicKUp": "2024-01-10T13:51:38.423"
}
curl --location 'http://localhost:3000/pick-up-car' \
--header 'Content-Type: application/json' \
--data '{
"idCar": "f259bfff-4b00-42b5-a52c-331480084eaa",
"idDriver": "3a158048-8442-40d5-8f1d-e5a3a0382af4",
"description": "levando o chefe",
"initPicKUp": "2024-01-10T13:51:38.423",
"endPickUp": "2024-01-13T13:51:38.423"
}'
Entregar o carro
Rota Put
http://localhost:3000/pick-up-car/returned/a365e0b3-65f4-4f30-be28-e60397165735
body: (Não é obrigatorio)
{
"deliveryDescription": "Carro sem dano"
}
curl --location --request PUT 'http://localhost:3000/pick-up-car/returned/a365e0b3-65f4-4f30-be28-e60397165735' \
--data ''
Ou
curl --location --request PUT 'http://localhost:3000/pick-up-car/returned/a365e0b3-65f4-4f30-be28-e60397165735' \
--header 'Content-Type: application/json' \
--data '{
"deliveryDescription": "Carro sem dano"
}'