02
Bloc 2 — Concevoir et développer des solutions logicielles
RNCP 38822 · Expert en Architecture et Développement Logiciel · Niveau 7
Compétences visées
Ce bloc évalue la capacité à élaborer l'architecture logicielle d'une application complexe, à en concevoir la schématisation (UML, BPMN), à préparer l'intégrité du code (tests, CI), et à développer les couches front-end et back-end en répondant à des exigences fonctionnelles et non-fonctionnelles précises.
La modélisation des données, la conception d'une API REST sécurisée, le développement d'une SPA et la gestion de la conformité réglementaire (RGPD) sont au cœur de l'évaluation.
Ce que ce projet évalue
Le projet EventFlow couvre l'ensemble du spectre BC02 : Symfony 6 pour le back-end API REST avec authentification JWT et gestion des rôles, Vue.js 3 pour le front-end SPA avec Composition API, Pinia et Vue Router, et une conformité RGPD native et complète — consentement, droits utilisateurs, anonymisation, registre des traitements.
L'accent est mis sur la qualité architecturale : séparation des responsabilités, composants réutilisables, validation des données, gestion des erreurs et documentation technique.
Contexte & Mission
Vous êtes développeur expert chargé de concevoir et développer de bout en bout la plateforme EventFlow — une application web de gestion d'événements professionnels (conférences, meetups, formations). Les organisateurs créent et publient des événements ; les participants s'inscrivent en ligne. L'application repose sur une architecture moderne API-first — back-end Symfony + SPA Vue.js — avec une conformité RGPD intégrée dès la conception (Privacy by Design).
Besoins fonctionnels identifiés
🎟️ Gestion des événements
Les organisateurs doivent pouvoir créer, modifier, publier et supprimer leurs événements. Les participants peuvent s'inscrire et annuler leur inscription.
🔐 Authentification & rôles
Trois rôles distincts : visiteur public, participant inscrit, organisateur. Chaque rôle dispose d'un périmètre d'accès strictement défini.
🔒 Conformité RGPD
Consentement explicite à l'inscription, bandeau cookies granulaire, droit de rectification, anonymisation des comptes, registre des traitements.
📋 Données personnelles
Page "Mes données" permettant à chaque utilisateur d'accéder à l'ensemble des informations le concernant et d'exercer ses droits RGPD.
⚙️ Qualité du code
Architecture propre avec séparation des responsabilités, validation des entrées, gestion des erreurs HTTP, documentation API et tests unitaires.
Contraintes du projet
👥 Format équipe
Binômes de 2 étudiants. Les deux membres doivent apparaître dans l'historique Git avec des contributions équilibrées.
🏗️ Architecture imposée
Dossier /backend (Symfony — API REST JSON) + dossier /frontend (Vue.js — SPA). Communication exclusivement via l'API. Un seul repo Git.
📅 Durée
5 jours intensifs. Organisation recommandée : J1-J2 en parallèle (back / front), J3 ensemble sur le RGPD, J4-J5 en intégration commune.
🔴 Points éliminatoires
Application non lançable → plafond 8/20. Aucune feature RGPD → plafond 12/20. Mots de passe en clair → −10 pts. Un seul membre dans les commits → −5 pts.
🛡️ Sécurité minimale
JWT signé obligatoire, mots de passe hashés (bcrypt), pas de données sensibles dans le code, fichier .env jamais commité.
Modèle de Données — Entités Doctrine
Les 4 entités Doctrine à implémenter. Les champs marqués RGPD sont soumis à des règles de traitement spécifiques et doivent être documentés dans le registre des traitements.
Tâches de Développement & Consignes Précises
-
1Concevez et implémentez les 4 entités Doctrine (User, Event, Registration, ConsentLog) avec leurs relations, leurs migrations versionnées et leurs contraintes de validation (Symfony Assert).
-
2Développez l'ensemble des endpoints REST définis dans le tableau des routes (auth, CRUD événements, inscriptions, endpoints RGPD). Chaque endpoint doit retourner les codes HTTP corrects, une sérialisation JSON propre via les groupes Symfony Serializer, et une gestion explicite des erreurs (404, 403, 422).
-
3Implémentez l'authentification JWT avec LexikJWTAuthenticationBundle. Gérez les rôles (ROLE_USER, ROLE_ORGANIZER) via les Voters Symfony pour sécuriser l'accès aux endpoints selon le rôle et la propriété de la ressource.
-
4Séparez correctement les responsabilités : Controllers (routing uniquement), Services (logique métier), Repositories (accès données), DTOs (transfert). Cette séparation sera évaluée à la lecture du code.
-
5Implémentez la commande console
php bin/console app:anonymize-old-usersqui anonymise les comptes inactifs depuis plus de 2 ans (prénom → "Utilisateur supprimé", email → hash SHA256, téléphone → null, isAnonymized = true).
POST /api/auth/register · POST /api/auth/login · GET /api/events · POST /api/events · PUT /api/events/{id} · DELETE /api/events/{id} · POST /api/events/{id}/register · DELETE /api/registrations/{id} · GET /api/me · PUT /api/me · DELETE /api/me · POST /api/consent
-
1Développez la SPA Vue.js 3 avec Vite, Composition API et Pinia. Le store
authStoregère le token JWT (stockage, état d'authentification, rôle courant) et expose les actions login / logout accessibles dans toute l'application. -
2Implémentez le routage Vue Router avec toutes les vues listées dans le tableau des routes (/, /events, /events/:id, /login, /register, /dashboard, /events/create, /events/:id/edit, /profile, /privacy). Les routes protégées doivent être sécurisées par des guards de navigation vérifiant l'authentification et le rôle.
-
3Créez des composants réutilisables : formulaire d'événement (création/édition), carte événement, modal de confirmation, bandeau cookies. Chaque composant doit être autonome, documenté par des props typées et gérer ses états de chargement (skeleton, spinner, message d'erreur).
-
4Consommez l'API Symfony via Axios avec intercepteurs : ajout automatique du header Authorization (Bearer token), gestion des erreurs 401 (redirection login), 403 et 404. L'UX doit être soignée — les formulaires valident les champs avant soumission et affichent des feedbacks clairs.
Organisez vos appels API dans un dossier /services dédié (eventService.js, authService.js…) — ne faites jamais d'appels Axios directement dans les composants. Le jury vérifiera cette séparation.
-
1Implémentez le consentement explicite à l'inscription : checkbox non pré-cochée, version de la politique enregistrée en base (champ consentVersion), date d'acceptation tracée. Un ConsentLog est créé à chaque action sur les données personnelles.
-
2Développez le bandeau cookies granulaire (composant Vue.js global) avec 3 catégories : nécessaires (non désactivables), analytiques, marketing. Le choix est persisté en localStorage et respecté côté front.
-
3Implémentez les droits RGPD : droit d'accès (GET /api/me — page "Mes données"), droit de rectification (PUT /api/me — formulaire de modification), droit à l'effacement (DELETE /api/me — anonymisation, pas suppression). Le ConsentLog est toujours conservé après anonymisation.
-
4Produisez le registre des traitements (livrable documentaire) listant les 8 traitements identifiés avec pour chacun : finalité, base légale, données concernées, destinataires, durée de conservation, mesures de sécurité. Un DPO fictif doit être désigné.
L'anonymisation n'est pas une suppression. Les données sont remplacées par des valeurs neutres ("Utilisateur supprimé", hash de l'email) mais l'enregistrement est conservé pour la cohérence des relations (inscriptions, logs). Le ConsentLog est toujours conservé — obligation légale.
-
1Validez toutes les entrées côté API avec les contraintes Symfony Assert (NotBlank, Email, Length, etc.). Les erreurs de validation doivent retourner un 422 avec le détail des champs invalides en JSON, pas une exception générique.
-
2Produisez une collection Postman complète (ou fichier .http) testant tous les endpoints avec les requêtes et réponses exemples. Incluez les cas d'erreur (401, 403, 404, 422). La collection doit pouvoir être importée et exécutée directement.
-
3Rédigez un README technique complet : prérequis (PHP, Node, Composer, npm), variables d'environnement (
.env.example), commandes d'installation et de lancement pas à pas, architecture du projet expliquée.
- +3 pts — Tests PHPUnit (minimum 5 tests : auth + CRUD + anonymisation)
- +2 pts — Docker Compose fonctionnel (PHP + Node + MySQL + Nginx)
- +2 pts — Export des données personnelles (droit de portabilité — GET /api/me/export)
- +2 pts — CI/CD GitHub Actions lançant les tests PHPUnit à chaque push
-
1Démo live de 15 minutes sans slides. Parcours imposé : inscription avec consentement → connexion → création d'un événement → inscription à un événement → page "Mes données" → mise à jour du profil → anonymisation du compte. Chaque étape doit être fonctionnelle en direct.
-
2Questions techniques individuelles (10 min) : chaque membre du binôme est interrogé séparément. Les questions portent sur Symfony (cycle de vie requête, DI Container, Voters), Vue.js (ref vs reactive, Pinia, guards) et RGPD (base légale, anonymisation vs pseudonymisation, Privacy by Design).
- Décrivez le cycle de vie d'une requête HTTP dans Symfony. Qu'est-ce qu'un Voter ?
- Quelle différence entre
ref()etreactive()en Vue 3 ? Comment fonctionne Pinia ? - Sur quelle base légale repose le traitement principal de votre application ?
- Quelle est la différence entre anonymisation et pseudonymisation ? Pourquoi hacher l'IP ?
- Comment avez-vous protégé vos routes ? Expliquez un guard de navigation.
Barème de Notation — 100 Points
| Axe d'évaluation | Critères détaillés | Points |
|---|---|---|
| Back-end Symfony | API REST complète (CRUD + JWT) — 15 pts · Architecture propre (Services, Repository, DTOs) — 10 pts · Validation, gestion erreurs, codes HTTP — 5 pts · Commande anonymisation — 5 pts | 35 pts |
| Front-end Vue.js | SPA fonctionnelle (Vue Router + Pinia + Axios) — 12 pts · Composants réutilisables, code organisé — 8 pts · UX soignée (formulaires, feedback, responsive) — 6 pts · Guards de navigation — 4 pts | 30 pts |
| RGPD | Consentement implémenté (bandeau + BDD + granularité) — 8 pts · Droits utilisateurs (rectification + anonymisation) — 7 pts · Registre des traitements complet — 6 pts · Logs d'accès + politique de confidentialité — 4 pts | 25 pts |
| Documentation & Soutenance | README clair + installation fonctionnelle — 4 pts · Qualité et fluidité de la démo — 3 pts · Pertinence des réponses aux questions — 3 pts | 10 pts |
- Repo Git (1 seul dépôt, dossiers /backend et /frontend)
- README technique complet avec instructions d'installation
- Registre des traitements RGPD (PDF ou Markdown)
- Collection Postman ou fichier .http
- Soutenance orale : 15 min démo + 10 min Q&A
- PHP 8.2+ · Symfony 6.4+ · MySQL 8+
- Vue.js 3.x · Vite · Pinia · Node.js 20 LTS
- LexikJWTAuthenticationBundle pour l'auth
- Fichier
.env.examplefourni, jamais de.envcommité - Git obligatoire — commits réguliers des deux membres