Loading repository data…
Loading repository data…
BL7Ki / repository
O BoraComer é um sistema backend desenvolvido em Java com Spring Boot, com o objetivo de oferecer uma plataforma compartilhada de gestão para pequenos e médios restaurantes. Esse projeto foi desenvolvido como parte do Tech Challenge, integrando conhecimentos adquiridos nas disciplinas da pós-graduação em Arquitetura e Desenvolvimento Java (FIAP).
branch: Main
https://github.com/BL7Ki/BoraComer
Descrição do problema
O projeto "Bora Comer" visa atender à necessidade de um sistema de gestão para restaurantes, permitindo o gerenciamento eficiente de usuários, cardápios e pedidos.
Objetivo do projeto
Desenvolver um backend robusto utilizando Spring Boot para gerenciar usuários e atender aos requisitos definidos, seguindo boas práticas de desenvolvimento e princípios de design como SOLID.
git clone https://github.com/BL7Ki/BoraComer.git
cd bora-comer
data.sql.application-test.yml:spring:
jpa:
hibernate:
ddl-auto: none
sql:
init:
mode: always
mvn spring-boot:run
mvn clean package
O arquivo será gerado em ./target.docker-compose.yml e ajuste o nome do JAR no serviço app se necessário.docker-compose up --build
http://localhost:8080
collection/ # Coleção do Insomnia para testes arquivos json requisições
src/
├── main/
│ ├── java/
│ │ ├── br/com/sistemalima/app/
│ │ │ ├── modelo/
│ │ │ │ ├── config/ # Configurações adicionais
│ │ │ │ ├── core/ # Camada de domínio e casos de uso
│ │ │ │ │ ├── domain/ # Entidades de domínio
│ │ │ │ │ ├── errors/ # Exceções e erros personalizados
│ │ │ │ │ ├── gateway/ # Interfaces de gateway responsável por abstraem a comunicação entre os casos de uso (use cases) e a camada de infraestrutura.
│ │ │ │ │ ├── usercase/ # Interfaces e implementações dos casos de uso
│ │ │ │ │ │ ├── user # Exemplo de caso de uso usuario
│ │ │ │ │ │ │ ├── impl/ # Implementações dos casos de uso usuario
│ │ │ │ │ │ ├── login/ # Exemplo de caso de uso login
│ │ │ │ │ │ │ ├── impl/ # Implementações dos casos de uso login
│ │ │ │ │ ├── mapper/ # Mapeadores de domínio
│ │ │ │ ├── infra/ # Camada de infraestrutura
│ │ │ │ │ ├── delivery/ # Controladores e mapeadores de DTOs
│ │ │ │ │ ├── gateway/ # Implementações de gateways (persistência e APIs externas)
│ │ │ │ │ ├── persistence/ # Persistência
│ │ │ │ │ │ ├── entity/ # Entidades mapeadas para persistência
│ │ │ │ │ │ ├── mapper/ # Mapeadores para conversão entre entidades de persistência e objetos de domínio
│ │ │ │ │ │ ├── repository/ # Interfaces e implementações de repositórios
│ │ │ │ ├── application/ # Configurações da aplicação
``
Descrição da Arquitetura
O sistema foi desenvolvido utilizando a Clean Architecture (Arquitetura Limpa), promovendo a separação de responsabilidades e facilitando a manutenção e evolução do código.
+------------------------------------------------------------+
| Camada de Infraestrutura |
| (Controllers REST, Mappers, Frameworks) |
+-----------------------------+------------------------------+
|
v
+----------------+ +---------------------+ +-------------------+
| Camada de |<--->| Camada de Casos |<--->| Camada de |
| Persistência | | de Uso (UseCases) | | Domínio |
| (Entities, | | (Interfaces e Impl) | | (Entidades, |
| Repositórios) | +---------------------+ | Regras de Negócio|
+----------------+ +----------------------+
^
|
+-----------------------------+------------------------------+
| Camada de Gateway |
| (Abstrações para APIs externas e persistência) |
+------------------------------------------------------------+
Camada de Infraestrutura: Controllers REST, mapeadores de DTOs, integração com frameworks.
Camada de Casos de Uso: Interfaces e implementações dos casos de uso.
Camada de Domínio: Entidades centrais e regras de negócio.
Camada de Persistência: Entidades JPA e repositórios.
Camada de Gateway: Interfaces que abstraem a comunicação entre os casos de uso e a infraestrutura, como persistência e APIs externas.
Fluxo: Usuário → Controller (Infra) → UseCase (Aplicação) → Domínio → Gateway → Persistência (Repository/Entity) E vice-versa para respostas.
CreateUserController depende da interface CreateUserUseCase, e não de sua implementação concreta.CreateUserUseCaseImpl utiliza a abstração UserMapper para realizar o mapeamento de objetos.User e Address.CreateUserUseCase e SearchUserUseCase.Os mappers são responsáveis por converter objetos entre diferentes camadas da aplicação, garantindo que os dados sejam transformados corretamente.
UserMapper converte um UserRequestDTO recebido na camada de entrega (infra/delivery) para um User utilizado na camada de domínio, e vice-versa.Essa abordagem promove a separação de responsabilidades e mantém as camadas desacopladas.
UserEntity, e os repositórios que interagem com o banco de dados.JpaRepository, permitindo operações CRUD sem a necessidade de implementação manual.UserRepository é uma interface que estende JpaRepository<UserEntity, Long>, permitindo operações como salvar, buscar e deletar usuários.@Entity, @Table, @Column, etc.UserEntity é anotada com @Entity e possui os atributos id, name, email, etc., mapeados para as colunas da tabela correspondente no banco de dados.| Endpoint | Método | Descrição |
|---|---|---|
/users | POST | Criar um novo usuário. |
/users/{id} | GET | Buscar um usuário por ID. |
/users | GET | Buscar todos os usuários com paginação. |
/users/{id} | PUT | Atualizar um usuário por ID. |
/users/{id} | DELETE | Deletar um usuário por ID. |
/users/{id}/change-password | PUT | Trocar a senha do usuário. |
/login | POST | Validar o login do usuário. |
Requisição:
PUT /users/{id}/change-password
Content-Type: application/json
{
"currentPassword": "senhaAntiga",
"newPassword": "senhaNova"
}
{
"message": "Senha alterada com sucesso."
}
Resposta:
{
"status": 400,
"error": "BAD_REQUEST",
"message": "Senha atual incorreta.",
"path": "/users/1/change-password"
}
Requisição:
POST /users
Content-Type: application/json
{
"nome": "Joao Silva ",
"email": "joao.silva@example.com",
"login": "tiagosilva",
"senha": "senha123",
"endereco": {
"rua": "Rua das Flores doces",
"bairro": "Bairro das cascatas pretas",
"cidade": "Minas",
"estado": "PE",
"cep": "12345-400"
},
"papel": "ADMIN",
"tipo_usuario": {
"name": "CLIENTE"
}
}
Resposta:
{
"id": 2,
"nome": "Joao Silva ",
"email": "joao.silva@example.com",
"nome_usuario": "tiagosilva",
"endereco": {
"rua": "Rua das Flores doces",
"bairro": "Bairro das cascatas pretas",
"cidade": "Minas",
"estado": "PE",
"cep": "12345-400"
},
"papel": "ADMIN",
"data_criacao": "2025-07-13T15:17:20.601449100",
"data_alteracao": null,
"tipo_usuario": "CLIENTE"
}
O endpoint /login permite validar as credenciais de um usuário. Ele verifica o login e a senha fornecidos e retorna uma mensagem indicando o sucesso ou falha da autenticação.
Requisição:
POST /login
Content-Type: application/json
{
"login": "admin",
"password": "senhaAdmin123"
}
Resposta: Login bem-sucedido (HTTP 200):
{
"message": "Login realizado com sucesso."
}
Credenciais inválidas (HTTP 401):
{
"message": "Credenciais inválidas."
}
http://localhost:8080Para rodar os testes automatizados:
mvn test
Contribuições são bem-vindas! Para contribuir:
git checkout -b minha-feature).git commit -m 'Minha nova feature').