Files
flashcards/diagrams/class.puml
T

105 lines
3.0 KiB
Plaintext

@startuml classes
' Diagramme de classes — Application web Flashcards (Architecture : couche d'accès générique)
skinparam classAttributeIconSize 0
skinparam classFontStyle bold
' ===== Domaine =====
class Card {
- id : string
- question : string
- response : string
- theme : string
- tags : string[]
- createdAt : Date
- updatedAt : Date
+ Card(id, question, response, theme, tags)
+ validate() : void
}
' ===== Abstraction générique d'accès aux données =====
interface CardRepository {
+ findAll() : Promise<Card[]>
+ findById(id : string) : Promise<Card | null>
+ findRandom() : Promise<Card | null>
+ findRandomByTheme(theme : string) : Promise<Card | null>
+ findThemes() : Promise<string[]>
+ create(card : Card) : Promise<Card>
+ update(card : Card) : Promise<Card>
+ delete(id : string) : Promise<boolean>
}
' ===== Implémentations SGBD =====
class MysqlCardRepository {
- connection : MysqlConnection
+ MysqlCardRepository(connection)
}
class MongoCardRepository {
- collection : MongoCollection
+ MongoCardRepository(collection)
}
class "MysqlConnection" as ConnMysql {
- host : string
- port : number
- user : string
- password : string
- database : string
+ query(sql : string, params : unknown[]) : Promise<unknown>
}
class "MongoCollection" as ColMongo {
+ find(filter : object) : Promise<unknown[]>
+ insertOne(doc : object) : Promise<unknown>
+ updateOne(filter : object, update : object) : Promise<unknown>
+ deleteOne(filter : object) : Promise<unknown>
}
class DatabaseConfig {
- driver : string
+ getActiveDriver() : string
}
' ===== Service métier (dépend uniquement de l'abstraction) =====
class CardService {
- repository : CardRepository
+ CardService(repository : CardRepository)
+ listCards() : Promise<Card[]>
+ getCard(id : string) : Promise<Card>
+ createCard(payload : NewCardPayload) : Promise<Card>
+ updateCard(id : string, payload : UpdateCardPayload) : Promise<Card>
+ deleteCard(id : string) : Promise<void>
+ playRandom(theme? : string) : Promise<Card>
+ listThemes() : Promise<string[]>
}
' ===== Couche exposition (routes / contrôleur) =====
class CardController {
+ handleList(req, res) : Promise<void>
+ handleGetById(req, res) : Promise<void>
+ handleCreate(req, res) : Promise<void>
+ handleUpdate(req, res) : Promise<void>
+ handleDelete(req, res) : Promise<void>
+ handlePlayRandom(req, res) : Promise<void>
+ handleThemes(req, res) : Promise<void>
}
class Factory {
{static} buildCardRepository(config : DatabaseConfig) : CardRepository
}
' ===== Relations =====
CardRepository <|.. MysqlCardRepository
CardRepository <|.. MongoCardRepository
MysqlCardRepository *-- ConnMysql : utilise >
MongoCardRepository *-- ColMongo : utilise >
CardService *-- CardRepository : <<injecté>> utilise >
CardService ..> Card : < crée/retourne
CardController --> CardService : utilise
Factory ..> CardRepository : <<instance de>> construit
Factory ..> CardService : construit
@enduml