Uma plataforma completa para gerenciar sua barbearia com segurança, profissionalismo e facilidade. 💈✨
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. 🚀
- ✅ 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/registrare/auth/login(5 tentativas a cada 15 min, depois retorna 429)
- ✅ Galeria de cortes da barbearia (leitura pública, escrita restrita a ADMIN)
- ✅ Validação da URL da imagem (precisa ser
httpse apontar para png/jpg/jpeg/webp/gif)
- ✅ CRUD completo de serviços
- ✅ Definição de preços e duração
- ✅ Descrições detalhadas
- ✅ Validações profissionais
- ✅ 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
- ✅ Spring Security integrado
- ✅ Validação em todas as camadas (Controller → Service → Database)
- ✅ Mensagens de erro claras e úteis
- ✅ Proteção contra SQL Injection (JPA)
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
Cliente HTTP Request ↓ Controller (Valida entrada) ↓ Service (Lógica de negócio) ↓ Repository (JPA) ↓ PostgreSQL Database ↓ Response JSON 200/400/404
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /registrar |
Registrar novo usuário |
| POST | /login |
Fazer login (retorna JWT) |
| 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 ⭐ |
| 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 |
| 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.
./mvnw testSuí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.
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 --buildA API fica disponível em http://localhost:8080 e o Swagger em http://localhost:8080/swagger-ui/index.html.
O repositório tem um render.yaml (Blueprint) descrevendo a API (via Docker) + um banco PostgreSQL gerenciado:
- Suba o repositório no GitHub (se ainda não estiver lá).
- No painel do Render: New > Blueprint, selecione o repositório.
- O Render lê o
render.yamle pede os dois valores que não ficam no arquivo:APP_ADMIN_EMAILeAPP_ADMIN_PASSWORD(credenciais do admin/Rapha, criadas automaticamente no primeiro start). - Clique em Apply — ele provisiona o banco, builda a imagem Docker e sobe a API.
- Se o domínio do frontend em produção mudar, atualize
CORS_ALLOWED_ORIGINSnorender.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.
| 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) |
| Tecnologia | Função |
|---|---|
| React.js | Interface do Usuário |
| Vite | Build Tool rápida |
| Tailwind CSS | Estilização Responsiva |
| Axios | Consumo da API |
- 🔐 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)
- ✅ Repositório e dependências
- ✅ Banco de dados PostgreSQL
- ✅ Spring Security + JWT
- ✅ AuthController (Cadastro/Login)
- ✅ Classe Servico e Agendamento
- ✅ Métodos de agendamento e visualização de horários
- ✅ Validações de conflito de horários
- ✅ 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
- ✅ Deploy do banco e API (Render)
- ✅ Deploy do Frontend (Vercel)
- ✅ Vídeo de demonstração (LinkedIn)
- ✅ 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)
- ✅ 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)
- PostgreSQL rodando localmente (ou pule isso e use
docker compose up— veja a seção acima) - Java 17+
- Node.js instalado
- 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