Skip to content

This project is a microservices system in Java for a delivery application that uses Drones to transport packages

Notifications You must be signed in to change notification settings

tamireshc/java-drone-microservices

Repository files navigation

Drone-Microservices

📌 O Drone-Microservices é um sistema de microserviços para gerenciameto de entregas por drones.

Para este projeto, definimos a criação de quatro microserviços, cada um com uma responsabilidade específica:

  • O primeiro é o Gerenciador de Cadastros, encarregado do gerenciamento dos dados cadastrais dos usuários, dos endereços de entrega e dos drones adicionados ao sistema.
  • O segundo microserviço é o Gerenciador de Pedidos, responsável por gerenciar as informações relacionadas a cada pedido, incluindo a data da solicitação, o seu status, o remetente e o destinatário.
  • O terceiro microserviço, denominado Monitoramento de Drones, é responsável por acompanhar a posição de cada drone associado a um pedido.
  • O quarto microserviço, chamado Notificador, é encarregado de enviar notificações aos usuários, informando-os sobre o status de seus pedidos.

✒️ Todas essas informações são armazenadas em bancos de dados PostgreSQL, cada microserviço possui o seu banco de dados

🔍 Tecnologias utilizadas

🕵 Diagrama UML da API

drones drawio

📋 Execute o projeto em sua máquina com docker compose

Clone o repositório:

git clone https://github.com/tamireshc/java-drone-microservices.git

🔖 Adicione os valores de AWS_ACCESS_KEY e AWS_SECRET_KEY em um arquivo .env na raiz no MS-Notificador.
🔖 Configure o Amazon SNS na AWS.
🔖 Adicione a API_KEY da API distancematrix.ai na raiz do ms-gerenciador-cadastros.

Execute:

docker compose up -d 

🔎 Documentação da API

📃 Microserviço Gerenciador de Cadastros
  • Cadastrar um usuário
  POST /register/user

👉 Não é possível cadastrar CPF e E-mail duplicados.
👉 As senhas são salvas no banco de dados criptografadas com o algorítimo "SHA-256".

Parâmetro Tipo Descrição
nome string nome do usuário
sobrenome string sobrenome do usuário
cpf string CPF do usuário
email string e-mail do usuário
telefone string telefone do usuário
senha string senha de acesso

Corpo da resposta:

{
"id": 1,
"nome": "John",
"sobrenome": "Martinez",
"email": "[email protected]",
"telefone": "5531987198765",
}

✅ STATUS 201 CREATED

  • Buscar um usuário por CPF
  GET /register/user/cpf/:cpf

Corpo da resposta:

{
  "id": 1,
  "nome": "John",
  "sobrenome": "Martinez",
  "email": "[email protected]",
  "enderecos": [
  	{
  		"id": 1,
  		"logradouro": "Andradas",
  		"numero": 200,
  		"complemento": "apt101",
  		"bairro": "Centro",
  		"cidade": "Belo Horizonte",
  		"estado": "Minas Gerais",
  		"cep": "30120-010",
  		"latitude": "-19.8244097",
  		"longitude": "-43.9788706",
  	}
  ],
  "telefone": "5531987191234"
}

✅ STATUS 200 OK

  • Buscar um usuário por id
  GET /register/user/id/:id

Corpo da resposta:

{
  "id": 1,
  "nome": "John",
  "sobrenome": "Martinez",
  "email": "[email protected]",
  "enderecos": [
  	{
  		"id": 1,
  		"logradouro": "Andradas",
  		"numero": 200,
  		"complemento": "apt101",
  		"bairro": "Centro",
  		"cidade": "Belo Horizonte",
  		"estado": "Minas Gerais",
  		"cep": "30120-010",
  		"latitude": "-19.8244097",
  		"longitude": "-43.9788706",
  	}
  ],
  "telefone": "5531987191234"
}

✅ STATUS 200 OK

  • Edição dos dados cadastrais de um usuário
 PUT /register/user/id/:id

👉 Não é permitido editar o CPF.

Parâmetro Tipo Descrição
nome string nome do usuário
sobrenome string sobrenome do usuário
cpf string CPF do usuário
email string e-mail do usuário
telefone string telefone do usuário
senha string senha de acesso

Corpo da resposta:

{
"id": 1,
"nome": "John",
"sobrenome": "Martinez",
"email": "[email protected]",
"telefone": "5531987198765",
}

✅ STATUS 200 OK

  • cadastro de um endereço
 POST /register/address

👉 Não é possível cadastrar um endereço para um usuário inexistente.
👉 Ao cadastrar um novo endereço uma mensagem é enviada a uma fila que irá proceder com uma requisição ao serviço distancematrix.ai para burcar os valores de latitude e longitude do endereço cadastrado e completar as informações no banco de dados.

Parâmetro Tipo Descrição
usuarioId long id do usuário
logradouro string logradouro do usuário
numero long numero do logradouro
complemento string complemento do logradouro
bairro string bairro do logradouro
cidade string cidade do usuário
estado string estado a qual a cidade pertence
cep string CEP do logradouro

Corpo da resposta:

{
  "id": 1,
  "logradouro": "Afonso Pena",
  "numero": 84,
  "complemento": "apt202",
  "bairro": "Centro",
  "cidade": "Belo Horizonte",
  "estado": "Minas Gerais",
  "cep": "30130002",
  "latitude": null,
  "longitude": null,
}

✅ STATUS 201 CREATED

  • Busca os endereços de usuário pelo seu id
GET /register/address/user/:id

Corpo da resposta:

[
  {
  	"id": 1,
  	"logradouro": "Andradas",
  	"numero": 200,
  	"complemento": "apt101",
  	"bairro": "Centro",
  	"cidade": "Belo Horizonte",
  	"estado": "Minas Gerais",
  	"cep": "30120-010",
  	"latitude": "-19.8244097",
  	"longitude": "-43.9788706",
  }
]

✅ STATUS 200 OK

  • Busca um endereço pelo seu id
GET /register/address/:id

Corpo da resposta:

  {
  	"id": 1,
  	"logradouro": "Andradas",
  	"numero": 200,
  	"complemento": "apt101",
  	"bairro": "Centro",
  	"cidade": "Belo Horizonte",
  	"estado": "Minas Gerais",
  	"cep": "30120-010",
  	"latitude": "-19.8244097",
  	"longitude": "-43.9788706",
  }

✅ STATUS 200 OK

  • Deleta um endereço pelo seu id
DELETE /register/address/:id

Corpo da resposta:

Endereço deletado com sucesso

✅ STATUS 200 OK

  • Edita um endereço pelo seu id
PUT /register/address/:id

👉 Ao cadastrar um novo endereço uma mensagem é enviada a uma fila que irá proceder com uma requisição ao serviço distancematrix.ai para burcar os valores de latitude e longitude do endereço cadastrado e completar as informações no banco de dados.

Parâmetro Tipo Descrição
logradouro string logradouro do usuário
numero long numero do logradouro
complemento string complemento do logradouro
bairro string bairro do logradouro
cidade string cidade do usuário
estado string estado a qual a cidade pertence
cep string CEP do logradouro

Corpo da resposta:

{
  "id": 1,
  "logradouro": "Afonso Pena",
  "numero": 84,
  "complemento": "apt202",
  "bairro": "Centro",
  "cidade": "Belo Horizonte",
  "estado": "Minas Gerais",
  "cep": "30130002",
  "latitude": "-19.9650549",
  "longitude": "-43.803484",
}

✅ STATUS 200 OK

  • Cadastro um Drone
POST /register/drone

👉 Não é possível cadastrar um drone com um status inexistente.
👉 Ao cadastrar um novo drone com status Disponível é enviado uma mensagem para uma fila que irá verificar se há algum pedido com pendencia de alocação de um drone para realizar a entrega.

Parâmetro Tipo Descrição
modelo string modelo do drone
marca string marca do drone
ano string ano de fabricação do drone
status string enun dos status possíveis para o drone

Corpo da resposta:

{
"id": 1,
"modelo": "x",
"marca": "DJI",
"ano": "2018",
"status": "DISPONIVEL"
}

✅ STATUS 201 CREATED

  • Busca um drone pelo id
GET /register/drone/:id

Corpo da resposta:

{
"id": 1,
"modelo": "x",
"marca": "DJI",
"ano": "2018",
"status": "DISPONIVEL"
}

✅ STATUS 200 ok

  • Edita o status de um drone
PUT /register/drone/:id/status/:status

👉 Não é possível editar um drone com status diferente dos pré-estabelecidos.
👉 Ao editar um drone para o status Disponível é enviado uma mensagem para uma fila que irá verificar se há algum pedido com pendencia de alocação de um drone para realizar a entrega.

Corpo da resposta:

{
"id": 1,
"modelo": "x",
"marca": "DJI",
"ano": "2018",
"status": "EM_ROTA"
}

✅ STATUS 200 OK

  • Busca todos os drones cadastrados
GET /register/drone

Corpo da resposta:

[
  {
  	"id": 1,
  	"modelo": "x",
  	"marca": "DJI",
  	"ano": "2018",
  	"status": "EM_ROTA"
  },
  {
  	"id": 2,
  	"modelo": " z908",
  	"marca": "xiaomi",
  	"ano": "2024",
  	"status": "DISPONIVEL"
  }
]

✅ STATUS 200 OK

  • Busca drones por tipo de status
GET /register/drone/status/:status

👉 Não é possível buscar um drone com status diferente dos pré-estabelecidos.

Corpo da resposta:

[
  {
  	"id": 1,
  	"modelo": "x",
  	"marca": "DJI",
  	"ano": "2018",
  	"status": "EM_ROTA"
  },
  {
  	"id": 2,
  	"modelo": " z908",
  	"marca": "xiaomi",
  	"ano": "2024",
  	"status": "EM_ROTA"
  }
]

✅ STATUS 200 OK

❌ Casos de Falhas do Microserviço Gerenciador de Cadastros
  • Ao tentar cadastrar um usuário com CPF e e-mail já existentes na base de dados deve emitir a exceção UsuarioExistenteException

    ⚠️ STATUS 409 - CONFLICT
   CPF ou Email já cadastrado
  • Ao buscar por um usuário inexistente deve emitir a exceção UsuarioNaoExistenteException

    ⚠️ STATUS 404 - NOT FOUND
   Usuário não encontrado
  • Ao tentar edita o CPF de um usuário deve emitir a exceção EdicaoNaoPermitidaException

    ❌ STATUS 403 - FORBIDDEN
   Edição não permitida
  • Ao buscar por um endereço inexistente deve emitir a exceção EnderecoNaoExistenteException

    ⚠️ STATUS 404 - NOT FOUND
   Endereço não encontrado
  • Ao tentar cadastrar, editar ou buscar por um drone com um status diferente dos pré-estabelecidos deve emitir a exceção StatusInvalidoExceptionn

    ❌ STATUS 403 - FORBIDDEN
   Status inexistente
  • Ao buscar por um drone inexistente deve emitir a exceção DroneNaoExistenteException

    ⚠️ STATUS 404 - NOT FOUND
   Drone não encontrado
🎁 Microserviço Gerenciador de Pedidos
  • Cadastro de um Pedido
POST /order

👉 Ao cadastrar um novo pedido é verificado de forma sincrona se o remetente, destinatário e o endereço estão cadastrado no banco de dados.
👉 Ao cadastrar o pedido é enviado uma mensagem para uma fila que irá buscar um drone com status disponível para realizar a entrega.
👉Ao cadastrar um pedido o remetente é o destinatário são notificados via SMS.
👉 Não é possível cadastrar um pedido quando o microserviço gerenciador de cadastros está indisponível.

Parâmetro Tipo Descrição
dataPedido LocalDateTime data do pedido
status: string "criado"
remetenteId long id de identificação do remetente
destinatarioId long id de identificação do destinatário
enderecoId long id de identificação do endereço de entrega

Corpo da resposta:

{
  "id": 1,
  "dataPedido": "2024-12-03T10:15:30",
  "dataEntrega": null,
  "status": "CRIADO",
  "endereco": {
  	"logradouro": "Afonso Pena",
  	"numero": 84,
  	"complemento": "apt202",
  	"bairro": "Centro",
  	"cidade": "Belo Horizonte",
  	"estado": "Minas Gerais",
  	"cep": "30130002"
  },
  "remetente": {
  	"id": 1,
  	"nome": "Joe",
  	"sobrenome": "Batista",
  	"email": "[email protected]",
  	"telefone": "5531987191832"
  },
  "destinatario": {
  	"id": 1,
  	"nome": "Joe",
  	"sobrenome": "Batista",
  	"email": "[email protected]",
  	"telefone": "5531987191832"
  },
  "droneId": null
}

✅ STATUS 201 CREATED

  • Busca um pedido pelo id
GET /order/:id

👉 Não é possível buscar um pedido quando o microserviço gerenciador de cadastros está indisponível.

Corpo da resposta:

{
  "id": 1,
  "dataPedido": "2024-12-03T10:15:30",
  "dataEntrega": null,
  "status": "CRIADO",
  "endereco": {
  	"logradouro": "Afonso Pena",
  	"numero": 84,
  	"complemento": "apt202",
  	"bairro": "Centro",
  	"cidade": "Belo Horizonte",
  	"estado": "Minas Gerais",
  	"cep": "30130002"
  },
  "remetente": {
  	"id": 1,
  	"nome": "Joe",
  	"sobrenome": "Batista",
  	"email": "[email protected]",
  	"telefone": "5531987191832"
  },
  "destinatario": {
  	"id": 1,
  	"nome": "Joe",
  	"sobrenome": "Batista",
  	"email": "[email protected]",
  	"telefone": "5531987191832"
  },
  "droneId": 1
}

✅ STATUS 200 OK

  • Busca todos os pedidos de um usuário pelo id do usuário
GET /order/user/:id

👉 Não é possível buscar um pedido pelo usuário id quando o microserviço gerenciador de cadastros está indisponível.

Corpo da resposta:

[
  {
  "id": 1,
  "dataPedido": "2007-12-03T10:15:30",
  "dataEntrega": null,
  "status": "CRIADO",
  "enderecoId": 1,
  "remetenteId": 1,
  "destinatarioId": 2,
  "droneId": null
  }
]

✅ STATUS 200 OK

  • Edita um pedido pelo id
PUT /order/:id

👉 Não é possível editar um pedido com status diferente dos pré-estabelecidos, com remetente, destinatário, endereço e drone não cadastrados e quando o microserviço gerenciador de cadastros está indisponível. Não é possível editar o drone de um pedido quando o seu status é diferente do disponível, ou quando o pedido já está em rota ou finalizado.
👉 Não possível editar o status do pedido para "EM_ROTA" pois existe uma endpoint exclusivo para esta alteração.
👉 Ao editar o status de um pedido o remetente e destinatário recebem um SMS notificado da ação.

Parâmetro Tipo Descrição
dataPedido LocalDateTime data do pedido
dataEntrega LocalDateTime data do pedido
status string "criado"
remetenteId long id de identificação do remetente
destinatarioId long id de identificação do destinatário
enderecoId long id de identificação do endereço de entrega
droneId long id de identificação do drone destinado a realizar a entrega

Corpo da resposta:

{
  "id": 1,
  "dataPedido": "2024-12-03T10:15:30",
  "dataEntrega": "2024-12-03T10:15:30",
  "status": "CANCELADO",
  "endereco": {
  	"logradouro": "Afonso Pena",
  	"numero": 84,
  	"complemento": "apt202",
  	"bairro": "Centro",
  	"cidade": "Belo Horizonte",
  	"estado": "Minas Gerais",
  	"cep": "30130002"
  },
  "remetente": {
  	"id": 1,
  	"nome": "Joe",
  	"sobrenome": "Batista",
  	"email": "[email protected]",
  	"telefone": "5531987191832"
  },
  "destinatario": {
  	"id": 1,
  	"nome": "Joe",
  	"sobrenome": "Batista",
  	"email": "[email protected]",
  	"telefone": "5531987191832"
  },
  "droneId": 3
}

✅ STATUS 200 OK

  • Edita o status do pedido para EM_ROTA
PUT /order/new_monitor/:idPedido

👉 O pedido somente pode ser colocado EM_ROTA caso o seu status esteja como CRIADO.
👉 Ao se colocar um pedido EM_ROTA é envidao uma mensagem para uma fila que irá criar o seu primeiro ponto de monitoramento.
👉 Ao colocar o pedido EM_ROTA o remetente e destinatário recebem um SMS de notificação.

Parâmetro Tipo Descrição
latitude string latitude do endereço de onde houve a saída do drone
longitude string longitude do endereço de onde houve a saída do drone

✅ STATUS 204 NO CONTENT

❌ Casos de Falhas do Microserviço Gerenciador de Pedidos
  • Ao tentar cadastrar um pedido com um status diferente dos pré-estabelecidos deve emitir a exceção StatusInvalidoException

    ❌ STATUS 403 - FORBIDDEN
   Status inexistente
  • Ao buscar por um pedido inexistente deve emitir a exceção PedidoInexistenteException

    ⚠️ STATUS 404 - NOT FOUND
   Pedido não encontrado
  • Ao buscar por um pedido pelo usuárioId inexistente deve emitir a exceção UsuarioNaoExistenteException

    ⚠️ STATUS 404 - NOT FOUND
   Usuário não encontrado
  • Ao buscars os dados do remetente, destinatário e endereço com o ms-gerenciador de cadastros indisponível deve emitir a exceção ServicoIndisponivelException

    ❌ STATUS 503 - SERVICE_UNAVAILABLE
   Serviço ms-gerenciador-cadastros indisponível
  • Ao tentar editar o o status de um pedido para "EM_ROTA" fora do endpoint designado para esta ação deve emitir a exceção OperacaoInvalidaException

    ❌ STATUS 403 - FORBIDDEN
   Status do pedido não pode ser alterado para EM_ROTA
  • Ao tentar alocar um drone para um pedido e este não possuir o status DISPONÍVEL deve emitir a exceção OperacaoInvalidaException

    ❌ STATUS 403 - FORBIDDEN
   Não é possível alocar este drone para este pedido
  • Ao tentar alocar para um pedido um drone não existente na base de dados deve emitir a exceção DroneNaoExistenteException

    ⚠️ STATUS 404 - NOT FOUND
   Drone não encontrado
  • Ao tentar alterar o drone de um pedido quem possiu o status "EM_ROTA", "ENTREGUE" ou "CANCELADO" deve emitir a exceção OperacaoInvalidaException

    ❌ STATUS 403 - FORBIDDEN
   Não é possível alterar o drone deste pedido
  • Ao tentar colocar EM_ROTA um pedido com status diferente de "CRIADO" deve emitir a exceção OperacaoInvalidaException

    ❌ STATUS 403 - FORBIDDEN
   Pedido não pode ser colocado em rota
  • Ao tentar colocar EM_ROTA um pedido que não teve um drone designado deve emitir a exceção OperacaoInvalidaException

    ❌ STATUS 403 - FORBIDDEN
   Pedido não possui drone
🔭 Microserviço Monitoramento de Drones
  • Cadastra um ponto de monitoramento
POST/monitor
Parâmetro Tipo Descrição
pedidoId long id do pedido
droneId long id do drone
latitude string latitude do ponto
longitude string longitude do ponto

Corpo da resposta:

{
  "id": 5,
  "pedidoId": 1,
  "droneId": 1,
  "latitude": "19.000",
  "longitude": "19.000"
}

✅ STATUS 201 NO CREATED

  • Busca todos os pontos de monitoramento de um pedido
GET /monitor/:pedidoid

Corpo da resposta:

[
  {
  	"id": 1,
  	"pedidoId": 1,
  	"droneId": 2,
  	"latitude": "19.001",
  	"longitude": "20.002"
  },
  {
  	"id": 5,
  	"pedidoId": 1,
  	"droneId": 1,
  	"latitude": "19.002",
  	"longitude": "20.002"
  }
]

✅ STATUS 200 OK

  • Edita um ponto de monitoramento
PUT/monitor/:id
Parâmetro Tipo Descrição
latitude string latitude do ponto
longitude string longitude do ponto

Corpo da resposta:

{
  "id": 5,
  "pedidoId": 1,
  "droneId": 1,
  "latitude": "19.000",
  "longitude": "19.000"
}

✅ STATUS 200 OK

  • Deleta um ponto de monitoramento
DELETE/monitor/:id

✅ STATUS 204 NO CONTENT

  • Deleta o monitoramento de um pedido
DELETE/monitor/order/:pedidoid

✅ STATUS 204 NO CONTENT

❌ Casos de Falhas do Microserviço de Monitoramento de Drones
  • Ao tentar cadastrar, editar ou buscar por um monitoramento de um pedido inexistente deve emitir a exceção PedidoNaoEncontradoException

    ⚠️ STATUS 404 - NOT FOUND
   Pedido não encontrado
  • Ao tentar editar ou buscar por um ponto de monitoramento inexistente deve emitir a exceção MonitoramentoNaoExistenteException

    ⚠️ STATUS 404 - NOT FOUND
   Monitoramento não encontrado

About

This project is a microservices system in Java for a delivery application that uses Drones to transport packages

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published