Sistema de delivery desenvolvido em **Spring Boot 3.5.7 e Java 21.
-
Java 21 (LTS)
-
Spring Boot 3.5.7
- Spring Web
- Spring Data JPA
- Validation (Jakarta Validation)
-
Banco: H2 (em memória)
-
Lombok
-
DevTools
-
Maven
- Records
- Text Blocks
- Pattern Matching
- (Pronto para) Virtual Threads
- Campos:
id,nome,email (único),telefone,endereco,dataCadastro,ativo - Validações:
@NotBlank(nome),@Email(email),@Patterne@Size(telefone) @PrePersist: setadataCadastroeativo = truese nulo- Operação:
inativar()
- Campos:
id,nome,cnpj (único, regex),categoria,telefone,email (único),endereco,latitude,longitude,horarioAbertura/Fechamento,estado (ABERTO|FECHADO|MANUTENCAO),dataCadastro,ativo - Importante: removida a coleção
produtospara evitarLazyInitializationExceptionna serialização - Operações auxiliares:
inativar(),atualizarEstado(),isAberto()etc.
- Campos:
id,nome,descricao,categoria (BEBIDAS|COMIDAS|SOBREMESAS),estoque,preco (BigDecimal),ativo,dataCadastro,restaurante (ManyToOne) @PrePersist: setadataCadastro, normalizaativoe zera estoque negativo- Operações:
ativar(),inativar()
- Campos:
id,cliente (ManyToOne),restaurante (ManyToOne),nota (enum: PESSIMO|RUIM|REGULAR|BOM|OTIMO|EXCELENTE),comentario,dataAvaliacao @PrePersist: setadataAvaliacao- Repositório inclui ranking por média de notas (projeção
RestauranteMediaView)
-
Campos:
id,numeroPedido,status (enum: PENDENTE|CONFIRMADO|ENTREGUE|CANCELADO),valorTotal,observacoes,cliente (ManyToOne),restaurante (ManyToOne) -
DTOs internos do
PedidoService:CreatePedidoRequest(clienteId, restauranteId, observacoes, valorTotal)PedidoResponse(id, numeroPedido, status, valorTotal, clienteNome, restauranteNome)
-
Regras de transição de status:
PENDENTE -> CONFIRMADO | CANCELADOCONFIRMADO -> ENTREGUE | CANCELADOENTREGUEeCANCELADOsão estados finais
GET /health→ status UP + timestamp + serviceGET /health/info→ metadados (app, versão, dev, RA, curso, campus, Java, Spring)
GET /clientes→ lista clientes ativosGET /clientes/{id}→ busca por idGET /clientes/buscar?nome=→ busca contendo (case-insensitive)GET /clientes/email?value=→ busca por e-mailPOST /clientes→ cadastraPUT /clientes/{id}→ atualizaPUT /cliente/ativar/{id}→ ativa cliente inativoDELETE /clientes/{id}→ inativa (soft delete)
GET /restaurantes→ lista restaurantes ativosGET /restaurantes/{id}→ busca por idGET /restaurantes/buscar?nome=→ busca contendo (case-insensitive)GET /restaurantes/email?value=→ busca por e-mailGET /restaurantes/estado?value=ABERTO|FECHADO|MANUTENCAO→ busca por estado do restaurante ABERTO|FECHADO|MANUTENCAOPOST /restaurantes→ cadastraPOST /restaurantes/{restauranteId}/produtos→ adiciona produto a um restaurantePUT /restaurantes/{id}→ atualizaDELETE /restaurantes/{id}→ inativa
GET /produtos→ lista todosGET /produtos/{id}→ busca por idGET /produtos/nome?value=→ busca contendo (case-insensitive)GET /produtos/categoria?categoria=BEBIDAS|COMIDAS|SOBREMESASGET /produtos/preco?min=&max=→ faixa de preçoGET /produtos/ativos→ somente ativosGET /produtos/inativos→ somente inativosGET /produtos/restaurante/{id}→ produtos de um restaurantePUT /produtos/{id}/estoque?quantidade=→ atualiza estoquePUT /produtos/{id}→ atualizaPOST /produtos→ cadastraDELETE /produtos/{id}→ inativa
GET /avaliacoes/{id}→ busca por idGET /avaliacoes/restaurante/{id}ouGET /avaliacoes/restaurante?id=GET /avaliacoes/cliente/{id}ouGET /avaliacoes/cliente?id=GET /avaliacoes/nota?nota=PESSIMO|RUIM|REGULAR|BOM|OTIMO|EXCELENTEGET /avaliacoes/restaurantes/ordenados-por-nota→ Busca ordenada em ordem ascendentePOST /avaliacoes→ cadastraPUT /avaliacoes/{id}→ atualiza nota/comentárioDELETE /avaliacoes/{id}→ remove
Atenção: verifique o
@RequestMappingdo controller de avaliações. Use/avaliacoes(sem o typo/avaliaccoes).
GET /pedidos→ lista (DTOPedidoResponse)GET /pedidos/{id}→ busca (DTOPedidoResponse)POST /pedidos→ cria (DTOCreatePedidoRequest)PUT /pedidos/{id}/status?status=PENDENTE|CONFIRMADO|ENTREGUE|CANCELADO→ transição com validaçãoDELETE /pedidos/{id}→ cancela (atalho para setarCANCELADO)
POST /clientes
{
"nome": "João Silva",
"email": "joao@email.com",
"telefone": "(11) 99999-1111",
"endereco": "Rua A, 123"
}POST /restaurantes
{
"nome": "Pizzaria Bella",
"cnpj": "12.345.678/0001-90",
"categoria": "Italiana",
"telefone": "(11) 3333-1111",
"email": "contato@pizzariabella.com",
"endereco": "Av. Paulista, 1000"
}POST /restaurantes/1/produtos
{
"nome": "Pizza Margherita",
"descricao": "Molho de tomate, mussarela e manjericão",
"categoria": "COMIDAS",
"estoque": 10,
"preco": 35.90
}POST /pedidos
{
"clienteId": 1,
"restauranteId": 1,
"observacoes": "Sem cebola",
"valorTotal": 54.80
}PUT /pedidos/1/status?status=CONFIRMADO
-
Pré-requisitos: JDK 21
-
Clonar o repositório
git clone https://github.com/VictorHFMartins/DeliveryTech_JavaSpring.git -
Executar
mvn spring-boot:run -
Acessos
- Health:
http://localhost:8080/health - Health (info):
http://localhost:8080/health/info - H2 Console:
http://localhost:8080/h2-console
- Health:
- URL JDBC:
jdbc:h2:mem:testdb - Usuário/Senha: (padrão do Spring/H2 — ajuste em
application.propertiesse necessário)
- Enums como
STRING: certifique-se de mapear@Enumerated(EnumType.STRING)(ex.:Pedido.status) e alinhar qualquerschema.sql/data.sqlpara evitar erros de conversão (ex.: H2 tentando lerPENDENTEcomo numérico). - Lazy vs JSON: para evitar
LazyInitializationExceptionna serialização, não exponha coleções@OneToManydiretamente no JSON (ex.: removemosList<Produto>deRestaurante). Considere DTOs ou@JsonIgnore. - Validações: as entidades usam
Jakarta Validation. Campos obrigatórios e formatos (e-mail, telefone, CNPJ) já estão cobertos.
- Finalizar listagem de produtos por restaurante (garantir query correta no service/repository).
- Adicionar endpoint opcional: listar restaurantes por
estado. - Implementar paginação e ordenação nos endpoints mais volumosos.
- Adicionar ControllerAdvice para padronizar erros (quando você quiser).
Victor Hugo Faria Martins Universidade Anhembi Morumbi Extensão: Arquitetura de Sistemas API REST Full com Spring Boot
Desenvolvido com Java 21 e Spring Boot 3.5.x — uso acadêmico/educacional.