====== Design de l'API ======
L'API publique à été concue pour offrir un maximum de fonctionnalités aux utilisateurs sans compromettre la flexibilité d'implémentation. La seule classe offrant une implémentation concrète étant la ''CatalogFactory'' chargée d'instancier les bonnes sous-classes en fonction du type de catalogue.
Si plus d'options de stockage venaient à se présenter (ex. JSON), un refactor de la factory serait très probablement nécéssaire afin de mieux supporter des implémentations arbitraires.
La première partie de l'API est une copie conforme du modèle de domaine en termes d'implémentation. Elle fournit un moyen de parcourir et modifier les données du catalogue de manière simple.
hide empty methods
hide empty fields
class CatalogFactory <> {
+ load(url, config?): Catalog
+ create(url, config?): Catalog
}
CatalogFactory ..> Catalog : creates
abstract class VolumeStore {
+ getVolume(metadata, type)
+ addVolume(metadata, volume)
+ deleteVolume(metadata)
+ editVolume(metadata)
}
VolumeStore ..> Volume : loads
VolumeStore <.. VolumeMetadata
abstract class Catalog {
+ isRemote(): bool
+ isLocal(): bool
}
Catalog --> Category : root
interface CatalogNode {
+ name
}
Catalog <- CatalogNode : catalog
CatalogNode - VolumeMetadata
CatalogNode <|-- Category
interface Category {
}
CatalogNode "*" -- "1" Category
CatalogNode <|-- Series
interface Series {
}
Series -> SeriesMetadata : metadata
interface VolumeMetadata {
+ number
+ title
}
VolumeMetadata <- Volume
VolumeMetadata --> "0..1" SeriesMetadata
interface SeriesMetadata {
+ authors[*]
+ artists[*]
+ released
+ summary
}
SeriesMetadata --> Tag : tags
interface Tag {
+ name
}
interface Volume {
}
Volume --> "*" Page
interface Page {
+ contents
}
La seconde partie de l'API permet d'interragir avec les différents éléments de stockage liés aux données d'un catalogue.
* ''CatalogConfig'' configure les chemins du cache du catalogue. Les différents chemins fournis par cette classe sont passés aux autres composants.
* ''INodeFactory'' permet de créer des classes correspondant au moteur de stockage du catalogue.
* ''ICatalogWriter'' permet de sauvegarder le catalogue en utilisant son moteur de stockage.
* ''VolumeStore'' gère le chargement, sauvegarde, ajout, import et supression de volumes dans le système de fichiers. Cetaines de ces opérations peuvent être indisponnibles selon l'emplacement du catalogue.
* ''ThumbnailStore'' permet de récupérer la miniature associée à un volume. Selon l'implémentation elle sera soit extraite du fichier cbz ou téléchargée et mise en cache.
hide empty methods
hide empty fields
class CatalogFactory <> {
+ load(url, config?): Catalog
+ create(url, config?): Catalog
}
CatalogFactory ..> Catalog : creates
CatalogFactory --> CatalogConfig : defaultConfig
class CatalogConfig {
+ cachePath
}
abstract class Catalog {
+ isRemote(): bool
+ isLocal(): bool
}
Catalog -> CatalogConfig : config
Catalog --> INodeFactory
Catalog --> ICatalogWriter
Catalog --> VolumeStore
Catalog --> ThumbnailStore
interface INodeFactory {
+ createCategory(name): Category
+ createSeries(name): Series
+ createVolume(number, name?): VolumeMetadata
+ createSeriesMetadata(): SeriesMetadata
+ createTag(): Tag
}
interface ICatalogWriter {
+ write()
+ writeTo()
}
interface Volume {
}
class VolumeFactory <> {
+ getLoader(type): IVolumeLoader
+ getWriter(): IVolumeWriter
}
VolumeFactory ..> IVolumeLoader : creates
VolumeFactory ..> IVolumeWriter : creates
interface IVolumeLoader {
+ load(path, metadata): Volume
}
IVolumeLoader ..> Volume : loads
interface IVolumeWriter {
+ load(path): Volume
+ createEmpty(): Volume
+ write(path, volume)
+ createPage(volume): Page
+ setPageName(page)
+ setPageContents(page)
}
abstract class VolumeStore {
+ getVolume(metadata, type): Future
+ addVolume(metadata, volume)
+ deleteVolume(metadata)
+ editVolume(metadata): Future
}
VolumeStore ...> IVolumeLoader : uses
abstract class ThumbnailStore {
+ getThumbnail(metadata): Future
}