@startuml ' Diagramme de séquence — "Afficher une carte" puis "Révéler la réponse" ' Application web Flashcards (SPA/PWA, couche d'accès générique MySQL/Mongo) hide footbox title Jeu : afficher une carte au hasard puis révéler la réponse actor Utilisateur as User participant "SPA React\n(UI)" as SPA participant "CardController\n(API Next.js)" as Api participant "CardService" as Service participant "CardRepository\n(abstraction générique)" as Repo participant "SGBD\n(MySQL OU MongoDB)" as DB == Afficher une carte au hasard == User -> SPA : clique « Jouer » SPA -> SPA : un thème est-il déjà sélectionné ? alt Thème précis sélectionné (F-04) User -> SPA : sélectionne un thème (ex. javascript) SPA -> Api : GET /api/cards/random?theme=javascript else Tirage global (F-01) SPA -> Api : GET /api/cards/random end Api -> Service : playRandom(theme?) activate Service alt theme fourni Service -> Repo : findRandomByTheme(theme) else sans thème Service -> Repo : findRandom() end activate Repo Repo -> DB : Requête aléatoire (ORDER BY RAND() / $sample) activate DB DB --> Repo : Enregistrement(s) : question, réponse, thème deactivate DB Repo --> Service : Card deactivate Repo Service --> Api : Card (réponse non renvoyée par sécurité) deactivate Service Api --> SPA : 200 JSON { id, question, theme } SPA -> SPA : affiche la question\nla réponse reste masquée == Révéler la réponse == User -> SPA : clique « Voir la réponse » (F-03) SPA -> Api : GET /api/cards/{id}/reveal activate Api Api -> Repo : findById(id) activate Repo Repo -> DB : SELECT par id / findOne activate DB DB --> Repo : Carte complète deactivate DB Repo --> Api : Card { response } deactivate Repo Api --> SPA : 200 JSON { response } deactivate Api SPA --> SPA : déroule et affiche la réponse User -> SPA : reclique (masquer/réafficher) — boucle libre loop tant que joueur le souhaite SPA --> User : réponse visible / masquée end note over Repo : L'implémentation concrète (MySQL ou MongoDB)\nest fournie par la Factory selon DatabaseConfig\nsans impact sur Service ni Api (générique). @enduml