Pular para o conteúdo
Voltar aos projetos
Entregue ao clienteFull Stack · Back-End2024

Falcão Barbearia

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

Tela do Falcão Barbearia

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

Arquitetura do Falcão BarbeariaLanding · Portal · Painel → Cloudflare (HTTPS); Cloudflare → Nginx (só IPs Cloudflare); Nginx → API Spring Boot; API Spring Boot → PostgreSQL (JPA); Lembretes → PostgreSQLHTTPSsó IPs CloudflareJPALanding · Portal · PainelNext.js 16 · Angular 19CloudflareDNS · proxy · TurnstileNginxReverse proxy · VPSAPI Spring BootJWT · agendamentos · PDFLembretesJob agendado · reminderSentAtPostgreSQLDocker na VPS
ClienteBorda / proxyServiçoAssíncronoDados assíncrono / eventos

04Decisões técnicas e trade-offs

  1. 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.

  2. 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).

  3. 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.

  4. 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