O servidor, desenvolvido com NestJS, é projetado para fornecer informações em tempo real sobre veículos. Ele lê dados de veículos de um arquivo JSON localizado em src/vehicles/vehicles.data.json
, dados de motoristas do arquivo [src/drivers/drivers.data.json
], e dados de viagens do arquivo [src/travels/travels.data.json
] e os armazena na memória. Esses dados incluem informações básicas sobre cada entidade do domínio do sistema.
Além disso, o servidor gera e transmite dados aleatórios em tempo real para os clientes conectados. Isso é feito através de WebSockets para veículos, motoristas e viagens. A cada vez que uma dessas entidades for criada, modificada ou deletada o socket enviará as atualizações para o cliente. Esses dados são então enviados para todos os clientes conectados.
Um exemplo de cliente que se conecta aos WebSockets e recebe esses dados pode ser encontrado em src/client/index.html
.
Para começar a usar este projeto, clone o repositório e instale as dependências com o comando:
$ npm install
Para executar o servidor, use o comando:
$ npm run start
Um simulador é disponibilizado junto a este projeto para criar, encerrar e atualizar viagens. Para rodá-lo, utilize o comando:
$ npm run simulate
Na pasta resources
, você pode encontrar uma coleção de requisições que podem ser importadas no Insomnia para testar as chamadas para este sistema. Elas estão dividas por entidade e documentam todos os recursos disponíveis para utilização.
Para receber informações iniciais dos veículos faça um requisição GET
no endereço http://localhost:3000/vehicles
. O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta:
[
{
"id": number,
"type": string,
"plate": string,
"lat": number,
"lng": number,
"speed": number,
"status": string // "stopped" ou "moving"
},
...
]
Também é possível realizar o get por status do veículo. Para receber os veículos em status "stopped" faça um requisição GET
no endereço http://localhost:3000/vehicles/vehiclesByStatus/stopped
; para receber os veículos em status "moving" faça um requisição GET
no endereço http://localhost:3000/vehicles/vehiclesByStatus/moving
.
Para obter informações de um veículo específico, faça uma requisição GET no endereço http://localhost:3000/vehicles/{id}
. O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta:
{
"id": number,
"type": string,
"plate": string,
"lat": number,
"lng": number,
"speed": number,
"status": string // "stopped" ou "moving"
}
Para criar um novo veículo, faça uma requisição POST no endereço http://localhost:3000/vehicles
com o seguinte JSON no corpo da requisição, contendo os dados do veículo a ser salvo:
{
"type": string,
"plate": string,
}
O servidor deverá retornar uma resposta com status 201 e o seguinte JSON no corpo da resposta, contendo as informações do novo veículo criado:
{
"id": number,
"type": string,
"plate": string,
"lat": number,
"lng": number,
"speed": number,
"status": string // "stopped" ou "moving"
}
Para atualizar todas as informações de um veículo existente, faça uma requisição PUT no endereço http://localhost:3000/vehicles/{id}
com o seguinte JSON no corpo da requisição, contendo os dados a serem modificados:
{
"type": string,
"plate": string,
"lat": number,
"lng": number,
"speed": number,
"status": string // "stopped" ou "moving"
}
Para atualizar apenas um subconjunto das informações de um veículo existente, faça uma requisição PATCH no endereço http://localhost:3000/vehicles/{id}
com um JSON no corpo da requisição com alguma das propriedades de veículo, contendo os dados a serem modificados, como exemplo, para alterar a propriedade type
:
{
"type": string
}
O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta, com os dados do veículo atualizado:
{
"type": string,
"plate": string,
"lat": number,
"lng": number,
"speed": number,
"status": string // "stopped" ou "moving"
}
Para excluir um veículo, faça uma requisição DELETE no endereço http://localhost:3000/vehicles/{id}
. O servidor deverá retornar uma resposta com status 204 (sem conteúdo), indicando que a operação foi realizada com sucesso.
Em todos os casos, se o veículo não for encontrado, o servidor deverá retornar uma resposta com status 404 e o seguinte JSON no corpo da resposta:
{
"message": "Vehicle not found",
"error": "Not Found",
"statusCode": 404
}
O websocket é atualizado com informações em tempo real de cada veículo. Para realizar a conexão utilize a biblioteca Socket.IO e utilize o endereço http://localhost:3000/vehicles/ws
. As mensagens enviadas possuem o seguinte formato de resposta:
{
"data": {
"id": number,
"type": string,
"lat": number,
"lng": number,
"speed": number,
"status": string // "stopped" ou "moving"
}
}
Os canais disponíveis para conexão no websocket de veículos são:
vehicle-created
: canal de notificação de criações de veículosvehicle-updated
: canal de notificação de atualizações de veículosvehicle-deleted
: canal de notificações de deleção de veículos
Para receber informações iniciais dos motoristas faça um requisição GET
no endereço http://localhost:3000/drivers
. O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta:
[
{
"id": number,
"name": string,
"cpf": string,
"cnh": string,
"status": string // "driving" ou "idle"
},
...
]
Também é possível realizar o get por status do motorista. Para receber os motoristas em status "driving" faça um requisição GET
no endereço http://localhost:3000/drivers/driversByStatus/driving
; para receber os motoristas em status "idle" faça um requisição GET
no endereço http://localhost:3000/drivers/driversByStatus/idle
.
Para obter informações de um motorista específico, faça uma requisição GET no endereço http://localhost:3000/drivers/{id}
. O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta:
{
"id": number,
"name": string,
"cpf": string,
"cnh": string,
"status": string // "driving" ou "idle"
}
Para criar um novo motorista, faça uma requisição POST no endereço http://localhost:3000/drivers
com o seguinte JSON no corpo da requisição, contendo os dados do motorista a ser salvo:
{
"name": string,
"cpf": string,
"cnh": string,
}
O servidor deverá retornar uma resposta com status 201 e o seguinte JSON no corpo da resposta, contendo as informações do novo motorista criado:
{
"id": number,
"name": string,
"cpf": string,
"cnh": string,
"status": string = "idle"
}
Para atualizar todas as informações de um motorista existente, faça uma requisição PUT no endereço http://localhost:3000/drivers/{id}
com o seguinte JSON no corpo da requisição, contendo os dados a serem modificados:
{
"name": string,
"cpf": string,
"cnh": string,
"status": string,
}
Para atualizar apenas um subconjunto das informações de um motorista existente, faça uma requisição PATCH no endereço http://localhost:3000/drivers/{id}
com um JSON no corpo da requisição com alguma das propriedades de motorista, contendo os dados a serem modificados, como exemplo, para alterar a propriedade name
:
{
"name": string,
}
O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta, com os dados do motorista atualizado:
{
"name": string,
"cpf": string,
"cnh": string,
"status": string,
}
Para excluir um motorista, faça uma requisição DELETE no endereço http://localhost:3000/drivers/{id}
. O servidor deverá retornar uma resposta com status 204 (sem conteúdo), indicando que a operação foi realizada com sucesso.
Em todos os casos, se o motorista não for encontrado, o servidor deverá retornar uma resposta com status 404 e o seguinte JSON no corpo da resposta:
{
"message": "Driver not found",
"error": "Not Found",
"statusCode": 404
}
O websocket é atualizado com informações em tempo real de cada motorista. Para realizar a conexão utilize a biblioteca Socket.IO e utilize o endereço http://localhost:3000/drivers/ws
. As mensagens enviadas possuem o seguinte formato de resposta:
{
"data": {
"id": number,
"name": string,
"cpf": string,
"cnh": string,
"status": string,
}
}
Os canais disponíveis para conexão no websocket de motoristas são:
driver-created
: canal de notificação de criações de motoristasdriver-updated
: canal de notificação de atualizações de motoristasdriver-deleted
: canal de notificações de deleção de motoristas
Para receber informações iniciais das viagens faça um requisição GET
no endereço http://localhost:3000/travels
. O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta:
[
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
},
...
]
Também é possível realizar o get por status da viagem. Para receber as viagens com status "ongoing" faça um requisição GET
no endereço http://localhost:3000/travels/travelsByStatus/ongoing
; para receber as viagens com status "completed" faça um requisição GET
no endereço http://localhost:3000/travels/travelsByStatus/completed
. O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta:
[
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
},
...
]
Também é possível realizar o get por veículo que realizou as viagens. Para receber as viagens de um veículo, faça uma requisição GET
no endereço http://localhost:3000/travels/travelsByVehicle/{vehicleId}
.
O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta:
[
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
},
...
]
Também é possível realizar o get por motorista que realizou as viagens. Para receber as viagens de um motorista, faça uma requisição GET
no endereço http://localhost:3000/travels/travelsByDriver/{driverId}
.
O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta:
[
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
},
...
]
Para obter informações de uma viagem específica, faça uma requisição GET no endereço http://localhost:3000/travels/{id}
. O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta:
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
}
Para criar uma nova viagem, faça uma requisição POST no endereço http://localhost:3000/travels
com o seguinte JSON no corpo da requisição, contendo os dados da viagem a ser salva:
{
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
}
O servidor deverá retornar uma resposta com status 201 e o seguinte JSON no corpo da resposta, contendo as informações da nova viagem criada:
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
}
Atenção esta rota apenas cria uma entidade de viagem no banco, mas não atualiza o estado do motorista nem do veículo vinculados a ela. Para iniciar uma viagem veja o tópico Rota de inicialização de uma viagem
.
As rotas de atualização de viagem apenas modificam a entidade viagem. Para encerrar uma viagem atualizando devidamente as entidades de motorista e veículos vinculadas, veja Rota de encerramento de viagem
.
Para atualizar todas as informações de uma viagem existente, faça uma requisição PUT no endereço http://localhost:3000/travels/{id}
com o seguinte JSON no corpo da requisição, contendo os dados a serem modificados:
{
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
}
Para atualizar apenas um subconjunto das informações de uma viagem existente, faça uma requisição PATCH no endereço http://localhost:3000/travels/{id}
com um JSON no corpo da requisição com alguma das propriedades de viagem, contendo os dados a serem modificados, como exemplo, para alterar a propriedade vehicleId
:
{
"vehicleId": number,
}
O servidor deverá retornar uma resposta com status 200 e o seguinte JSON no corpo da resposta, com os dados da viagem atualizada:
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
}
Para iniciar uma nova viagem, utilize o endpoint http://localhost:3000/travels/beginTravel
com o seguinte JSON no corpo da requisição, contendo os dados da viagem a ser iniciada:
{
"vehicleId": number,
"driverId": number
}
Caso queira especificar um momento de inicio para a viagem, passe também a propriedade start. Caso não seja passada, a viagem será iniciada no momento que for processada pelo backend.
O servidor deverá retornar uma resposta com status 201 e o seguinte JSON no corpo da resposta, contendo as informações da nova viagem criada:
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "ongoing"
"start": string,
}
Para finalizar uma viagem, utilize o seguinte endpoint http://localhost:3000/travels/stopTravel/{id}
. Não é necessário enviar um JSON no corpo da requisição. A viagem será encerrada no momento que a requisição for processada pelo backend.
O servidor deverá retornar uma resposta com status 201 e o seguinte JSON no corpo da resposta, contendo as informações da nova viagem criada:
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "finished"
"start": string,
"end": string,
}
O websocket é atualizado com informações em tempo real de cada viagem. Para realizar a conexão utilize a biblioteca Socket.IO e utilize o endereço http://localhost:3000/travels/ws
. As mensagens enviadas possuem o seguinte formato de resposta:
{
"id": number,
"driverId": number,
"vehicleId": number,
"status": string, // "finished" ou "ongoing"
"start": string,
"end": string,
}
Os canais disponíveis para conexão no websocket de viagens são:
travel-created
: canal de notificação de criações de viagemtravel-updated
: canal de notificação de atualizações de viagemtravel-deleted
: canal de notificações de deleção de viagem