Document d’Exigences — Task Management System
Introduction
Le Task Management System est une application collaborative permettant aux équipes d’organiser, suivre et gérer leur travail via des tâches et des projets. Il facilite l’attribution des tâches, le suivi de la progression et la coordination entre membres d’équipe, avec un contrôle d’accès basé sur les rôles.
Glossaire
- Task_Manager : Le système de gestion des tâches
- Task : Une unité de travail avec description, échéance, priorité et statut
- Project : Un conteneur regroupant plusieurs tâches liées
- User : Une personne utilisant le système avec un rôle spécifique
- Team : Un groupe d’utilisateurs collaborant sur des projets
- Assignment : L’association d’une tâche à un utilisateur
- Status : L’état d’avancement d’une tâche
(
todo,in-progress,completed) - Priority : Le niveau d’importance d’une tâche
(
low,medium,high) - Role : Le niveau d’autorisation d’un
utilisateur (
admin,manager,developer,viewer)
Story Map
La story map représente le parcours utilisateur de bout en bout, découpé en rôles, activités, tâches utilisateur et releases.
Légende des couleurs - 🟣
#b39ddb— Rôles utilisateurs - 🔵#90caf9— Activités (épiques) - 🟡#fff176— Tâches utilisateur (user tasks) - 🟢#a5d6a7— Release 1 MVP - 🟠#ffcc80— Release 2 Collaboration - 🔴#ef9a9a— Release 3 Pilotage
graph TD
%% ── RÔLES ──────────────────────────────────────────────────────────
R1["👤 Admin"]:::role
R2["👤 Manager"]:::role
R3["👤 Developer"]:::role
R4["👤 Viewer"]:::role
%% ── ACTIVITÉS ──────────────────────────────────────────────────────
A1["📁 Gérer son compte"]:::activity
A2["📂 Gérer les projets"]:::activity
A3["✅ Gérer les tâches"]:::activity
A4["👥 Collaborer"]:::activity
A5["📊 Suivre & Piloter"]:::activity
%% ── TÂCHES UTILISATEUR ─────────────────────────────────────────────
T1["S'authentifier"]:::usertask
T2["Gérer les rôles"]:::usertask
T3["Créer un projet"]:::usertask
T4["Lister les projets"]:::usertask
T5["Créer une tâche"]:::usertask
T6["Changer le statut"]:::usertask
T7["Gérer la priorité"]:::usertask
T8["Créer une équipe"]:::usertask
T9["Attribuer une tâche"]:::usertask
T10["Voir les retards"]:::usertask
T11["Trier / Filtrer"]:::usertask
T12["Tableau de bord"]:::usertask
%% ── RELEASES ───────────────────────────────────────────────────────
MVP["🟢 Release 1 — MVP"]:::mvp
R2L["🟠 Release 2 — Collaboration"]:::rel2
R3L["🔴 Release 3 — Pilotage"]:::rel3
%% ── LIENS RÔLES → ACTIVITÉS ────────────────────────────────────────
R1 --> A1
R2 --> A2
R2 --> A4
R3 --> A3
R4 --> A5
%% ── LIENS ACTIVITÉS → TÂCHES ───────────────────────────────────────
A1 --> T1
A1 --> T2
A2 --> T3
A2 --> T4
A3 --> T5
A3 --> T6
A3 --> T7
A4 --> T8
A4 --> T9
A5 --> T10
A5 --> T11
A5 --> T12
%% ── LIENS TÂCHES → RELEASES ────────────────────────────────────────
T1 --> MVP
T2 --> MVP
T3 --> MVP
T4 --> MVP
T5 --> MVP
T6 --> MVP
T7 --> MVP
T10 --> MVP
T8 --> R2L
T9 --> R2L
T11 --> R2L
T12 --> R3L
%% ── STYLES ─────────────────────────────────────────────────────────
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef activity fill:#90caf9,stroke:#1565c0,color:#000
classDef usertask fill:#fff176,stroke:#f9a825,color:#000
classDef mvp fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef rel2 fill:#ffcc80,stroke:#e65100,color:#000
classDef rel3 fill:#ef9a9a,stroke:#b71c1c,color:#000
Découpage des Releases
Release 1 — MVP (Minimum Valuable Product) - Authentification et gestion des rôles utilisateurs - Création et gestion de projets - Création et gestion de tâches (description, priorité, échéance, statut) - Suivi des statuts et identification des tâches en retard - API RESTful pour toutes ces opérations - Validation des données
Release 2 — Collaboration - Authentification réelle via Keycloak (OpenID Connect, PKCE) - Création et gestion des équipes - Attribution des tâches aux membres - Association de projets aux équipes - Tri et filtrage des tâches - Pagination UI
Release 3 — Pilotage - Tableau de bord de progression - Historique des modifications - Notifications d’échéances
Exigences
Exigence 1 : Création de Tâches (MVP)
User Story : En tant que membre d’équipe, je veux créer des tâches avec des informations détaillées, afin de documenter le travail à accomplir.
Example Mapping
graph TD
US1["👤 membre d'équipe\nCréer une tâche"]:::role
R1_1["📏 Description non vide obligatoire\nmax 250 caractères"]:::rule
R1_2["📏 Priorité par défaut = medium"]:::rule
R1_3["📏 Échéance optionnelle"]:::rule
R1_4["📏 Horodatage de création enregistré"]:::rule
E1_1["✅ Créer 'Corriger le bug #42' priorité high\n→ statut todo"]:::example_ok
E1_2["✅ Créer sans priorité\n→ priorité medium assignée"]:::example_ok
E1_3["✅ Créer sans échéance\n→ tâche acceptée"]:::example_ok
E1_4["✅ Créer une tâche\n→ createdAt et createdBy présents"]:::example_ok
E1_5["❌ Soumettre description vide\n→ erreur HTTP 400"]:::example_ko
E1_6["❌ Soumettre description de 251 caractères\n→ erreur HTTP 400"]:::example_ko
US1 --> R1_1
US1 --> R1_2
US1 --> R1_3
US1 --> R1_4
R1_1 --> E1_1
R1_1 --> E1_5
R1_1 --> E1_6
R1_2 --> E1_2
R1_3 --> E1_3
R1_4 --> E1_4
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Création d’une tâche complète
Given un utilisateur authentifié When il soumet une tâche avec une description "Corriger le bug #42", une échéance et une priorité "high" Then le Task_Manager crée la Task avec ces informations et le statut "todo" And la Task reçoit un identifiant unique And le champ "createdAt" et "createdBy" sont enregistrésScénario : Priorité par défaut
Given un utilisateur authentifié When il crée une tâche sans spécifier de priorité Then le Task_Manager assigne la priorité "medium" par défautScénario : Tâche sans échéance
Given un utilisateur authentifié When il crée une tâche sans échéance Then le Task_Manager accepte la Task sans exiger d'échéanceScénario : Rejet d’une description vide
Given un utilisateur authentifié When il soumet une tâche avec une description vide Then le Task_Manager retourne une erreur HTTP 400 And le message d'erreur indique que la description est obligatoireScénario : Rejet d’une description trop longue
Given un utilisateur authentifié When il soumet une tâche avec une description de 251 caractères Then le Task_Manager retourne une erreur HTTP 400 And le message d'erreur indique que la description ne peut pas dépasser 250 caractères
Exigence 2 : Organisation des Tâches en Projets (MVP)
User Story : En tant que gestionnaire d’équipe, je veux organiser les tâches en projets, afin de regrouper le travail connexe.
Example Mapping
graph TD
US2["👤 gestionnaire d'équipe\nOrganiser les tâches en projets"]:::role
R2_1["📏 Un projet doit avoir un nom"]:::rule
R2_2["📏 Plusieurs tâches peuvent appartenir\nau même projet"]:::rule
R2_3["📏 Une tâche peut exister sans projet"]:::rule
R2_4["📏 Consulter un projet liste ses tâches"]:::rule
R2_5["📏 Pas de sous-projets"]:::rule
E2_1["✅ Créer 'Sprint Q1'\n→ projet enregistré avec ID unique"]:::example_ok
E2_2["✅ Associer T1, T2, T3 au projet P1\n→ association acceptée"]:::example_ok
E2_3["✅ Créer une tâche sans projet\n→ tâche acceptée"]:::example_ok
E2_4["✅ Consulter P1\n→ T1, T2, T3 affichées"]:::example_ok
E2_5["❌ Créer un projet avec parentId\n→ erreur HTTP 400"]:::example_ko
US2 --> R2_1
US2 --> R2_2
US2 --> R2_3
US2 --> R2_4
US2 --> R2_5
R2_1 --> E2_1
R2_2 --> E2_2
R2_3 --> E2_3
R2_4 --> E2_4
R2_5 --> E2_5
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Création d’un projet
Given un utilisateur avec les permissions nécessaires When il crée un Project avec le nom "Sprint Q1" et une description Then le Task_Manager enregistre le Project avec un identifiant uniqueScénario : Association de tâches à un projet
Given un Project "Sprint Q1" existant When plusieurs Tasks sont associées à ce Project Then le Task_Manager permet ces associations multiples And le Task_Manager lie chaque Task au ProjectScénario : Affichage des tâches d’un projet
Given un Project contenant plusieurs Tasks When un utilisateur consulte ce Project Then le Task_Manager affiche toutes les Tasks associées à ce ProjectScénario : Tâche sans projet
Given un utilisateur authentifié When il crée une Task sans spécifier de Project Then le Task_Manager accepte la Task sans association à un ProjectScénario : Rejet de la création de sous-projet
Given un Project existant When un utilisateur tente de créer un Project avec un parentId Then le Task_Manager retourne une erreur HTTP 400 And le message indique que les sous-projets ne sont pas supportés
Exigence 3 : Suivi du Statut des Tâches (MVP)
User Story : En tant que membre d’équipe, je veux mettre à jour le statut des tâches, afin que les autres puissent voir ma progression.
Example Mapping
graph TD
US3["👤 membre d'équipe\nSuivre le statut des tâches"]:::role
R3_1["📏 Seuls les statuts valides sont acceptés\ntodo / in-progress / completed"]:::rule
R3_2["📏 La date de complétion est enregistrée"]:::rule
R3_3["📏 Toutes les transitions sont permises\n(non contraintes)"]:::rule
R3_4["📏 L'auteur de la modification est tracé"]:::rule
E3_1["✅ Passer à in-progress\n→ accepté"]:::example_ok
E3_2["❌ Passer à 'done'\n→ rejeté"]:::example_ko
E3_3["✅ Passer à completed\n→ completedAt enregistré"]:::example_ok
E3_4["✅ todo → completed directement\n→ accepté"]:::example_ok
E3_5["✅ completed → todo\n→ accepté"]:::example_ok
E3_6["✅ Modifier le statut\n→ updatedBy enregistré"]:::example_ok
US3 --> R3_1
US3 --> R3_2
US3 --> R3_3
US3 --> R3_4
R3_1 --> E3_1
R3_1 --> E3_2
R3_2 --> E3_3
R3_3 --> E3_4
R3_3 --> E3_5
R3_4 --> E3_6
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Mise à jour avec valeur valide
Given une Task avec le statut "todo" When un utilisateur change le statut à "in-progress" Then le Task_Manager accepte la mise à jour And enregistre l'utilisateur ayant effectué la modificationScénario : Rejet d’un statut invalide
Given une Task existante When un utilisateur soumet le statut "done" Then le Task_Manager rejette la mise à jour And retourne un message d'erreur listant les valeurs valides ("todo", "in-progress", "completed")Scénario : Enregistrement de la date de complétion
Given une Task avec le statut "in-progress" When un utilisateur change le statut à "completed" Then le Task_Manager enregistre l'horodatage de complétion dans "completedAt"Scénario : Transition libre entre statuts
Given une Task avec le statut "completed" When un utilisateur change le statut à "todo" Then le Task_Manager accepte cette transition sans restriction
Exigence 4 : Gestion des Priorités (MVP)
User Story : En tant que gestionnaire d’équipe, je veux définir les priorités des tâches, afin que l’équipe se concentre d’abord sur le travail important.
Example Mapping
graph TD
US4["👤 gestionnaire d'équipe\nGérer les priorités"]:::role
R4_1["📏 Seules les priorités valides sont acceptées\nlow / medium / high"]:::rule
R4_2["📏 La priorité est modifiable à tout moment"]:::rule
R4_3["📏 Les tâches sont triables par priorité"]:::rule
E4_1["✅ Définir high\n→ accepté"]:::example_ok
E4_2["❌ Définir 'urgent'\n→ rejeté"]:::example_ko
E4_3["✅ Modifier low → high sur tâche in-progress\n→ accepté"]:::example_ok
E4_4["✅ Lister triées par priorité\n→ high en premier"]:::example_ok
US4 --> R4_1
US4 --> R4_2
US4 --> R4_3
R4_1 --> E4_1
R4_1 --> E4_2
R4_2 --> E4_3
R4_3 --> E4_4
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Définition d’une priorité valide
Given une Task existante When un utilisateur définit la priorité à "high" Then le Task_Manager accepte et enregistre la prioritéScénario : Rejet d’une priorité invalide
Given une Task existante When un utilisateur soumet la priorité "urgent" Then le Task_Manager rejette la mise à jour And retourne un message d'erreur listant les valeurs valides ("low", "medium", "high")Scénario : Modification de priorité sur tâche en cours
Given une Task avec le statut "in-progress" et la priorité "low" When un utilisateur change la priorité à "high" Then le Task_Manager accepte cette modificationScénario : Tri des tâches par priorité
Given plusieurs Tasks avec des priorités différentes When un utilisateur demande la liste triée par priorité Then le Task_Manager retourne les Tasks dans l'ordre "high", "medium", "low"
Exigence 5 : Gestion des Rôles Utilisateurs (MVP)
User Story : En tant qu’administrateur, je veux attribuer des rôles aux utilisateurs, afin de contrôler les permissions d’accès.
Example Mapping
graph TD
US5["👤 administrateur\nGérer les rôles utilisateurs"]:::role
R5_1["📏 Seuls les rôles valides sont acceptés\nadmin / manager / developer / viewer"]:::rule
R5_2["📏 Un User peut avoir plusieurs rôles"]:::rule
R5_3["📏 viewer ne peut pas modifier"]:::rule
R5_4["📏 developer peut créer des tâches\net mettre à jour ses propres tâches\n(pas celles des autres)"]:::rule
R5_5["📏 manager peut créer projets,\ntâches et attributions"]:::rule
R5_6["📏 admin a tous les droits"]:::rule
E5_1["✅ Créer User avec rôle viewer\n→ accepté"]:::example_ok
E5_2["❌ Créer User avec rôle 'superuser'\n→ rejeté"]:::example_ko
E5_3["✅ Assigner rôles developer ET manager\nau même User → accepté"]:::example_ok
E5_4["❌ viewer tente de créer une Task\n→ refusé HTTP 403"]:::example_ko
E5_5["✅ developer crée une Task\n→ accepté"]:::example_ok
E5_6["❌ developer modifie la Task d'un autre\n→ refusé HTTP 403"]:::example_ko
E5_7["✅ manager crée un Project\n→ accepté"]:::example_ok
E5_8["✅ admin supprime un User\n→ accepté"]:::example_ok
US5 --> R5_1
US5 --> R5_2
US5 --> R5_3
US5 --> R5_4
US5 --> R5_5
US5 --> R5_6
R5_1 --> E5_1
R5_1 --> E5_2
R5_2 --> E5_3
R5_3 --> E5_4
R5_4 --> E5_5
R5_4 --> E5_6
R5_5 --> E5_7
R5_6 --> E5_8
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Attribution d’un rôle valide
Given un admin authentifié When il crée un User avec le rôle "developer" Then le Task_Manager enregistre le User avec ce rôleScénario : Rejet d’un rôle invalide
Given un admin authentifié When il tente de créer un User avec le rôle "superuser" Then le Task_Manager rejette la requête And retourne un message d'erreur listant les rôles valides ("admin", "manager", "developer", "viewer")Scénario : Restrictions du rôle viewer
Given un User avec le rôle "viewer" When il tente de créer une Task Then le Task_Manager refuse l'opération avec un code HTTP 403Scénario : Permissions du rôle developer
Given un User avec le rôle "developer" When il crée une Task ou met à jour le statut d'une Task qui lui est attribuée Then le Task_Manager accepte ces opérationsScénario : Permissions du rôle manager
Given un User avec le rôle "manager" When il crée un Project, une Task ou un Assignment Then le Task_Manager accepte ces opérationsScénario : Permissions du rôle admin
Given un User avec le rôle "admin" When il effectue n'importe quelle opération, y compris la gestion des Users Then le Task_Manager accepte toutes ces opérations
Exigence 6 : Suivi des Échéances (MVP)
User Story : En tant que membre d’équipe, je veux voir les échéances des tâches, afin de prioriser mon travail et respecter les délais.
Example Mapping
graph TD
US6["👤 membre d'équipe\nSuivre les échéances"]:::role
R6_1["📏 Échéance stockée avec date et heure"]:::rule
R6_2["📏 Tâche non complétée après échéance\n= en retard"]:::rule
R6_3["📏 Tâches triables par échéance"]:::rule
R6_4["📏 Échéance modifiable à tout moment"]:::rule
R6_5["📏 Tâche complétée en retard\nconserve ce statut"]:::rule
R6_6["📏 Fuseau horaire de référence\nGMT+1 (Europe/Paris)"]:::rule
E6_1["✅ Créer Task avec échéance 2025-12-31T18:00:00Z\n→ stockée précisément"]:::example_ok
E6_2["✅ Task non complétée, échéance hier\n→ identifiée en retard"]:::example_ok
E6_3["✅ Lister triées par échéance\n→ ordre chronologique"]:::example_ok
E6_4["✅ Modifier l'échéance d'une Task in-progress\n→ accepté"]:::example_ok
E6_5["✅ Compléter une Task après son échéance\n→ retard préservé dans l'historique"]:::example_ok
E6_6["✅ Évaluer le retard d'une Task\n→ comparaison en GMT+1"]:::example_ok
US6 --> R6_1
US6 --> R6_2
US6 --> R6_3
US6 --> R6_4
US6 --> R6_5
US6 --> R6_6
R6_1 --> E6_1
R6_2 --> E6_2
R6_3 --> E6_3
R6_4 --> E6_4
R6_5 --> E6_5
R6_6 --> E6_6
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Stockage précis de l’échéance
Given un utilisateur authentifié When il crée une Task avec l'échéance "2025-12-31T18:00:00Z" Then le Task_Manager stocke l'échéance avec une précision de date et heureScénario : Identification d’une tâche en retard
Given une Task non complétée dont l'échéance est passée When le Task_Manager évalue l'état de la Task Then il identifie cette Task comme en retardScénario : Tri par échéance
Given plusieurs Tasks avec des échéances différentes When un utilisateur demande la liste triée par échéance Then le Task_Manager retourne les Tasks dans l'ordre chronologique croissantScénario : Modification d’échéance
Given une Task existante avec une échéance When un utilisateur modifie l'échéance Then le Task_Manager accepte et enregistre la nouvelle échéanceScénario : Préservation du retard à la complétion
Given une Task dont l'échéance est dépassée When un utilisateur la marque comme "completed" Then le Task_Manager enregistre la complétion And préserve l'indicateur de retard dans l'historiqueScénario : Fuseau horaire de référence GMT+1
Given une Task non complétée avec une échéance à "2025-06-15T23:59:00+01:00" When le Task_Manager évalue le retard à "2025-06-16T00:01:00+01:00" Then il identifie cette Task comme en retard en se basant sur le fuseau GMT+1 (Europe/Paris)
Exigence 7 : Validation des Données (MVP)
User Story : En tant qu’administrateur système, je veux une validation des entrées, afin de maintenir l’intégrité des données.
Example Mapping
graph TD
US7["👤 administrateur système\nValider les données"]:::role
R7_1["📏 Description vide → rejetée"]:::rule
R7_2["📏 Statut invalide → rejeté\navec liste des valeurs valides"]:::rule
R7_3["📏 Priorité invalide → rejetée\navec liste des valeurs valides"]:::rule
R7_4["📏 Échéance dans le passé\n→ acceptée avec avertissement"]:::rule
R7_5["📏 Attribution à User inexistant\n→ rejetée"]:::rule
E7_1["❌ Soumettre Task sans description\n→ erreur HTTP 400"]:::example_ko
E7_2["❌ Soumettre statut 'done'\n→ erreur avec liste todo, in-progress, completed"]:::example_ko
E7_3["❌ Soumettre priorité 'critical'\n→ erreur avec liste low, medium, high"]:::example_ko
E7_4["✅ Créer Task avec échéance hier\n→ Task créée + warning retourné"]:::example_ok
E7_5["❌ Assigner Task à userId inconnu\n→ erreur HTTP 404"]:::example_ko
US7 --> R7_1
US7 --> R7_2
US7 --> R7_3
US7 --> R7_4
US7 --> R7_5
R7_1 --> E7_1
R7_2 --> E7_2
R7_3 --> E7_3
R7_4 --> E7_4
R7_5 --> E7_5
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Rejet d’une description vide
Given un utilisateur authentifié When il soumet une Task avec une description vide Then le Task_Manager retourne une erreur HTTP 400 And le message d'erreur indique que la description est obligatoireScénario : Rejet d’un statut invalide
Given une Task existante When un utilisateur soumet le statut "done" Then le Task_Manager retourne une erreur HTTP 400 And le message liste les valeurs valides : "todo", "in-progress", "completed"Scénario : Rejet d’une priorité invalide
Given une Task existante When un utilisateur soumet la priorité "critical" Then le Task_Manager retourne une erreur HTTP 400 And le message liste les valeurs valides : "low", "medium", "high"Scénario : Échéance dans le passé avec avertissement
Given un utilisateur authentifié When il crée une Task avec une échéance dans le passé Then le Task_Manager crée la Task And retourne un avertissement indiquant que l'échéance est déjà dépasséeScénario : Rejet d’une attribution à un User inexistant
Given une Task existante When un utilisateur tente d'attribuer la Task à un userId inexistant Then le Task_Manager retourne une erreur HTTP 404 And le message indique que l'utilisateur cible n'existe pas
Exigence 8 : API RESTful (MVP)
User Story : En tant que développeur, je veux une API RESTful, afin d’intégrer le système de gestion des tâches avec d’autres outils.
Example Mapping
graph TD
US8["👤 développeur\nIntégrer via API RESTful"]:::role
R8_1["📏 Endpoints Tasks suivent /api/tasks"]:::rule
R8_2["📏 Endpoints Tasks d'un projet\nsuivent /api/projects/{id}/tasks"]:::rule
R8_3["📏 Succès → HTTP 200, 201, 204"]:::rule
R8_4["📏 Erreur client → HTTP 400, 403, 404"]:::rule
R8_5["📏 Erreur serveur → HTTP 500"]:::rule
R8_6["📏 Format d'erreur JSON cohérent"]:::rule
R8_7["📏 Pagination obligatoire\nsur les endpoints de liste"]:::rule
E8_1["✅ GET /api/tasks\n→ liste des tâches HTTP 200"]:::example_ok
E8_2["✅ GET /api/projects/42/tasks\n→ tâches du projet HTTP 200"]:::example_ok
E8_3["✅ POST /api/tasks\n→ Task créée HTTP 201"]:::example_ok
E8_4["❌ GET /api/tasks/999 (inexistant)\n→ HTTP 404 + JSON d'erreur"]:::example_ko
E8_5["❌ Erreur base de données\n→ HTTP 500"]:::example_ko
E8_6["✅ Toute erreur\n→ JSON avec champ 'error'"]:::example_ok
E8_7["✅ GET /api/tasks?page=1&limit=20\n→ résultats paginés avec métadonnées"]:::example_ok
US8 --> R8_1
US8 --> R8_2
US8 --> R8_3
US8 --> R8_4
US8 --> R8_5
US8 --> R8_6
US8 --> R8_7
R8_1 --> E8_1
R8_2 --> E8_2
R8_3 --> E8_3
R8_4 --> E8_4
R8_5 --> E8_5
R8_6 --> E8_6
R8_7 --> E8_7
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Endpoints Tasks
Given l'API est disponible When un développeur accède à "GET /api/tasks" Then le Task_Manager retourne la liste des Tasks avec HTTP 200Scénario : Endpoints Tasks d’un projet
Given un Project avec l'id "42" existant When un développeur accède à "GET /api/projects/42/tasks" Then le Task_Manager retourne les Tasks de ce Project avec HTTP 200Scénario : Code HTTP à la création
Given un utilisateur authentifié When il crée une Task via "POST /api/tasks" Then le Task_Manager retourne HTTP 201 avec la Task créée dans le corps de la réponseScénario : Code HTTP pour ressource introuvable
Given aucune Task avec l'id "999" When un développeur accède à "GET /api/tasks/999" Then le Task_Manager retourne HTTP 404 And le corps contient un message d'erreur JSONScénario : Format d’erreur cohérent
Given une requête API invalide When le Task_Manager retourne une erreur Then le corps de la réponse est un JSON avec au minimum un champ "error" contenant le message d'erreurScénario : Pagination des résultats
Given 50 Tasks existantes dans le système When un développeur accède à "GET /api/tasks?page=1&limit=20" Then le Task_Manager retourne les 20 premières Tasks avec HTTP 200 And la réponse contient les métadonnées de pagination (page, limit, total, totalPages)Scénario : Pagination par défaut
Given des Tasks existantes dans le système When un développeur accède à "GET /api/tasks" sans paramètres de pagination Then le Task_Manager applique une pagination par défaut (page 1, limit 20) And la réponse contient les métadonnées de pagination
Release 2 — Collaboration
Exigence 14 : Authentification Keycloak (Release 2)
User Story : En tant qu’administrateur système, je veux intégrer un fournisseur d’identité cloud-native (Keycloak), afin de sécuriser l’authentification des utilisateurs avec un standard industriel (OpenID Connect).
Example Mapping
graph TD
US14["👤 administrateur système\nIntégrer Keycloak"]:::role
R14_1["📏 Keycloak est le fournisseur d'identité\nunique du système"]:::rule
R14_2["📏 Le frontend redirige vers Keycloak\npour l'authentification (PKCE)"]:::rule
R14_3["📏 Le backend valide les tokens JWT\nvia JWKS (RS256)"]:::rule
R14_4["📏 Les rôles sont gérés dans Keycloak\net synchronisés dans le JWT"]:::rule
R14_5["📏 POST /api/auth/login échange\nle token Keycloak contre un session token"]:::rule
E14_1["✅ Utilisateur non authentifié\n→ redirigé vers Keycloak"]:::example_ok
E14_2["✅ Connexion réussie via Keycloak\n→ redirection vers /tasks"]:::example_ok
E14_3["❌ Token Keycloak invalide\n→ HTTP 401"]:::example_ko
E14_4["✅ Rôles Keycloak synchronisés\n→ permissions appliquées"]:::example_ok
E14_5["✅ Token expiré\n→ refresh automatique"]:::example_ok
US14 --> R14_1
US14 --> R14_2
US14 --> R14_3
US14 --> R14_4
US14 --> R14_5
R14_1 --> E14_1
R14_2 --> E14_2
R14_3 --> E14_3
R14_4 --> E14_4
R14_5 --> E14_5
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Redirection vers Keycloak
Given un utilisateur non authentifié When il accède à une page protégée Then le Task_Manager redirige vers la page de connexion KeycloakScénario : Connexion réussie via Keycloak
Given un utilisateur sur la page de connexion Keycloak When il saisit des identifiants valides Then Keycloak retourne un authorization_code And le frontend échange le code contre un access_token (PKCE) And le frontend appelle POST /api/auth/login avec le token Keycloak And le backend valide le token via JWKS et retourne un session_token And l'utilisateur est redirigé vers /tasksScénario : Rejet d’un token Keycloak invalide
Given un token Keycloak invalide ou expiré When le frontend appelle POST /api/auth/login Then le Task_Manager retourne HTTP 401 And le message indique que le token est invalideScénario : Synchronisation des rôles Keycloak
Given un utilisateur avec le rôle "manager" dans Keycloak When il se connecte via POST /api/auth/login Then le Task_Manager synchronise le rôle "manager" dans la base de données And les permissions RBAC sont appliquées selon ce rôleScénario : Refresh automatique du token
Given un utilisateur authentifié dont le token est expiré When le frontend détecte l'expiration Then il utilise le refresh_token pour obtenir un nouveau access_token And l'utilisateur reste connecté sans interruption
Exigence 9 : Attribution de Tâches (Release 2)
User Story : En tant que gestionnaire d’équipe, je veux attribuer des tâches aux membres de l’équipe, afin que chacun connaisse ses responsabilités.
Example Mapping
graph TD
US9["👤 gestionnaire d'équipe\nAttribuer des tâches"]:::role
R9_1["📏 Une Task peut être attribuée à un User"]:::rule
R9_2["📏 Une Task peut avoir plusieurs assignés"]:::rule
R9_3["📏 Un User voit ses tâches attribuées"]:::rule
R9_4["📏 Supprimer un Assignment\nne supprime pas la Task"]:::rule
R9_5["📏 Horodatage d'attribution enregistré"]:::rule
R9_6["📏 Un developer peut\ns'auto-attribuer une Task"]:::rule
E9_1["✅ Attribuer T1 à U1\n→ Assignment créé avec assignedAt"]:::example_ok
E9_2["✅ Attribuer T1 à U1 et U2\n→ deux Assignments distincts"]:::example_ok
E9_3["✅ U1 consulte ses tâches\n→ T1 apparaît"]:::example_ok
E9_4["✅ Retirer U1 de T1\n→ T1 existe toujours"]:::example_ok
E9_5["✅ Developer s'auto-attribue T1\n→ Assignment créé"]:::example_ok
US9 --> R9_1
US9 --> R9_2
US9 --> R9_3
US9 --> R9_4
US9 --> R9_5
US9 --> R9_6
R9_1 --> E9_1
R9_2 --> E9_2
R9_3 --> E9_3
R9_4 --> E9_4
R9_5 --> E9_1
R9_6 --> E9_5
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Attribution d’une tâche
Given une Task et un User existants When un manager attribue la Task à ce User Then le Task_Manager crée un Assignment liant la Task au User And enregistre l'horodatage dans "assignedAt"Scénario : Attribution multiple
Given une Task existante When elle est attribuée à deux Users différents Then le Task_Manager crée deux Assignments distinctsScénario : Consultation des tâches attribuées
Given un User avec des Assignments When il consulte ses tâches attribuées via "GET /api/tasks?assignedTo={userId}" Then le Task_Manager retourne toutes les Tasks liées à ce UserScénario : Suppression d’une attribution
Given un Assignment existant entre une Task et un User When un manager supprime cet Assignment Then le Task_Manager supprime l'Assignment And la Task existe toujours sans être suppriméeScénario : Auto-attribution par un developer
Given un User avec le rôle "developer" et une Task existante When il s'attribue lui-même cette Task via "POST /api/tasks/{id}/assignments" Then le Task_Manager crée un Assignment liant la Task à ce User And enregistre l'horodatage dans "assignedAt"
Exigence 10 : Collaboration en Équipe (Release 2)
User Story : En tant que gestionnaire d’équipe, je veux créer des équipes et ajouter des membres, afin d’organiser les utilisateurs par département ou fonction.
Example Mapping
graph TD
US10["👤 gestionnaire d'équipe\nCréer des équipes et ajouter des membres"]:::role
R10_1["📏 Une Team doit avoir un nom"]:::rule
R10_2["📏 Maximum 6 membres par Team"]:::rule
R10_3["📏 Un User peut appartenir\nà plusieurs Teams"]:::rule
R10_4["📏 Consulter une Team liste ses membres"]:::rule
R10_5["📏 Un Project peut être associé\nà une Team"]:::rule
E10_1["✅ Créer 'Frontend Team'\n→ Team enregistrée avec ID unique"]:::example_ok
E10_2["✅ Ajouter U1, U2, U3 à Frontend Team\n→ trois membres enregistrés"]:::example_ok
E10_3["❌ Ajouter un 7ème membre à une Team\n→ erreur HTTP 400"]:::example_ko
E10_4["✅ U1 ajouté à 'Frontend' et 'Mobile'\n→ deux appartenances acceptées"]:::example_ok
E10_5["✅ Consulter 'Frontend Team'\n→ U1, U2, U3 affichés"]:::example_ok
E10_6["✅ Associer P1 à 'Frontend Team'\n→ association créée"]:::example_ok
US10 --> R10_1
US10 --> R10_2
US10 --> R10_3
US10 --> R10_4
US10 --> R10_5
R10_1 --> E10_1
R10_2 --> E10_2
R10_2 --> E10_3
R10_3 --> E10_4
R10_4 --> E10_5
R10_5 --> E10_6
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Création d’une équipe
Given un manager authentifié When il crée une Team avec le nom "Frontend Team" Then le Task_Manager enregistre la Team avec un identifiant uniqueScénario : Ajout de membres
Given une Team "Frontend Team" existante avec moins de 6 membres When un manager ajoute trois Users à cette Team Then le Task_Manager enregistre les trois appartenancesScénario : Rejet du dépassement de capacité
Given une Team avec 6 membres When un manager tente d'ajouter un 7ème User Then le Task_Manager retourne une erreur HTTP 400 And le message indique que la Team a atteint sa capacité maximale de 6 membresScénario : Appartenance à plusieurs équipes
Given un User existant When il est ajouté à deux Teams différentes Then le Task_Manager accepte ces deux appartenancesScénario : Affichage des membres
Given une Team avec plusieurs membres When un utilisateur consulte cette Team Then le Task_Manager retourne la liste de tous les Users membresScénario : Association d’un projet à une équipe
Given une Team et un Project existants When un manager associe le Project à la Team Then le Task_Manager enregistre cette association
Release 3 — Pilotage
Exigence 11 : Tableau de Bord de Progression (Release 3)
User Story : En tant que gestionnaire d’équipe, je veux consulter un tableau de bord de progression, afin d’avoir une vue d’ensemble de l’avancement du travail.
Example Mapping
graph TD
US11["👤 gestionnaire d'équipe\nConsulter le tableau de bord"]:::role
R11_1["📏 Le tableau de bord affiche\nle nombre de tâches par statut"]:::rule
R11_2["📏 Le tableau de bord est filtrable\npar projet et par équipe"]:::rule
R11_3["📏 Le tableau de bord affiche\nle taux de complétion"]:::rule
E11_1["✅ Consulter le dashboard\n→ compteurs todo / in-progress / completed affichés"]:::example_ok
E11_2["✅ Filtrer par projet P1\n→ statistiques limitées aux tâches de P1"]:::example_ok
E11_3["✅ Filtrer par équipe 'Frontend'\n→ statistiques limitées aux tâches de l'équipe"]:::example_ok
E11_4["✅ 3 tâches completed sur 10\n→ taux de complétion 30% affiché"]:::example_ok
US11 --> R11_1
US11 --> R11_2
US11 --> R11_3
R11_1 --> E11_1
R11_2 --> E11_2
R11_2 --> E11_3
R11_3 --> E11_4
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Affichage des compteurs par statut
Given un gestionnaire authentifié When il consulte le tableau de bord Then le Task_Manager affiche le nombre de Tasks pour chaque statut : "todo", "in-progress", "completed"Scénario : Filtrage par projet
Given un gestionnaire authentifié et un Project "Sprint Q1" existant When il consulte le tableau de bord filtré par ce Project Then le Task_Manager retourne les statistiques uniquement pour les Tasks de ce ProjectScénario : Filtrage par équipe
Given un gestionnaire authentifié et une Team "Frontend" existante When il consulte le tableau de bord filtré par cette Team Then le Task_Manager retourne les statistiques uniquement pour les Tasks des projets de cette TeamScénario : Taux de complétion
Given 10 Tasks dont 3 avec le statut "completed" When un gestionnaire consulte le tableau de bord Then le Task_Manager affiche un taux de complétion de 30%
Exigence 12 : Historique des Modifications (Release 3)
User Story : En tant que membre d’équipe, je veux consulter l’historique des modifications d’une tâche, afin de comprendre son évolution et tracer les changements.
Example Mapping
graph TD
US12["👤 membre d'équipe\nConsulter l'historique des modifications"]:::role
R12_1["📏 Chaque modification de statut\nest enregistrée dans l'historique"]:::rule
R12_2["📏 Chaque modification de priorité\nest enregistrée dans l'historique"]:::rule
R12_3["📏 L'historique contient l'auteur,\nla date et les valeurs avant/après"]:::rule
R12_4["📏 L'historique est accessible\nvia l'API"]:::rule
E12_1["✅ Changer statut todo → in-progress\n→ entrée d'historique créée"]:::example_ok
E12_2["✅ Changer priorité low → high\n→ entrée d'historique créée"]:::example_ok
E12_3["✅ Consulter historique de T1\n→ auteur, date, ancienne et nouvelle valeur présents"]:::example_ok
E12_4["✅ GET /api/tasks/{id}/history\n→ liste des modifications retournée"]:::example_ok
US12 --> R12_1
US12 --> R12_2
US12 --> R12_3
US12 --> R12_4
R12_1 --> E12_1
R12_2 --> E12_2
R12_3 --> E12_3
R12_4 --> E12_4
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Enregistrement d’un changement de statut
Given une Task avec le statut "todo" When un utilisateur change le statut à "in-progress" Then le Task_Manager crée une entrée dans l'historique And l'entrée contient l'auteur, la date, la valeur avant "todo" et la valeur après "in-progress"Scénario : Enregistrement d’un changement de priorité
Given une Task avec la priorité "low" When un utilisateur change la priorité à "high" Then le Task_Manager crée une entrée dans l'historique And l'entrée contient l'auteur, la date, la valeur avant "low" et la valeur après "high"Scénario : Consultation de l’historique via l’API
Given une Task avec plusieurs modifications enregistrées When un utilisateur accède à "GET /api/tasks/{id}/history" Then le Task_Manager retourne la liste chronologique des modifications avec HTTP 200Scénario : Historique vide pour une nouvelle tâche
Given une Task nouvellement créée sans modification When un utilisateur accède à "GET /api/tasks/{id}/history" Then le Task_Manager retourne une liste vide avec HTTP 200
Exigence 13 : Notifications d’Échéances (Release 3)
User Story : En tant que membre d’équipe, je veux recevoir des notifications lorsqu’une échéance approche ou est dépassée, afin de ne pas manquer mes délais.
Example Mapping
graph TD
US13["👤 membre d'équipe\nRecevoir des notifications d'échéances"]:::role
R13_1["📏 Une notification est générée\n24h avant l'échéance"]:::rule
R13_2["📏 Une notification est générée\nlorsque l'échéance est dépassée"]:::rule
R13_3["📏 Les notifications sont accessibles\nvia l'API"]:::rule
R13_4["📏 Une notification est marquée\ncomme lue par l'utilisateur"]:::rule
E13_1["✅ Task avec échéance dans 23h\n→ notification générée"]:::example_ok
E13_2["✅ Task non complétée, échéance dépassée\n→ notification de retard générée"]:::example_ok
E13_3["✅ GET /api/notifications\n→ liste des notifications retournée"]:::example_ok
E13_4["✅ Marquer notification comme lue\n→ statut 'read' enregistré"]:::example_ok
E13_5["✅ Task complétée avant échéance\n→ aucune notification de retard générée"]:::example_ok
US13 --> R13_1
US13 --> R13_2
US13 --> R13_3
US13 --> R13_4
R13_1 --> E13_1
R13_2 --> E13_2
R13_2 --> E13_5
R13_3 --> E13_3
R13_4 --> E13_4
classDef role fill:#b39ddb,stroke:#7e57c2,color:#000
classDef rule fill:#ffcc80,stroke:#e65100,color:#000
classDef example_ok fill:#a5d6a7,stroke:#2e7d32,color:#000
classDef example_ko fill:#ef9a9a,stroke:#b71c1c,color:#000
classDef question fill:#e0e0e0,stroke:#757575,color:#000
Critères d’Acceptation
Scénario : Notification 24h avant l’échéance
Given une Task non complétée dont l'échéance est dans moins de 24h When le Task_Manager évalue les échéances Then il génère une notification pour les Users assignés à cette TaskScénario : Notification de retard
Given une Task non complétée dont l'échéance est dépassée When le Task_Manager évalue les échéances Then il génère une notification de retard pour les Users assignés à cette TaskScénario : Pas de notification pour tâche complétée
Given une Task avec le statut "completed" dont l'échéance est dépassée When le Task_Manager évalue les échéances Then il ne génère aucune notification de retard pour cette TaskScénario : Consultation des notifications
Given un User avec des notifications non lues When il accède à "GET /api/notifications" Then le Task_Manager retourne la liste de ses notifications avec HTTP 200Scénario : Marquer une notification comme lue
Given une notification non lue When un User effectue "PATCH /api/notifications/{id}/read" Then le Task_Manager marque la notification comme lue And retourne HTTP 200
Notes
Ce document définit les exigences fonctionnelles du Task Management System selon la méthodologie BDD, organisées en Story Map avec un découpage en releases. Chaque User Story inclut un Example Mapping Mermaid coloré et des critères d’acceptation en format Gherkin (Given/When/Then), garantissant la clarté, la testabilité et la traçabilité des exigences.