EPIDOCS — Backend
Description
Le backend EPIDOCS est une API REST développée en Django (Django REST Framework) qui gère l'authentification Microsoft OAuth, la génération de documents PDF, la gestion des étudiants et les fonctionnalités d'administration.
Stack technique
| Composant |
Technologie |
| Framework |
Django + Django REST Framework |
| Sérialisation |
djangorestframework-camel-case (snake_case → camelCase) |
| Authentification |
Microsoft Azure AD (OAuth 2.0) + JWT (HttpOnly cookie) |
| Génération PDF |
Moteur de templates PDF interne |
| Base de données |
PostgreSQL (ou SQLite en dev) |
| Conteneur |
Docker |
Sérialisation camelCase
Le backend utilise djangorestframework-camel-case : il accepte les requêtes en snake_case et retourne les réponses en camelCase. Le frontend doit gérer les deux formats dans certains cas (voir normalizeStatusData() côté frontend).
Routes API principales
Authentification
| Méthode |
Route |
Description |
| POST |
/auth/sign_in |
Login OAuth (code + session_state) |
| POST |
/auth/logout |
Déconnexion |
| GET |
/auth/me |
Informations utilisateur + droits |
| GET |
/auth/student/me |
Informations étudiant |
| GET |
/auth/sessions |
Sessions actives |
| DELETE |
/auth/sessions/:id |
Révoquer une session |
| DELETE |
/auth/sessions/others |
Révoquer toutes les autres sessions |
Documents
| Méthode |
Route |
Description |
| GET |
/documents/ |
Liste des modèles uploadés |
| POST |
/documents/ |
Créer un nouveau modèle |
| GET |
/documents/:id |
Détail d'un modèle |
| PATCH |
/documents/:id |
Modifier un modèle (visibilité, fichier) |
| GET |
/documents/document-type-choices |
Types de documents disponibles |
| GET |
/documents/available-document-types |
Documents autorisés pour un étudiant/classe |
| GET |
/documents/available-attributes |
Attributs de document disponibles |
| POST |
/documents/extract-attributes |
Extraire les attributs d'un fichier |
| GET |
/documents/download/student-template |
Télécharger le template étudiant |
| GET |
/documents/download/english-score-template |
Télécharger le template scores anglais |
| GET |
/documents/download/readme |
Télécharger le README |
Documents — Admin
| Méthode |
Route |
Description |
| POST |
/documents/admin/generate-for-student |
Générer un PDF pour un étudiant |
| POST |
/documents/admin/batch-generate |
Générer en lot (ZIP) pour une classe |
| GET |
/documents/admin/student-history/:email/ |
Historique documentaire d'un étudiant |
| DELETE |
/documents/admin/delete-document/:trackingCode/ |
Supprimer un document |
| GET |
/documents/admin/dashboard/stats/ |
Statistiques du dashboard |
Étudiants
| Méthode |
Route |
Description |
| GET |
/students |
Liste des étudiants (paginée, recherche) |
| PUT |
/students/suspend |
Suspendre/réactiver un étudiant |
| GET |
/student/admin/list/ |
Liste pour migration (filtres section, année) |
| POST |
/student/migrate-students/ |
Migrer des étudiants |
| GET |
/student/admin/info-change-requests/ |
Demandes de modification |
| POST |
/student/admin/review-info-change-requests/ |
Valider/refuser des demandes |
Utilisateurs (admins)
| Méthode |
Route |
Description |
| GET |
/users/list |
Liste des admins |
| POST |
/users |
Créer un admin |
| PUT |
/users |
Modifier un admin |
| DELETE |
/users |
Supprimer un admin |
Système (superadmin)
| Méthode |
Route |
Description |
| GET |
/admin/system-status |
Statut du système (maintenance) |
| PUT |
/admin/system-status |
Activer/désactiver la maintenance |
| GET |
/admin/analytics |
Analytics par période |
| GET |
/admin/audit-logs |
Logs d'audit |
| GET |
/admin/backup/export |
Export base de données |
| POST |
/admin/backup/import |
Import base de données |
Annonces
| Méthode |
Route |
Description |
| GET |
/admin/announcements/public |
Annonces publiques (pas d'auth) |
| GET |
/admin/announcements |
Toutes les annonces (admin) |
| POST |
/admin/announcements |
Créer une annonce |
| PUT |
/admin/announcements/:id |
Modifier une annonce |
| DELETE |
/admin/announcements/:id |
Supprimer une annonce |
Query params notables
GET /documents/available-document-types
| Param |
Description |
Exemple |
studentEmail |
Email de l'étudiant (admin) |
?studentEmail=prenom.nom@epitech.eu |
classe |
Code de la classe (batch) |
?classe=PGE1 |
| (aucun) |
Utilise la section de l'utilisateur connecté (étudiant) |
— |
Réponse type
{
"documents": {
"id": "PGE4",
"name": "MSc Pro 1",
"cycle": "Master Pro",
"allowed_documents": [
{
"id": "certificat_scolarite",
"name": "Certificat de scolarité",
"description": "Atteste que l'étudiant est inscrit..."
}
],
"english_documents": []
}
}
Modèle de données simplifié
Student
├── login (email), nom, prenom, civilite
├── dateNaissance, promo, section, annee
├── accountSuspended (boolean)
└── english_score, credit
Section (classe)
├── id (PGE1, PGE2, PGE3, PGE4, PGE5, PSO, CodingAcademy)
├── name, cycle, common_name
├── credit, credit_to_pass
├── allowed_documents[]
└── english_documents[]
Document (modèle/template)
├── id, name, description
├── file (fichier template)
├── attributes[] (champs dynamiques)
└── is_active (boolean)
Announcement
├── id, title, message
├── type (info, warning, danger)
├── target (students, admins, all)
├── target_class (optionnel)
├── start_date, end_date
└── is_active (boolean)
Cookies d'authentification
| Cookie |
Type |
Description |
auth_token |
HttpOnly |
JWT d'authentification — non accessible en JS |
Cookie Domain en développement
En dev local, le backend Django doit configurer AUTH_COOKIE_DOMAIN = None pour éviter le blocage du Set-Cookie par le navigateur. En production, utiliser le domaine racine (ex: .epitools.bj).
Maintenance mode
Le backend intercepte toutes les requêtes et retourne une erreur 503 quand le système est en maintenance :
{
"is_active": false,
"reason": "Maintenance planifiée",
"updated_at": "2026-02-22T10:00:00Z"
}
Routes exemptées
Les routes d'authentification (/auth/sign_in, /auth/callback) doivent être exemptées du middleware de maintenance pour permettre aux admins de se connecter et désactiver la maintenance.