Falcão Barbearia
Sistema entregue a uma barbearia: API, painel administrativo, site público com agendamento e portal do cliente.

01O problema
A barbearia marcava horários por mensagem, o que gerava conflitos na agenda dos barbeiros, esquecimentos dos clientes e nenhum controle de faturamento.
02Meu papel
Projeto individual, do zero à entrega: API, painel administrativo, site público, portal do cliente e infraestrutura na VPS.
03Arquitetura
04Decisões técnicas e trade-offs
JWT implementado manualmente no Spring Security
Um filtro próprio valida o token em cada requisição, sem servidor de identidade externo, adequado a um único sistema com poucos papéis.
Trade-off · Menos dependências e controle total das claims; em troca, revogação e rotação de chaves ficam sob responsabilidade da aplicação.
Refatoração para Appointment + AppointmentExtraService
Um atendimento com vários serviços gerava N agendamentos separados, o que complicava edição, cancelamento e faturamento. Passou a ser um Appointment com itens em AppointmentExtraService.
Trade-off · Exigiu migrar dados existentes, mas o agendamento virou uma unidade de negócio coerente (um horário, um cliente, N serviços).
Firewall liberando apenas os IPs da Cloudflare
As portas web da VPS só aceitam conexões vindas das faixas publicadas pela Cloudflare, então ninguém chega na origem contornando o proxy, o WAF e o Turnstile.
Trade-off · É preciso atualizar a lista quando a Cloudflare publica novas faixas.
Deduplicação de lembretes com reminderSentAt
O job de lembretes marca reminderSentAt ao enviar e só seleciona agendamentos com o campo nulo, então reinício do servidor ou nova execução não reenviam a mensagem.
Trade-off · Garante no máximo um envio; se o envio falhar depois da marcação, o lembrete se perde, o que é aceitável para esse caso.
05Desafios
- Bots nos formulários públicos
- Cloudflare Turnstile nos fluxos públicos (como recuperação de acesso), com o token validado no back-end antes de processar a requisição.
- Clientes que não querem criar senha
- Portal do cliente com login sem senha, para consultar e gerenciar os próprios agendamentos.
06Destaques
- Agenda individual por barbeiro com prevenção de conflito de horários
- Portal do cliente com login sem senha
- Formulários públicos protegidos com Cloudflare Turnstile
- VPS com firewall aceitando tráfego web apenas dos IPs da Cloudflare
- Lembretes de agendamento sem envio duplicado