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"
}'