Aller au contenu principal

Projet E: Formulaire de Contact

Mise en situation​

Une entreprise veut récupérer les coordonnées des visiteurs de son site web. Quand quelqu'un remplit le formulaire de contact, ses informations doivent être sauvegardées dans une base de données PostgreSQL et un email doit être envoyé.


Ce que vous devez créer​

Une API REST Spring Boot avec:

  1. Un formulaire de contact public - n'importe qui peut soumettre ses coordonnées
  2. Un panneau admin protégé - pour consulter et gérer les contacts reçus
  3. Un système d'emails - notifications automatiques

Le flux​


Aperçu du formulaire (Frontend)​

Voici à quoi devrait ressembler le formulaire sur la page web:

┌─────────────────────────────────────────────────────────┐
│ CONTACTEZ-NOUS │
├─────────────────────────────────────────────────────────┤
│ │
│ Nom complet * Entreprise │
│ ┌─────────────────────────┐ ┌─────────────────────┐│
│ │ Your name │ │ Your company name ││
│ └─────────────────────────┘ └─────────────────────┘│
│ │
│ Email * Téléphone │
│ ┌─────────────────────────┐ ┌─────────────────────┐│
│ │ your@company.com │ │ Your phone number ││
│ └─────────────────────────┘ └─────────────────────┘│
│ │
│ Type de demande * │
│ ┌─────────────────────────────────────────────────┬──┐│
│ │ Sélectionnez le type de demande │ v││
│ ├─────────────────────────────────────────────────┴──┤│
│ │ > Sélectionnez le type de demande ││
│ │ Demande d'information ││
│ │ Demande de devis ││
│ │ Support technique ││
│ │ Partenariat ││
│ │ Autre ││
│ └────────────────────────────────────────────────────┘│
│ │
│ Message * │
│ ┌────────────────────────────────────────────────────┐│
│ │ Décrivez votre demande, votre budget, ││
│ │ et vos délais... ││
│ │ ││
│ │ ││
│ └────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────┐ │
│ │ ENVOYER │ │
│ └─────────────────────┘ │
│ │
│ * Champs obligatoires │
└─────────────────────────────────────────────────────────┘

Champs du formulaire:

ChampType HTMLValidation
Nom complet<input type="text">Obligatoire
Entreprise<input type="text">Optionnel
Email<input type="email">Obligatoire, format email
Téléphone<input type="tel">Optionnel
Type de demande<select>Obligatoire
Message<textarea>Obligatoire, min 10 caractères

Options du champ "Type de demande":

ValeurAffichage
INFODemande d'information
QUOTEDemande de devis
SUPPORTSupport technique
PARTNERSHIPPartenariat
OTHERAutre

Endpoints à créer​

Endpoint public (sans authentification)​

MéthodeURLDescription
POST/api/contactSoumettre le formulaire

Données du formulaire:

  • fullName (obligatoire)
  • company (optionnel)
  • email (obligatoire)
  • phone (optionnel)
  • requestType (obligatoire) - liste de sélection
  • message (obligatoire)

Endpoints admin (avec JWT)​

MéthodeURLDescription
GET/api/admin/leadsListe des contacts
GET/api/admin/leads/\{id\}Détail d'un contact
PUT/api/admin/leads/\{id\}/statusChanger le statut
DELETE/api/admin/leads/\{id\}Supprimer

Diagramme de classes​

Voici une proposition de structure. Vous pouvez modifier, ajouter ou simplifier selon vos besoins.

Liberté de conception

Ce diagramme est une suggestion. Vous êtes libres de:

  • Ajouter des classes (ex: LeadNote pour des notes internes)
  • Ajouter des champs (ex: company, source)
  • Modifier les relations
  • Simplifier si vous trouvez que c'est trop complexe

L'important est que votre solution fonctionne et soit bien structurée.


Base de données​

Créez ces tables dans PostgreSQL:

Table leads

  • id (clé primaire)
  • full_name
  • company
  • email (unique)
  • phone
  • request_type (INFO, QUOTE, SUPPORT, PARTNERSHIP, OTHER)
  • message
  • status (NEW, CONTACTED, CONVERTED, LOST)
  • created_at

Table users (pour les admins)

  • id
  • email
  • password
  • role

Emails à envoyer​

  1. Quand quelqu'un soumet le formulaire:

    • Email à l'admin: "Nouveau contact reçu"
    • Email au visiteur: "Merci, nous avons bien reçu votre message"
  2. Utiliser @Async pour ne pas bloquer la requête


Configuration​

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

mail:
host: localhost
port: 1025 # MailHog pour les tests

Pour tester les emails localement:

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

Voir les emails sur http://localhost:8025


Tests à écrire​

  • POST /api/contact avec données valides → retourne 200
  • POST /api/contact avec email invalide → retourne 400
  • GET /api/admin/leads sans token → retourne 401
  • GET /api/admin/leads avec token → retourne la liste

Évaluation​

CritèrePoints
Endpoint POST /api/contact fonctionne20
Données sauvegardées en PostgreSQL20
Emails envoyés15
Endpoints admin protégés par JWT20
Tests15
Code propre10
Total100

Pour commencer​

  1. Créer le projet sur start.spring.io avec:

    • Spring Web
    • Spring Data JPA
    • Spring Security
    • Spring Mail
    • Validation
    • PostgreSQL Driver
    • Lombok
  2. Créer l'entité Lead

  3. Créer le LeadRepository

  4. Créer le ContactController avec POST /api/contact

  5. Tester avec curl ou Postman


Livrables​

  • Code sur GitHub
  • README avec instructions
  • Collection Postman pour tester

Retour au Projet Final