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:
- Un formulaire de contact public - n'importe qui peut soumettre ses coordonnées
- Un panneau admin protégé - pour consulter et gérer les contacts reçus
- 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:
| Champ | Type HTML | Validation |
|---|---|---|
| Nom complet | <input type="text"> | Obligatoire |
| Entreprise | <input type="text"> | Optionnel |
<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":
| Valeur | Affichage |
|---|---|
INFO | Demande d'information |
QUOTE | Demande de devis |
SUPPORT | Support technique |
PARTNERSHIP | Partenariat |
OTHER | Autre |
Endpoints à créer
Endpoint public (sans authentification)
| Méthode | URL | Description |
|---|---|---|
| POST | /api/contact | Soumettre 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éthode | URL | Description |
|---|---|---|
| GET | /api/admin/leads | Liste des contacts |
| GET | /api/admin/leads/\{id\} | Détail d'un contact |
| PUT | /api/admin/leads/\{id\}/status | Changer 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.
Ce diagramme est une suggestion. Vous êtes libres de:
- Ajouter des classes (ex:
LeadNotepour 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
- password
- role
Emails à envoyer
-
Quand quelqu'un soumet le formulaire:
- Email à l'admin: "Nouveau contact reçu"
- Email au visiteur: "Merci, nous avons bien reçu votre message"
-
Utiliser
@Asyncpour 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/contactavec données valides → retourne 200 - POST
/api/contactavec email invalide → retourne 400 - GET
/api/admin/leadssans token → retourne 401 - GET
/api/admin/leadsavec token → retourne la liste
Évaluation
| Critère | Points |
|---|---|
| Endpoint POST /api/contact fonctionne | 20 |
| Données sauvegardées en PostgreSQL | 20 |
| Emails envoyés | 15 |
| Endpoints admin protégés par JWT | 20 |
| Tests | 15 |
| Code propre | 10 |
| Total | 100 |
Pour commencer
-
Créer le projet sur start.spring.io avec:
- Spring Web
- Spring Data JPA
- Spring Security
- Spring Mail
- Validation
- PostgreSQL Driver
- Lombok
-
Créer l'entité
Lead -
Créer le
LeadRepository -
Créer le
ContactControlleravec POST/api/contact -
Tester avec curl ou Postman
Livrables
- Code sur GitHub
- README avec instructions
- Collection Postman pour tester