Pular para o conteúdo principal

Projeto E: Formulário de Contato

Contexto​

Uma empresa deseja coletar os dados de contato dos visitantes do seu site. Quando alguém preenche o formulário de contato, suas informações devem ser salvas em um banco de dados PostgreSQL e um email deve ser enviado.


O que você deve criar​

Uma API REST Spring Boot com:

  1. Um formulário de contato público - qualquer pessoa pode enviar seus dados
  2. Um painel admin protegido - para consultar e gerenciar os contatos recebidos
  3. Um sistema de emails - notificações automáticas

O fluxo​


Visual do formulário (Frontend)​

Veja como o formulário deve aparecer na página web:

┌─────────────────────────────────────────────────────────┐
│ FALE CONOSCO │
├─────────────────────────────────────────────────────────┤
│ │
│ Nome completo * Empresa │
│ ┌─────────────────────────┐ ┌─────────────────────┐│
│ │ Seu nome │ │ Nome da empresa ││
│ └─────────────────────────┘ └─────────────────────┘│
│ │
│ Email * Telefone │
│ ┌─────────────────────────┐ ┌─────────────────────┐│
│ │ seu@email.com │ │ Seu telefone ││
│ └─────────────────────────┘ └─────────────────────┘│
│ │
│ Tipo de solicitação * │
│ ┌─────────────────────────────────────────────────┬──┐│
│ │ Selecione o tipo de solicitação │ v││
│ ├─────────────────────────────────────────────────┴──┤│
│ │ > Selecione o tipo de solicitação ││
│ │ Solicitação de informação ││
│ │ Solicitação de orçamento ││
│ │ Suporte técnico ││
│ │ Parceria ││
│ │ Outro ││
│ └────────────────────────────────────────────────────┘│
│ │
│ Mensagem * │
│ ┌────────────────────────────────────────────────────┐│
│ │ Descreva sua solicitação, seu orçamento, ││
│ │ e seus prazos... ││
│ │ ││
│ │ ││
│ └────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────┐ │
│ │ ENVIAR │ │
│ └─────────────────────┘ │
│ │
│ * Campos obrigatórios │
└─────────────────────────────────────────────────────────┘

Campos do formulário:

CampoTipo HTMLValidação
Nome completo<input type="text">Obrigatório
Empresa<input type="text">Opcional
Email<input type="email">Obrigatório, formato de email
Telefone<input type="tel">Opcional
Tipo de solicitação<select>Obrigatório
Mensagem<textarea>Obrigatório, mínimo 10 caracteres

Opções do campo "Tipo de solicitação":

ValorExibição
INFOSolicitação de informação
QUOTESolicitação de orçamento
SUPPORTSuporte técnico
PARTNERSHIPParceria
OTHEROutro

Endpoints a criar​

Endpoint público (sem autenticação)​

MétodoURLDescrição
POST/api/contactEnviar o formulário

Dados do formulário:

  • fullName (obrigatório)
  • company (opcional)
  • email (obrigatório)
  • phone (opcional)
  • requestType (obrigatório) - lista de seleção
  • message (obrigatório)

Endpoints admin (com JWT)​

MétodoURLDescrição
GET/api/admin/leadsLista de contatos
GET/api/admin/leads/\{id\}Detalhe de um contato
PUT/api/admin/leads/\{id\}/statusAlterar o status
DELETE/api/admin/leads/\{id\}Excluir

Diagrama de classes​

Aqui está uma sugestão de estrutura. Você pode modificar, adicionar ou simplificar conforme necessário.

Liberdade de projeto

Este diagrama é uma sugestão. Você pode:

  • Adicionar classes (ex: LeadNote para anotações internas)
  • Adicionar campos (ex: company, source)
  • Modificar os relacionamentos
  • Simplificar se achar muito complexo

O importante é que sua solução funcione e seja bem estruturada.


Banco de dados​

Crie estas tabelas no PostgreSQL:

Tabela leads

  • id (chave primária)
  • full_name
  • company
  • email (único)
  • phone
  • request_type (INFO, QUOTE, SUPPORT, PARTNERSHIP, OTHER)
  • message
  • status (NEW, CONTACTED, CONVERTED, LOST)
  • created_at

Tabela users (para admins)

  • id
  • email
  • password
  • role

Emails a enviar​

  1. Quando alguém envia o formulário:

    • Email para o admin: "Novo contato recebido"
    • Email para o visitante: "Obrigado, recebemos sua mensagem"
  2. Utilize @Async para não bloquear a requisição


Configuração​

# application.yml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/contactdb
username: postgres
password: postgres

mail:
host: localhost
port: 1025 # MailHog para testes

Para testar emails localmente:

docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog

Veja os emails em http://localhost:8025


Testes a escrever​

  • POST /api/contact com dados válidos → retorna 200
  • POST /api/contact com email inválido → retorna 400
  • GET /api/admin/leads sem token → retorna 401
  • GET /api/admin/leads com token → retorna a lista

Avaliação​

CritérioPontos
Endpoint POST /api/contact funciona20
Dados salvos no PostgreSQL20
Emails enviados15
Endpoints admin protegidos por JWT20
Testes15
Código limpo10
Total100

Para começar​

  1. Crie o projeto em start.spring.io com:

    • Spring Web
    • Spring Data JPA
    • Spring Security
    • Spring Mail
    • Validation
    • PostgreSQL Driver
    • Lombok
  2. Crie a entidade Lead

  3. Crie o LeadRepository

  4. Crie o ContactController com POST /api/contact

  5. Teste com curl ou Postman


Entregáveis​

  • Código no GitHub
  • README com instruções
  • Collection Postman para testes

Voltar ao Projeto Final