Vocadia
Plateforme e-learning — création de cours, inscriptions et suivi de progression, sur un backend orienté domaine avec permissions fines.
- Mon rôle
- Développeur Full Stack
- Période
- oct. 2025 — août 2026
- Statut
- Livré
Vocadia est une plateforme e-learning : les enseignants créent et publient leurs cours, les étudiants s'y inscrivent et progressent à leur rythme, et les deux se retrouvent dans des salles de classe en direct. Les inscriptions et la progression de chaque étudiant sont suivies côté serveur, chaque action étant contrôlée par des permissions fines liées au rôle.
Le code vit dans un monorepo : un backend Fastify structuré en domain-driven design avec séparation CQRS — commandes et requêtes traitées séparément par contexte métier — Drizzle pour l'accès typé à la base de données et Casbin comme moteur d'autorisation. Le client web est en React avec Vite, et l'ensemble est déployé sur DigitalOcean via une chaîne CI/CD complète.
Le problème à résoudre
Une plateforme e-learning combine des états de natures très différentes : du contenu de cours que les enseignants rédigent et révisent, des inscriptions et une progression qui doivent rester cohérentes pour chaque étudiant, et des sessions de classe en direct qui n'existent que le temps d'un cours. S'ajoute la question des droits : enseignants et étudiants n'ont pas les mêmes prérogatives sur les mêmes ressources, et des vérifications de rôles codées en dur dans chaque route seraient vite devenues ingérables à mesure que la matrice de permissions grandissait.
Comment cela a été construit
Le backend isole chaque préoccupation dans un module de domaine derrière une séparation CQRS : les écritures passent par des commandes qui font respecter les invariants métier, les lectures par des handlers de requête adaptés au client. L'autorisation n'est pas dispersée dans les handlers : Casbin évalue les politiques de façon centralisée, si bien qu'ajouter ou restreindre une permission relève d'un changement de politique, pas d'une chasse dans le code. Drizzle garde le schéma et les requêtes typés de bout en bout.
Le client React + Vite consomme cette API pour la création de cours, les inscriptions et le suivi de progression, et héberge les salles de classe en direct pour enseignants et étudiants. Le déploiement est entièrement automatisé : le monorepo est construit par la chaîne CI/CD puis livré sur DigitalOcean.
Ce que ça fait
Création de cours
Les enseignants créent, structurent et publient leurs cours directement sur la plateforme.
Inscriptions et progression
Les étudiants s'inscrivent aux cours et leur avancement est suivi côté serveur, étudiant par étudiant et cours par cours.
Salles de classe en direct
Des salles en temps réel où enseignants et étudiants se retrouvent pour des sessions en direct, en complément des contenus de cours suivis en autonomie.
Permissions par politiques
Casbin évalue chaque action contre des politiques d'autorisation centralisées : chaque rôle obtient exactement les droits dont il a besoin, sans vérifications dispersées dans le code.
CI/CD vers DigitalOcean
Le monorepo est construit et déployé sur DigitalOcean par une chaîne CI/CD complète, sans étapes manuelles de mise en production.
Construit avec
Frontend
React couvre les deux visages du client — les écrans de création et de suivi riches en formulaires et les salles de classe en direct, très dynamiques — avec un seul modèle de composants, Vite assurant un cycle de développement rapide.
Un seul langage et un seul système de types dans tout le monorepo : modèles de domaine, schémas Drizzle et contrats d'API restent synchronisés entre le serveur Fastify et le client React.
Backend
L'encapsulation par plugins de Fastify épouse les frontières des modules DDD — chaque contexte métier enregistre ses propres routes, commandes et requêtes — tout en gardant la couche API légère et rapide.
Données
Cours, inscriptions et progression sont des données relationnelles par nature ; PostgreSQL en garantit l'intégrité par contraintes et transactions, et Drizzle l'expose sous forme de schéma typé.
Infrastructure
Les conteneurs rendent la chaîne CI/CD reproductible : les images validées au build sont celles qui tournent sur DigitalOcean, le déploiement ne dépend donc pas de l'état du serveur.