Saltar al contenido principal

Proyecto E: Formulario de Contacto

Contexto​

Una empresa quiere recopilar los datos de contacto de los visitantes de su sitio web. Cuando alguien completa el formulario de contacto, su información debe guardarse en una base de datos PostgreSQL y se debe enviar un correo electrónico.


Lo que debe crear​

Una API REST Spring Boot con:

  1. Un formulario de contacto público - cualquier persona puede enviar sus datos
  2. Un panel de administración protegido - para consultar y gestionar los contactos recibidos
  3. Un sistema de correos electrónicos - notificaciones automáticas

El flujo​


Vista previa del formulario (Frontend)​

Así debería verse el formulario en la página web:

┌─────────────────────────────────────────────────────────┐
│ CONTÁCTENOS │
├─────────────────────────────────────────────────────────┤
│ │
│ Nombre completo * Empresa │
│ ┌─────────────────────────┐ ┌─────────────────────┐│
│ │ Your name │ │ Your company name ││
│ └─────────────────────────┘ └─────────────────────┘│
│ │
│ Email * Teléfono │
│ ┌─────────────────────────┐ ┌─────────────────────┐│
│ │ your@company.com │ │ Your phone number ││
│ └─────────────────────────┘ └─────────────────────┘│
│ │
│ Tipo de solicitud * │
│ ┌─────────────────────────────────────────────────┬──┐│
│ │ Seleccione el tipo de solicitud │ v││
│ ├─────────────────────────────────────────────────┴──┤│
│ │ > Seleccione el tipo de solicitud ││
│ │ Solicitud de información ││
│ │ Solicitud de cotización ││
│ │ Soporte técnico ││
│ │ Alianza ││
│ │ Otro ││
│ └────────────────────────────────────────────────────┘│
│ │
│ Mensaje * │
│ ┌────────────────────────────────────────────────────┐│
│ │ Describa su solicitud, su presupuesto, ││
│ │ y sus plazos... ││
│ │ ││
│ │ ││
│ └────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────┐ │
│ │ ENVIAR │ │
│ └─────────────────────┘ │
│ │
│ * Campos obligatorios │
└─────────────────────────────────────────────────────────┘

Campos del formulario:

CampoTipo HTMLValidación
Nombre completo<input type="text">Obligatorio
Empresa<input type="text">Opcional
Email<input type="email">Obligatorio, formato email
Teléfono<input type="tel">Opcional
Tipo de solicitud<select>Obligatorio
Mensaje<textarea>Obligatorio, mínimo 10 caracteres

Opciones del campo "Tipo de solicitud":

ValorVisualización
INFOSolicitud de información
QUOTESolicitud de cotización
SUPPORTSoporte técnico
PARTNERSHIPAlianza
OTHEROtro

Endpoints a crear​

Endpoint público (sin autenticación)​

MétodoURLDescripción
POST/api/contactEnviar el formulario

Datos del formulario:

  • fullName (obligatorio)
  • company (opcional)
  • email (obligatorio)
  • phone (opcional)
  • requestType (obligatorio) - lista de selección
  • message (obligatorio)

Endpoints admin (con JWT)​

MétodoURLDescripción
GET/api/admin/leadsLista de contactos
GET/api/admin/leads/\{id\}Detalle de un contacto
PUT/api/admin/leads/\{id\}/statusCambiar el estado
DELETE/api/admin/leads/\{id\}Eliminar

Diagrama de clases​

Aquí tiene una propuesta de estructura. Puede modificar, agregar o simplificar según sus necesidades.

Libertad de diseño

Este diagrama es una sugerencia. Usted es libre de:

  • Agregar clases (ej: LeadNote para notas internas)
  • Agregar campos (ej: company, source)
  • Modificar las relaciones
  • Simplificar si considera que es demasiado complejo

Lo importante es que su solución funcione y esté bien estructurada.


Base de datos​

Cree estas tablas en PostgreSQL:

Tabla leads

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

Tabla users (para los administradores)

  • id
  • email
  • password
  • role

Correos electrónicos a enviar​

  1. Cuando alguien envía el formulario:

    • Correo al admin: "Nuevo contacto recibido"
    • Correo al visitante: "Gracias, hemos recibido su mensaje"
  2. Utilizar @Async para no bloquear la solicitud


Configuración​

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

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

Para probar los correos localmente:

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

Ver los correos en http://localhost:8025


Pruebas a escribir​

  • POST /api/contact con datos válidos → retorna 200
  • POST /api/contact con email inválido → retorna 400
  • GET /api/admin/leads sin token → retorna 401
  • GET /api/admin/leads con token → retorna la lista

Evaluación​

CriterioPuntos
Endpoint POST /api/contact funciona20
Datos guardados en PostgreSQL20
Correos enviados15
Endpoints admin protegidos por JWT20
Pruebas15
Código limpio10
Total100

Para comenzar​

  1. Cree el proyecto en start.spring.io con:

    • Spring Web
    • Spring Data JPA
    • Spring Security
    • Spring Mail
    • Validation
    • PostgreSQL Driver
    • Lombok
  2. Cree la entidad Lead

  3. Cree el LeadRepository

  4. Cree el ContactController con POST /api/contact

  5. Pruebe con curl o Postman


Entregables​

  • Código en GitHub
  • README con instrucciones
  • Colección Postman para pruebas

Volver al Proyecto Final