Application full-stack — projet académique (PFA), EMSI · 2025
AppointmentPro
Système de réservation de rendez-vous avec rôles client / professionnel

Contexte et problème
Développé dans le cadre de mon projet de fin d'année (PFA) à l'EMSI. Les professionnels indépendants gèrent souvent leurs rendez-vous par téléphone ou sur papier : créneaux oubliés, doubles réservations, aucune vue d'ensemble. L'objectif était une application web complète couvrant tout le cycle de vie d'un rendez-vous, de la publication des disponibilités à la clôture.
Objectifs
- Offrir deux parcours distincts : le professionnel publie ses créneaux, le client réserve.
- Garantir qu'un créneau réservé ne puisse plus être proposé aux autres clients.
- Couvrir le cycle complet : réservation, clôture, annulation.
- Sécuriser les données : chaque utilisateur ne voit que ses propres rendez-vous.
Mon rôle
- Développement de l'interface React / TypeScript : tableaux de bord client et professionnel, formulaires, listes de créneaux.
- Modélisation de la base PostgreSQL : profils, créneaux horaires, rendez-vous.
- Mise en place de l'authentification Supabase avec choix du rôle à l'inscription.
- Écriture des politiques Row Level Security contrôlant l'accès à chaque table.
Fonctionnalités principales
- Inscription et connexion par email via Supabase Auth, avec rôle client ou professionnel.
- Le professionnel crée et supprime ses créneaux de disponibilité (date, heure de début et de fin).
- Le client parcourt les créneaux disponibles et réserve en un clic.
- Cycle de vie des rendez-vous : réservé, terminé, annulé.
- Un créneau réservé devient automatiquement indisponible pour les autres clients.
- Tableaux de bord distincts par rôle : gestion des créneaux côté pro, réservations côté client.
Architecture technique
- Frontend React 18 + TypeScript + Vite, composants par rôle (client, professionnel, authentification, partagés).
- Backend-as-a-service Supabase : base PostgreSQL, authentification et API générée.
- Sécurité au niveau base : politiques Row Level Security sur les tables profiles, time_slots et appointments — un client ne peut lire ou modifier que ses propres rendez-vous.
- Types TypeScript partagés (Profile, TimeSlot, Appointment) reflétant le schéma relationnel.
- Migration SQL versionnée définissant enums, tables et politiques d'accès.
Technologies
- React 18
- TypeScript
- Vite
- Tailwind CSS
- Supabase
- PostgreSQL
- Row Level Security
Décisions et défis techniques
- Intégrité des réservations : empêcher la double réservation d'un créneau — le statut de disponibilité est porté par la base, pas seulement par l'interface.
- Isolation des données entre utilisateurs : les politiques RLS garantissent qu'aucun utilisateur ne peut accéder aux rendez-vous d'un autre en manipulant une requête.
- Deux expériences distinctes dans une seule application : le routage et les composants s'adaptent au rôle retourné par l'authentification.
Résultat et limites
- Application fonctionnelle testée en conditions réelles locales : inscription, création de créneaux, réservation et annulation vérifiées (captures ci-dessous).
- Limite connue : l'application dépend d'un projet Supabase externe ; les clés d'environnement ne sont pas incluses dans le dossier du projet.
- Limite connue : non déployée publiquement à ce stade ; comptes de démonstration uniquement.
Captures d'écran




