Skip to content

About

Sistema de agendamento para barbearia — Backend API com Java + Spring Boot

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

✂️ RaphaBarber — Sistema Inteligente de Barbearia

Java Spring Boot Spring Security PostgreSQL JWT Maven

Status License

CI

Uma plataforma completa para gerenciar sua barbearia com segurança, profissionalismo e facilidade. 💈✨

Acesse o Sistema


📖 Sobre o Projeto

O RaphaBarber é um sistema Full Stack moderno desenvolvido para barbearias gerenciarem seus negócios de forma eficiente. Com autenticação segura, agendamentos inteligentes e um painel administrativo, o Rapha pode focar no que faz de melhor: cortes impecáveis! 💇

Fase Atual: Sistema completo (Frontend + Backend) com toda a lógica de segurança, serviços e agendamentos implementada e em produção — backend no Render, frontend na Vercel. 🚀


✨ Funcionalidades Principais

👤 Autenticação & Segurança

  • ✅ Registro seguro de usuários (clientes e admin)
  • ✅ Login com geração de JWT Token
  • ✅ Senhas criptografadas (bcrypt)
  • ✅ Controle de acesso por Roles (ADMIN/CLIENTE)
  • ✅ Token com expiração de 24 horas
  • ✅ Rate limiting por IP em /auth/registrar e /auth/login (5 tentativas a cada 15 min, depois retorna 429)

🖼️ Portfólio

  • ✅ Galeria de cortes da barbearia (leitura pública, escrita restrita a ADMIN)
  • ✅ Validação da URL da imagem (precisa ser https e apontar para png/jpg/jpeg/webp/gif)

✂️ Gerenciamento de Serviços

  • ✅ CRUD completo de serviços
  • ✅ Definição de preços e duração
  • ✅ Descrições detalhadas
  • ✅ Validações profissionais

📅 Sistema de Agendamentos

  • ✅ Agendamento com validação de data/hora
  • ✅ Controle de disponibilidade (sem conflitos)
  • ✅ Status do agendamento (AGENDADO, CONCLUÍDO, CANCELADO)
  • ✅ Agenda diária do Rapha
  • ✅ Histórico completo de cada agendamento
  • ✅ Atualização e cancelamento de agendamentos

🛡️ Segurança & Validações

  • ✅ Spring Security integrado
  • ✅ Validação em todas as camadas (Controller → Service → Database)
  • ✅ Mensagens de erro claras e úteis
  • ✅ Proteção contra SQL Injection (JPA)

🏗️ Arquitetura e Estrutura

raphabarber/ ├── src/main/java/com/claudio/dev/raphabarber/ │ ├── controller/ 🌐 Endpoints HTTP │ │ ├── AuthController.java │ │ ├── ServicoController.java │ │ ├── AgendamentoController.java │ │ └── PortfolioController.java │ │ │ ├── service/ 🧠 Lógica de Negócio │ │ ├── UsuarioService.java │ │ ├── ServicoService.java │ │ ├── AgendamentoService.java │ │ ├── PortfolioService.java │ │ ├── JwtService.java │ │ └── RateLimiterService.java │ │ │ ├── repository/ 🗄️ Acesso ao Banco │ │ ├── UsuarioRepository.java │ │ ├── ServicoRepository.java │ │ ├── AgendamentoRepository.java │ │ └── PortfolioRepository.java │ │ │ ├── model/ 📦 Entidades (JPA) │ │ ├── Usuario.java │ │ ├── Servico.java │ │ ├── Agendamento.java │ │ ├── Portfolio.java │ │ ├── StatusAgendamento.java │ │ └── UserRole.java │ │ │ ├── config/ ⚙️ Configuração │ │ ├── SecurityConfig.java │ │ ├── JwtAuthenticationFilter.java │ │ ├── AdminSeeder.java │ │ └── OpenApiConfig.java │ │ │ ├── exception/ 🚨 Tratamento de Erros │ │ ├── GlobalExceptionHandler.java │ │ └── AcessoNegadoException.java │ │ │ └── RaphabarberApplication.java │ └── src/main/resources/ └── application.properties ⚙️ Configurações

📊 Fluxo de Dados

Cliente HTTP Request ↓ Controller (Valida entrada) ↓ Service (Lógica de negócio) ↓ Repository (JPA) ↓ PostgreSQL Database ↓ Response JSON 200/400/404


🔌 Endpoints da API

🔑 Autenticação (/auth)

Método Endpoint Descrição
POST /registrar Registrar novo usuário
POST /login Fazer login (retorna JWT)

✂️ Serviços (/servicos)

Método Endpoint Descrição
GET /servicos Listar todos os serviços
GET /servicos/{id} Buscar serviço por ID
POST /servicos Criar novo serviço ⭐
PUT /servicos/{id} Atualizar serviço ⭐
DELETE /servicos/{id} Deletar serviço ⭐

📅 Agendamentos (/agendamentos) — todos exigem autenticação

Método Endpoint Descrição
GET /agendamentos Listar agendamentos ativos — admin vê todos, cliente vê só os seus
GET /agendamentos/{id} Buscar agendamento por ID (403 se não for o dono nem admin)
GET /agendamentos/dia?data=YYYY-MM-DD 📅 Agenda do dia — restrito a ADMIN (403 para cliente)
POST /agendamentos Criar novo agendamento
PUT /agendamentos/{id} Atualizar agendamento
DELETE /agendamentos/{id} Cancelar agendamento

🖼️ Portfólio (/portfolio)

Método Endpoint Descrição
GET /portfolio Listar itens da galeria
POST /portfolio Adicionar item ⭐
DELETE /portfolio/{id} Remover item ⭐

⭐ Requer autenticação (token JWT) com role ADMIN

📄 Documentação interativa: com o backend rodando, acesse http://localhost:8080/swagger-ui/index.html para ver e testar todos os endpoints (Swagger/OpenAPI). Clique em Authorize e informe Bearer {seu_token} para testar rotas protegidas direto pela interface.


🧪 Testes automatizados

./mvnw test

Suíte com testes unitários (regras de negócio, isolados com Mockito) e de integração (MockMvc batendo nos endpoints de verdade, com H2 em memória — não precisa de PostgreSQL local). Detalhes de cobertura e estratégia em TESTES.md.


🐳 Rodando com Docker

Sobe a API + PostgreSQL com um único comando, sem precisar instalar Java/Maven/Postgres localmente:

cp .env.example .env   # preencha JWT_SECRET, ADMIN_EMAIL e ADMIN_PASSWORD
docker compose up --build

A API fica disponível em http://localhost:8080 e o Swagger em http://localhost:8080/swagger-ui/index.html.


☁️ Deploy no Render

O repositório tem um render.yaml (Blueprint) descrevendo a API (via Docker) + um banco PostgreSQL gerenciado:

  1. Suba o repositório no GitHub (se ainda não estiver lá).
  2. No painel do Render: New > Blueprint, selecione o repositório.
  3. O Render lê o render.yaml e pede os dois valores que não ficam no arquivo: APP_ADMIN_EMAIL e APP_ADMIN_PASSWORD (credenciais do admin/Rapha, criadas automaticamente no primeiro start).
  4. Clique em Apply — ele provisiona o banco, builda a imagem Docker e sobe a API.
  5. Se o domínio do frontend em produção mudar, atualize CORS_ALLOWED_ORIGINS no render.yaml (ou direto nas variáveis de ambiente do serviço, pelo painel).

Plano gratuito: o serviço web "dorme" depois de ~15 min sem tráfego (a primeira requisição depois demora para responder) e o banco Postgres free expira 30 dias após criado. Tranquilo para portfólio/demonstração — para produção de verdade, migre para um plano pago antes.


🚀 Tecnologias Stack

Backend

Tecnologia Versão Função
Java 17 Linguagem principal
Spring Boot 3.x Framework Web/Rest
Spring Security 6.x Autenticação
Spring Data JPA 3.x ORM Hibernate
JWT (JJWT) 0.11.5 Tokens seguros
PostgreSQL 16 Banco de dados
Maven 3.9+ Build & Dependências
springdoc-openapi 2.9.1 Documentação interativa (Swagger UI)
JUnit 5 + Mockito + H2 - Testes unitários e de integração
Docker Compose - Ambiente local (API + PostgreSQL)

Frontend

Tecnologia Função
React.js Interface do Usuário
Vite Build Tool rápida
Tailwind CSS Estilização Responsiva
Axios Consumo da API

Segurança

  • 🔐 Spring Security para autenticação/autorização
  • 🔑 JWT (JSON Web Tokens) para sessões
  • 🔒 BCrypt para hash de senhas
  • ✅ Validações em camadas (Controller → Service)

📋 Checklist de Funcionalidades

✅ Fase 1: Motor e Segurança

  • ✅ Repositório e dependências
  • ✅ Banco de dados PostgreSQL
  • ✅ Spring Security + JWT
  • ✅ AuthController (Cadastro/Login)

✅ Fase 2: Coração do Negócio

  • ✅ Classe Servico e Agendamento
  • ✅ Métodos de agendamento e visualização de horários
  • ✅ Validações de conflito de horários

✅ Fase 3: Interface (Frontend)

  • ✅ Projeto React com Vite e Tailwind CSS
  • ✅ Tela de login/cadastro integrada ao JWT
  • ✅ Painel de agendamentos funcional (Admin e Cliente)
  • ✅ Consumo de rotas protegidas com Axios

✅ Fase 4: Lançamento

  • ✅ Deploy do banco e API (Render)
  • ✅ Deploy do Frontend (Vercel)
  • ✅ Vídeo de demonstração (LinkedIn)

✅ Fase 5: Fundação de Qualidade

  • ✅ Correção do conflito de horário (agora considera a duração do serviço, não só o timestamp exato)
  • ✅ Suíte de testes automatizados (unitários + integração, veja TESTES.md)
  • ✅ Documentação interativa da API (Swagger/OpenAPI)
  • ✅ Ambiente local com Docker Compose (API + PostgreSQL)
  • ✅ Integração contínua (GitHub Actions)

✅ Fase 6: Portfólio e Endurecimento

  • ✅ Galeria de portfólio (leitura pública, escrita restrita a ADMIN)
  • ✅ Rate limiting por IP em login/registro
  • ✅ Migração do banco para PostgreSQL (produção no Render)

🧪 Como Testar Localmente

Pré-requisitos

  • PostgreSQL rodando localmente (ou pule isso e use docker compose up — veja a seção acima)
  • Java 17+
  • Node.js instalado

Configuração Rápida

  1. Clone o repositório:
git clone [https://github.com/claudiondev/raphabarber.git](https://github.com/claudiondev/raphabarber.git)
Backend: Configure o application.properties com suas credenciais do PostgreSQL e rode:

Bash
./mvnw spring-boot:run
Frontend:

Bash
npm install
npm run dev




👨‍💻 Autor
Claudio Nascimento

🔗 GitHub: @claudiondev

💼 LinkedIn: linkedin.com/in/claudionascimento-dev

📧 Email: claudinhon152@gmail.com

⭐ Se este projeto foi útil, deixe uma star! ⭐

Desenvolvido para a RaphaBarber!

Status: ✅ Em produção (Backend no Render + Frontend na Vercel) | Última atualização: Setembro de 2026

About

Sistema de agendamento para barbearia — Backend API com Java + Spring Boot

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages