DroneFeeder
O sistema de delivery da sua empresa!
Este aplicativo permitirá a entrega de pacotes com drones. Ele é
responsável pelo serviço de Back-end da aplicação. Este serviço irá
recebere fornecer informações aos drones, receber informações do
cadastrador de pedidos, e fornecer algumas informações para o Front-end.
O Front-end irá fornecer as informações dos pedidos tais como latitude
e longitude e data e horário da entrega. Também permitirá a listagem de
todos os videos das entregas bem como o download de vídeos relacionado a
algum pedido específico.
Tecnologias
Esta aplicação foi criada usando as seguintes tecnologias:
-
Java 11
-
Maven Dependency Management
-
Spring Boot:
- Spring Web
- Spring Data JPA
- Actuator
-
Hibernate ORM
-
MySQL Database
-
JUnit
-
Docker
Setup e execução da aplicação
A aplicação pode ser facilmente configurada e executada com o comando:
docker-compose up
O docker fará o pull das imagem do MySQL e do JDK (se você não as tiver na sua máquina).
(Recomendado) Os serviços podem ser executados em background com o comando:
docker-compose up -d
Parar aplicação
Para parar todos os containers em execução basta rodas o comando:
docker-compose down
Se você precisar parar e removar todos containers, networks e todas imagens usadas por qualquer serviço do arquivo docker-compose.yml, use o comando:
docker-compose down --rmi all
Relacionamento das Tabelas
A API REST para este aplicativo está descrita abaixo
* Drone-controller
1. Operação responsável por listar os drones
Request
GET /dronefeeder/v1/drone
curl -X GET "http://localhost:8080/dronefeeder/v1/drone" -H "accept: application/json"
Response body
[
{
"id": 1,
"nome": "Drone A7",
"marca": "Marca A",
"fabricante": "Fabricante A",
"altitudeMax": 1000,
"duracaoBateria": 180,
"capacidadeKg": 50,
"capacidadeM3": 50,
"status": "Ativo"
},
...
]
2. Operação responsável por cadastrar um drone
Request
POST /dronefeeder/v1/drone
curl -X POST "http://localhost:8080/dronefeeder/v1/drone" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"altitudeMax\": 4000, \"capacidadeKg\": 20, \"capacidadeM3\": 10, \"duracaoBateria\": 300, \"fabricante\": \"DJI\", \"marca\": \"Mini 2\", \"nome\": \"Drone DJI Mini 2\"}"
Parameters
{
"altitudeMax": 4000,
"capacidadeKg": 20,
"capacidadeM3": 10,
"duracaoBateria": 300,
"fabricante": "DJI",
"marca": "Mini 2",
"nome": "Drone DJI Mini 2"
}
Response body
{
"id": 5,
"nome": "Drone DJI Mini 2",
"marca": "Mini 2",
"fabricante": "DJI",
"altitudeMax": 4000,
"duracaoBateria": 300,
"capacidadeKg": 20,
"capacidadeM3": 10,
"status": "Ativo"
}
3. Operação responsável por alterar dados de um drone
Request
PUT /dronefeeder/v1/drone/{id}
curl -X PUT "http://localhost:8080/dronefeeder/v1/drone/5" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"altitudeMax\": 5000, \"capacidadeKg\": 20, \"capacidadeM3\": 10, \"duracaoBateria\": 300, \"fabricante\": \"DJI\", \"marca\": \"Mini 2\", \"nome\": \"Drone2 DJI Mini 2\"}"
Parameters
{
"altitudeMax": 5000,
"capacidadeKg": 20,
"capacidadeM3": 10,
"duracaoBateria": 300,
"fabricante": "DJI",
"marca": "Mini 2",
"nome": "Drone DJI Mini 2"
}
Response body
{
"id": 5,
"nome": "Drone DJI Mini 2",
"marca": "Mini 2",
"fabricante": "DJI",
"altitudeMax": 5000,
"duracaoBateria": 300,
"capacidadeKg": 20,
"capacidadeM3": 10,
"status": "Ativo"
}
4. Operação responsável por deletar um drone
Request
DELETE /dronefeeder/v1/drone/{id}
curl -X DELETE "http://localhost:8080/dronefeeder/v1/drone/5" -H "accept: */*"
Response headers
connection: keep-alive
content-length: 0
date: Tue08 Nov 2022 21:38:16 GMT
expires: 0
keep-alive: timeout=60
pragma: no-cache
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
5. Operação responsável por ativar um drone
Request
PUT /dronefeeder/v1/drone/ativar/{id}
curl -X PUT "http://localhost:8080/dronefeeder/v1/drone/ativar/1" -H "accept: */*"
Response headers
connection: keep-alive
content-length: 0
date: Tue08 Nov 2022 21:41:30 GMT
expires: 0
keep-alive: timeout=60
pragma: no-cache
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
6. Operação responsável por desativar um drone
Request
PUT /dronefeeder/v1/drone/inativar/{id}
curl -X PUT "http://localhost:8080/dronefeeder/v1/drone/inativar/1" -H "accept: */*"
Response headers
connection: keep-alive
content-length: 0
date: Tue08 Nov 2022 21:43:47 GMT
expires: 0
keep-alive: timeout=60
pragma: no-cache
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
* Pedido-controller
1. Operação responsável por listar os pedidos
Request
GET /dronefeeder/v1/pedido
curl -X GET "http://localhost:8080/dronefeeder/v1/pedido" -H "accept: application/json"
Response body
[
{
"id": 6,
"dataEntregaProgramada": "20/11/2022 12:00",
"duracaoDoPercurso": 60,
"dataProgramadaDaSaida": "20/11/2022 11:00",
"dataConfirmacaoEntrega": "",
"enderecoDeEntrega": "Avenida Campeche, 100",
"status": "aberto",
"descricaoPedido": "Jogo de pratos",
"valorDoPedido": 1000.99,
"droneId": 2,
"pesoKg": 5,
"volumeM3": 5,
"latitude": null,
"longitude": null
},
...
]
2. Operação responsável por cadastrar um pedido
Request
POST /dronefeeder/v1/pedido
curl -X POST "http://localhost:8080/dronefeeder/v1/pedido" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"dataEntregaProgramada\": \"20/11/2022 12:00\", \"descricaoPedido\": \"Jogo de pratos\", \"droneId\": 2, \"duracaoDoPercurso\": 60, \"enderecoDeEntrega\": \"Avenida Campeche, 100\", \"pesoKg\": 5, \"valorDoPedido\": 1000.99, \"volumeM3\": 5}"
Parameters
{
"dataEntregaProgramada": "20/11/2022 12:00",
"descricaoPedido": "Jogo de pratos",
"droneId": 2,
"duracaoDoPercurso": 60,
"enderecoDeEntrega": "Avenida Campeche, 100",
"pesoKg": 5,
"valorDoPedido": 1000.99,
"volumeM3": 5
}
Response body
{
"id": 6,
"dataEntregaProgramada": "20/11/2022 12:00",
"duracaoDoPercurso": 60,
"dataProgramadaDaSaida": "20/11/2022 11:00",
"dataConfirmacaoEntrega": "",
"enderecoDeEntrega": "Avenida Campeche, 100",
"status": "aberto",
"descricaoPedido": "Jogo de pratos",
"valorDoPedido": 1000.99,
"droneId": 2,
"pesoKg": 5,
"volumeM3": 5,
"latitude": null,
"longitude": null
}
3. Operação responsável por alterar um pedido
Request
POST /dronefeeder/v1/pedido
curl -X PUT "http://localhost:8080/dronefeeder/v1/pedido/6" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"dataEntregaProgramada\": \"20/11/2022 12:00\", \"descricaoPedido\": \"Jogo de pratos\", \"droneId\": 4, \"duracaoDoPercurso\": 60, \"enderecoDeEntrega\": \"Avenida Campeche, 100\", \"pesoKg\": 5, \"valorDoPedido\": 1000.99, \"volumeM3\": 5}"
Parameters
{
"dataEntregaProgramada": "20/11/2022 12:00",
"descricaoPedido": "Jogo de pratos",
"droneId": 5,
"duracaoDoPercurso": 60,
"enderecoDeEntrega": "Avenida Campeche, 100",
"pesoKg": 4,
"valorDoPedido": 1000.99,
"volumeM3": 5
}
Response body
{
"id": 6,
"dataEntregaProgramada": "20/11/2022 12:00",
"duracaoDoPercurso": 60,
"dataProgramadaDaSaida": "20/11/2022 11:00",
"dataConfirmacaoEntrega": "",
"enderecoDeEntrega": "Avenida Campeche, 100",
"status": "aberto",
"descricaoPedido": "Jogo de pratos",
"valorDoPedido": 1000.99,
"droneId": 4,
"pesoKg": 5,
"volumeM3": 5,
"latitude": null,
"longitude": null
}
4. Operação responsável por deletar um pedido
Request
DELETE /dronefeeder/v1/pedido/{id}
curl -X DELETE "http://localhost:8080/dronefeeder/v1/pedido/6" -H "accept: */*"
Response headers
connection: keep-alive
content-length: 0
date: Tue08 Nov 2022 22:55:17 GMT
expires: 0
keep-alive: timeout=60
pragma: no-cache
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
5. Operação responsável por alterar as coordenadas da entrega pelo drone.
Request
PUT /dronefeeder/v1/pedido/atualizacoordenadas
curl -X PUT "http://localhost:8080/dronefeeder/v1/pedido/atualizacoordenadas" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"latitude\": 190, \"longitude\": 300, \"pedidoId\": 2}"
Parameters
{
"latitude": 190,
"longitude": 300,
"pedidoId": 2
}
Response body
{
"id": 2,
"dataEntregaProgramada": "05/11/2022 10:00",
"duracaoDoPercurso": 3,
"dataProgramadaDaSaida": "05/11/2022 09:57",
"dataConfirmacaoEntrega": "",
"enderecoDeEntrega": "Rua São João",
"status": "em andamento",
"descricaoPedido": "caixa de bombons",
"valorDoPedido": 100,
"droneId": 2,
"pesoKg": 10,
"volumeM3": 5,
"latitude": 190,
"longitude": 300
}
6. Operação responsável por cancelar um pedido
Request
PUT /dronefeeder/v1/pedido/cancelar/{id}
curl -X PUT "http://localhost:8080/dronefeeder/v1/pedido/cancelar/7" -H "accept: */*"
Response headers
connection: keep-alive
content-length: 0
date: Tue08 Nov 2022 23:08:41 GMT
expires: 0
keep-alive: timeout=60
pragma: no-cache
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
7. Operação responsável por listar os pedidos do drone
Request
GET /dronefeeder/v1/pedido/drone/{id}
curl -X GET "http://localhost:8080/dronefeeder/v1/pedido/drone/2" -H "accept: application/json"
Response body
[
{
"id": 7,
"dataEntregaProgramada": "20/11/2022 12:00",
"duracaoDoPercurso": 60,
"dataProgramadaDaSaida": "20/11/2022 11:00",
"dataConfirmacaoEntrega": "",
"enderecoDeEntrega": "Avenida Campeche, 100",
"status": "cancelado",
"descricaoPedido": "Jogo de pratos",
"valorDoPedido": 1000.99,
"droneId": 2,
"pesoKg": 5,
"volumeM3": 5,
"latitude": null,
"longitude": null
},
...
]
* Video-controller
1. Operação responsável por listar os vídeos enviados pelos drones
Request
GET /dronefeeder/v1/video
curl -X GET "http://localhost:8080/dronefeeder/v1/video" -H "accept: application/json"
Response body
[
{
"id": 2,
"nomeArquivo": "918c4141-def7-43b7-8708-d2ea6bbd8ada.mp4",
"pedidoId": 5
},
...
]
2. Operação responsável por baixar o vídeo de um pedido
Request
GET /dronefeeder/v1/video/download/{idPedido}
curl -X GET "http://localhost:8080/dronefeeder/v1/video/download/5" -H "accept: */*"
Response body
[Download file]
3. Operação responsável por cadastrar o video enviado pelo drone.
Request
PUT /dronefeeder/v1/pedido/atualizacoordenadas
curl -X PUT "http://localhost:8080/dronefeeder/v1/pedido/atualizacoordenadas" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"latitude\": 190, \"longitude\": 300, \"pedidoId\": 2}"
Parameters
{
"latitude": 190,
"longitude": 300,
"pedidoId": 2
}
Response body
{
"id": 1,
"nomeArquivo": "6ee6da22-200e-445a-97be-2a51b6f0faf6.mp4",
"pedidoId": 1
}
Link para o swagger
http://localhost:8081/dronefeeder/swagger-ui/#/
Link para o Heroku
https://dronefeeder-api.herokuapp.com/dronefeeder/swagger-ui/#/