Para rodar o projeto:

  • Você deve ter um virtual environment ativado:
    • Na pasta do projeto rode: python -m venv venv
    • Para ativar o ambiente virtual rode: source venv/bin/activate
    • Para instalar as dependências no ambiente virtual rode: pip install -r requirements.txt
    • Para iniciar o projeto na porta 5002 rode: python manage.py runserver 5002
    • Pronto! A API já está rodando.

Sobre usuários:

POST /api/accounts/ - criando um admin

// REQUEST
{
  "username": "admin",
  "password": "1234",
  "is_superuser": true,
  "is_staff": true
}
// RESPONSE STATUS -> HTTP 201
{
  "id": 1,
  "username": "admin",
  "is_superuser": true,
  "is_staff": true
}
  • Endpoint para realizar o login e obter um token de autenticação.

POST /api/login/ - obtendo um token para o usuário

// REQUEST
{
  "username": "admin",
  "password": "1234"
}
// REQUEST STATUS -> HTTP 200
{
  "token": "0f500a8c2f2f8d5e77ad86b3a8d373a0528d8812"
}

Sobre níveis:

  • Níveis representam um andar dentro de um estacionamento.

  • As informações para criação de um nível devem especificar a quantidade de vagas para cada tipo de veículo (carro e moto).

  • As informações para criação de um nível devem especificar uma fill_priority, ou seja, uma prioridade de preenchimento. Este valor será utilizado nas regras de negócio, para que o sistema consiga definir qual a próxima vaga a ser preenchida.

  • Somente um usuário com um token de administrador pode fazer o request para criar um nível POST /api/levels/.

POST /api/levels/ - criando um novo nível

// REQUEST 
// Header -> Authorization: Token <token-do-admin>
{
  "name": "floor 1",
  "fill_priority": 2,
  "motorcycle_spaces": 20,
  "car_spaces": 50
}
// RESPONSE STATUS -> HTTP 201
{
  "id": 1,
  "name": "floor 1",
  "fill_priority": 2,
  "available_spaces": {
    "available_motorcycle_spaces": 20,
    "available_car_spaces": 50
  }
}
  • A quantidade disponível de vagas (para cada tipo de veículo) é exibida quando o servidor envia informações sobre os níveis.

  • Há uma rota específica para listar todos os níveis

GET /api/levels/ - listando os níveis

// RESPONSE STATUS -> HTTP 200
[
  {
    "id": 1,
    "name": "floor 1",
    "fill_priority": 5,
    "available_spaces": {
      "available_motorcycle_spaces": 20,
      "available_car_spaces": 50
    }
  },
  {
    "id": 2,
    "name": "floor 2",
    "fill_priority": 3,
    "available_spaces": {
      "available_motorcycle_spaces": 10,
      "available_car_spaces": 30
    }
  }
]

Sobre preços (pricings):

  • Há uma equação para calcular o valor a ser pago para cada veículo.

  • A equação tem o seguinte formato:

V(t) = a + b.t

Onde:

  • a - representa o coeficiente linear

  • b - o coeficiente angular da equação.

  • t - o número de horas que o veículo permaneceu no estacionamento

  • V - é o valor a ser pago (em centavos)

  • É necessário que um usuário com token de administrador forneça os coeficientes para a equação que determina o valor a ser pago por cada veículo.

POST /api/pricings/ - criando uma nova precificação:

// REQUEST 
// Header -> Authorization: Token <token-do-admin>
{
  "a_coefficient": 100,
  "b_coefficient": 100
}
// RESPONSE STATUS -> HTTP 201
{
  "id": 1,
  "a_coefficient": 100,
  "b_coefficient": 100
}
  • No momento de determinar o valor a ser pago para cada veículo, o sistema utiliza a última precificação inserida para fazer o cálculo.

  • Se não houver nenhuma precificação salva no sistema, o sistema não criará registros de entrada no estacionamento. Nesse caso será devolvida uma resposta com código HTTP 404.

Sobre veículos:

  • Para criar um registro de entrada de veículo no estacionamento, deve-se utilizar um request POST na url /api/vehicles/.

POST /api/vehicles/ - criando um novo registro de entrada:

// REQUEST
{
  "vehicle_type": "car",
  "license_plate": "AYO1029"
}
// RESPONSE STATUS -> HTTP 201
{
  "id": 1,
  "license_plate": "AYO1029",
  "vehicle_type": "car",
  "arrived_at": "2021-01-25T17:16:25.727541Z",
  "paid_at": null,
  "amount_paid": null,
  "space": {
    "id": 2,
    "variety": "car",
    "level_name": "floor 1"
  }
}
  • As únicas informações necessárias para completar o POST são o vehicle_type (tipo de veículo) e a license_plate (placa). O resto das informações são determinadas pelo próprio sistema.

  • No momento da criação do registro de entrada, será atribuída uma vaga de acordo com o tipo do veículo e a prioridade de preenchimento de cada andar. O sistema escolherá uma vaga qualquer do andar que tiver o menor valor de fill_priority. Se houver 2 ou mais níveis com o mesmo valor de fill_priority, o sistema terá liberdade para optar por qualquer um deles.

  • Se não houver nenhum nível ao cadastrar um registro de entrada, o sistema não poderá criar o registro de entrada no estacionamento. Nesse caso será devolvida uma resposta com código HTTP 404.

  • Se não houver vagas disponíveis, o sistema não poderá criar registros de entrada no estacionamento. Nesse caso será devolvida uma resposta com código HTTP 404.

PUT /api/vehicles/<int:vehicle_id>/ - registrando a saída e pagamento do veículo:

// REPONSE STATUS -> HTTP 200
{
  "license_plate": "AYO1029",
  "vehicle_type": "car",
  "arrived_at": "2021-01-21T19:36:55.364610Z",
  "paid_at": "2021-01-21T19:37:23.016452Z",
  "amount_paid": 100,
  "space": null
}
  • Para pagar o estacionamento de um determinado veículo, basta enviar um request PUT /api/vehcles/<int:vehicle_id>/ colocando o vehicle_id como parâmetro URL.

  • As informações paid_at e amount_paid serão calculadas pelo próprio sistema.

  • Este request deve ocasionar a liberação da vaga ocupada pelo veículo. Portanto, deve ser possível observar space: null