Aller au contenu
Amine Bazi.
Retour aux projets

Application full-stack — projet académique (PFA), EMSI · 2025

AppointmentPro

Système de réservation de rendez-vous avec rôles client / professionnel

Tableau de bord professionnel d'AppointmentPro avec un créneau réservé

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

Tableau de bord professionnel d'AppointmentPro avec un créneau réservé
Tableau de bord professionnel : création de créneaux, créneau réservé et rendez-vous terminé.
Tableau de bord client avec les créneaux disponibles
Côté client : les créneaux disponibles s'affichent avec réservation en un clic.
Rendez-vous réservé côté client avec actions de gestion
Rendez-vous réservé : le client peut clôturer ou annuler depuis son tableau de bord.
Page de connexion d'AppointmentPro
Authentification par email avec choix du rôle (client ou professionnel) à l'inscription.
Tableau de bord professionnel à l'état initial
État initial du tableau de bord professionnel : ajout du premier créneau de disponibilité.