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:
- Um formulário de contato público - qualquer pessoa pode enviar seus dados
- Um painel admin protegido - para consultar e gerenciar os contatos recebidos
- 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:
| Campo | Tipo HTML | Validação |
|---|---|---|
| Nome completo | <input type="text"> | Obrigatório |
| Empresa | <input type="text"> | Opcional |
<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":
| Valor | Exibição |
|---|---|
INFO | Solicitação de informação |
QUOTE | Solicitação de orçamento |
SUPPORT | Suporte técnico |
PARTNERSHIP | Parceria |
OTHER | Outro |
Endpoints a criar
Endpoint público (sem autenticação)
| Método | URL | Descrição |
|---|---|---|
| POST | /api/contact | Enviar 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étodo | URL | Descrição |
|---|---|---|
| GET | /api/admin/leads | Lista de contatos |
| GET | /api/admin/leads/\{id\} | Detalhe de um contato |
| PUT | /api/admin/leads/\{id\}/status | Alterar 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.
Este diagrama é uma sugestão. Você pode:
- Adicionar classes (ex:
LeadNotepara 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
- password
- role
Emails a enviar
-
Quando alguém envia o formulário:
- Email para o admin: "Novo contato recebido"
- Email para o visitante: "Obrigado, recebemos sua mensagem"
-
Utilize
@Asyncpara 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/contactcom dados válidos → retorna 200 - POST
/api/contactcom email inválido → retorna 400 - GET
/api/admin/leadssem token → retorna 401 - GET
/api/admin/leadscom token → retorna a lista
Avaliação
| Critério | Pontos |
|---|---|
| Endpoint POST /api/contact funciona | 20 |
| Dados salvos no PostgreSQL | 20 |
| Emails enviados | 15 |
| Endpoints admin protegidos por JWT | 20 |
| Testes | 15 |
| Código limpo | 10 |
| Total | 100 |
Para começar
-
Crie o projeto em start.spring.io com:
- Spring Web
- Spring Data JPA
- Spring Security
- Spring Mail
- Validation
- PostgreSQL Driver
- Lombok
-
Crie a entidade
Lead -
Crie o
LeadRepository -
Crie o
ContactControllercom POST/api/contact -
Teste com curl ou Postman
Entregáveis
- Código no GitHub
- README com instruções
- Collection Postman para testes