105 lines
3.0 KiB
Plaintext
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 |