From 1606a3a133d7e67efb731df8236417abf7541eec Mon Sep 17 00:00:00 2001 From: Louis DUFOUR Date: Tue, 3 Oct 2023 20:34:52 +0200 Subject: [PATCH] =?UTF-8?q?Update=20(Back-End):=20Mise=20=C3=A0=20jour?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 210 +++++++++ Sources/BookApp/Pages/Filtrage.xaml | 35 +- Sources/BookApp/Pages/Filtrage.xaml.cs | 3 +- .../DtoAbstractLayer/DtoAbstractLayer.csproj | 4 - Sources/JsonReader/JsonReader.csproj | 1 - Sources/LibraryDTO/LibraryDTO.csproj | 3 - Sources/Model/Author.cs | 16 +- Sources/Model/Book.cs | 20 +- Sources/Model/Borrowing.cs | 19 +- Sources/Model/Contact.cs | 25 ++ Sources/Model/IUserLibraryManager.cs | 33 +- Sources/Model/Loan.cs | 19 +- Sources/Model/Manager.cs | 54 ++- Sources/Model/Model.csproj | 4 - Sources/Model/Status.cs | 13 + Sources/Model/Work.cs | 16 +- Sources/Stub/Stub.csproj | 4 - Sources/Stub/UserLibraryStub.cs | 421 ++++++++++++++++++ Sources/StubbedDTO/Stub.cs | 31 +- Sources/StubbedDTO/StubbedDTO.csproj | 15 +- Sources/StubbedDTO/authors/OL13066A.json | 1 + Sources/StubbedDTO/authors/OL152472A.json | 1 + Sources/StubbedDTO/authors/OL1604887A.json | 1 + Sources/StubbedDTO/authors/OL239209A.json | 1 + Sources/StubbedDTO/authors/OL3113661A.json | 1 + Sources/StubbedDTO/authors/OL55888A.json | 1 + Sources/StubbedDTO/authors/OL5989984A.json | 1 + Sources/StubbedDTO/authors/OL7468980A.json | 1 + Sources/StubbedDTO/books/OL18547803M.json | 35 ++ Sources/StubbedDTO/books/OL26210208M.json | 30 ++ Sources/StubbedDTO/books/OL27328194M.json | 26 ++ Sources/StubbedDTO/books/OL28294024M.json | 33 +- Sources/StubbedDTO/books/OL37758347M.json | 29 ++ Sources/StubbedDTO/books/OL8198056M.json | 38 ++ Sources/StubbedDTO/books/OL8839071M.json | 34 ++ Sources/StubbedDTO/books/OL9797565M.json | 29 ++ .../ratings/OL11466820W.ratings.json | 1 + .../ratings/OL15505243W.ratings.json | 1 + .../ratings/OL1987733W.ratings.json | 1 + .../ratings/OL20148560W.ratings.json | 1 + .../ratings/OL27687397W.ratings.json | 1 + .../StubbedDTO/ratings/OL52266W.ratings.json | 1 + .../StubbedDTO/ratings/OL705036W.ratings.json | 1 + Sources/StubbedDTO/works/OL11466820W.json | 1 + Sources/StubbedDTO/works/OL15505243W.json | 1 + Sources/StubbedDTO/works/OL1987733W.json | 1 + Sources/StubbedDTO/works/OL20148560W.json | 1 + Sources/StubbedDTO/works/OL27687397W.json | 1 + Sources/StubbedDTO/works/OL52266W.json | 1 + Sources/StubbedDTO/works/OL705036W.json | 1 + Sources/Tests/TestsModel/Program.cs | 100 +++++ Sources/Tests/TestsModel/TestsModel.csproj | 14 + Sources/Utils/Utils.csproj | 4 - screens/emprunts.png | Bin 0 -> 221622 bytes symbols/Monochrome=folder.fill.svg | 10 + symbols/Monochrome=folder.svg | 10 + 56 files changed, 1308 insertions(+), 52 deletions(-) create mode 100644 Sources/Model/Contact.cs create mode 100644 Sources/Model/Status.cs create mode 100644 Sources/Stub/UserLibraryStub.cs create mode 100644 Sources/StubbedDTO/authors/OL13066A.json create mode 100644 Sources/StubbedDTO/authors/OL152472A.json create mode 100644 Sources/StubbedDTO/authors/OL1604887A.json create mode 100644 Sources/StubbedDTO/authors/OL239209A.json create mode 100644 Sources/StubbedDTO/authors/OL3113661A.json create mode 100644 Sources/StubbedDTO/authors/OL55888A.json create mode 100644 Sources/StubbedDTO/authors/OL5989984A.json create mode 100644 Sources/StubbedDTO/authors/OL7468980A.json create mode 100644 Sources/StubbedDTO/books/OL18547803M.json create mode 100644 Sources/StubbedDTO/books/OL26210208M.json create mode 100644 Sources/StubbedDTO/books/OL27328194M.json create mode 100644 Sources/StubbedDTO/books/OL37758347M.json create mode 100644 Sources/StubbedDTO/books/OL8198056M.json create mode 100644 Sources/StubbedDTO/books/OL8839071M.json create mode 100644 Sources/StubbedDTO/books/OL9797565M.json create mode 100644 Sources/StubbedDTO/ratings/OL11466820W.ratings.json create mode 100644 Sources/StubbedDTO/ratings/OL15505243W.ratings.json create mode 100644 Sources/StubbedDTO/ratings/OL1987733W.ratings.json create mode 100644 Sources/StubbedDTO/ratings/OL20148560W.ratings.json create mode 100644 Sources/StubbedDTO/ratings/OL27687397W.ratings.json create mode 100644 Sources/StubbedDTO/ratings/OL52266W.ratings.json create mode 100644 Sources/StubbedDTO/ratings/OL705036W.ratings.json create mode 100644 Sources/StubbedDTO/works/OL11466820W.json create mode 100644 Sources/StubbedDTO/works/OL15505243W.json create mode 100644 Sources/StubbedDTO/works/OL1987733W.json create mode 100644 Sources/StubbedDTO/works/OL20148560W.json create mode 100644 Sources/StubbedDTO/works/OL27687397W.json create mode 100644 Sources/StubbedDTO/works/OL52266W.json create mode 100644 Sources/StubbedDTO/works/OL705036W.json create mode 100644 Sources/Tests/TestsModel/Program.cs create mode 100644 Sources/Tests/TestsModel/TestsModel.csproj create mode 100644 screens/emprunts.png create mode 100644 symbols/Monochrome=folder.fill.svg create mode 100644 symbols/Monochrome=folder.svg diff --git a/README.md b/README.md index d31c403..0726392 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,210 @@ # PocketBook +# TP2 : MVVM (partie 2) +_à terminer pour le 15 octobre 2023 - 23h59_ + +🚧 En construction : le **Modèle** est terminé à plus de 95%. Seules des modifications mineures peuvent être intégrées + +## Modifications à prendre en compte : +- le **Stub** est modifié et _doit_ fonctionner sans avoir à utiliser la propriété ```BasePath```, aussi bien en Console qu'avec MAUI +- le **Model** prend en charge maintenant deux services : ```ILibraryManager``` doit permettre de gérer l'intégralité des livres, et ```IUserLibraryManager``` doit permettre de gérer la bibliothèque personnelle de l'utilisateur. Le **Stub** fournit de quoi simuler leur utilisation. + +## Ajout dans l'énoncé + +L'application doit maintenant permettre de naviguer sur toutes les pages et l'utilisateur doit pouvoir : +- changer le statut de lecture d'un livre, +- ajouter un livre aux favoris, +- filtrer les livres par **Auteur**, **Date de publication**, **Note** +- ajouter un livre à sa collection en saisissant l'ISBN (les vues seront à ajouter) +- supprimer un livre +- prêter un livre (et ajouter un contact si besoin) +- consulter la liste des livres prêtés. +Lors de la consultation des livres, il faudra gérer la pagination pour que l'on puisse limiter l'affichage à n (5, 10, 20,...) livres par page. + +> # Note : les TP3 et TP4 peuvent être faits dans le désordre. +> ### Mais pour pouvoir réaliser les TP3 et TP4, vous devez au préalable faire valider les bases du TP2 à votre enseignant. Si celui-ci n'est pas exploitable à la date de rendu demandée, celle-ci est repoussée au 22 octobre 23h59. Le TP2 est prioritaire sur les TP3 et 4. + +# TP3 : utilisation du MVVM Community Toolkit +_à terminer pour le 22 octobre 2023 - 23h59_ + +Modifiez l'intégralité de votre code pour que votre application utilise désormais le MVVM Community Toolkit à la place de votre toolkit maison. + +# TP4 : utilisation de la caméra comme scanner d'ISBN +_à terminer pour le 22 octobre 2023 - 23h59_ + +Ajoutez les vues et les VM nécessaires pour permettre le scan de code-barres afin d'ajouter de nouveaux livres, et la recherche en ligne (via le web service). + +----------------------------------------------------------- +----------------------------------------------------------- + +# TP2 : MVVM +_à terminer pour le 15 octobre 2023 - 23h59_ + +L'objectif de cette partie est de relier les vues (_Views_) et le modèle (_Model_) en respectant le patron d'architecture **MVVM** (_Model-View-ViewModel_). +Vous devrez réaliser les étapes suivantes (je vous suggère de les réaliser dans cet ordre) : +1. page d'accueil : en utilisant une _ContentView_ et des _Commands_, faites en sorte que l'utilisateur puisse : + - naviguer vers la page affichant les livres de l'utilisateur (_BooksPage_) (sans liaison de données pour le moment) en tapant sur **Tous**, + - naviguer vers la page affichant les prêts et emprunts (_LoanPage_) (sans liaison de données pour le moment) en tapant sur **En prêt**, + - naviguer vers la page affichant des filtres par critères (_FilterPage_) (sans liaison de données pour le moment) en tapant sur **À lire plus tard**, **Statut de lecture**, **Favoris**, **Auteur**, **Date de publication**, **Note** + - afficher la vue permettant d'ajouter un livre lorsqu'on clique sur le **+** puis ajouter une vue modale lorsqu'on clique sur **Saisir l'ISBN** + > _**Note**_ : vous devez bien sûr limiter au maximum le code en _code-behind_ et utiliser des _VM_ et des _Commands_. +2. affichage des livres de l'utilisateur : afficher tous les livres de l'utilisateur dans la vue _BooksPage_ et permettre la sélection d'un livre et la navigation vers la page _BookPage_ + > _**Note**_ : le modèle ne permet pas encore d'accéder aux livres de l'utilisateur, mais vous pouvez utiliser dans un premier temps la fonctionnalité qui permet d'atteindre tous les livres. Elle est basée sur un stub et il y en a donc peu. Cette partie manquante du modèle devrait être livrée dans la semaine. + + > _**Conseils**_ : commencez par les données simples (titre du livre, auteur, statut de lecture), puis passez à la navigation vers la page d'un livre (_BookPage_) où vous pourrez afficher les données simples (titre du livre, l'auteur, la maison d'édition, le résumé, le nombre de pages, la langue, l'isbn et le statut de lecture). Enfin, vous pourrez vous occuper des données plus compliquées à afficher (la couverture et la note). Le bouton avec les deux flèches inversera l'ordre d'affichage. + + > _**Difficile**_ : l'utilisation de la _scrollview_ par index est plus compliquée. Je la compterai en bonus. +3. filtrage par auteur et par date de publication : afficher dans la vue de filtrage (_FilterPage_) + - les auteurs (et le nombre de livres par auteur) lorsqu'on tape sur _Auteurs_, puis navigation vers la page des livres _BooksPage_ mais seulement avec les livres de l'auteur sélectionné, + - les années de publication (et le nombre de livres par année) lorsqu'on tape sur _Date de publication_, puis navigation vers la page des livres _BooksPage_ mais seulement avec les livres publiés dans l'année sélectionné. + +## Modèle + +```mermaid +classDiagram +direction LR +class Book { + +Id : string + +Title : string + +Publishers : List~string~ + +PublishDate : DateTime + +ISBN13 : string + +Series : List~string~ + +NbPages : int + +Format : string + +ImageSmall : string + +ImageMedium : string + +ImageLarge : string +} + +class Languages { + <> + Unknown, + French, +} + +class Work { + +Id : string + +Description : string + +Title : string + +Subjects : List~string~ +} + +class Contributor { + +Name : string + +Role : string +} + +class Author { + +Id : string + +Name : string + +ImageSmall : string + +ImageMedium : string + +ImageLarge : string + +Bio : string + +AlternateNames : List~string~ + +BirthDate : DateTime? + +DeathDate : DateTime? +} + +class Link { + +Title : string + +Url : string +} + +class Ratings { + +Average : float + +Count : int +} + +Book --> "1" Languages : Language +Book --> "*" Contributor : Contributors +Author --> "*" Link : Links +Work --> "*" Author : Authors +Work --> "1" Ratings : Ratings +Book --> "*" Author : Authors +Book --> "*" Work : Works + +class Status { + <> + Unknown, + Finished, + Reading, + NotRead, + ToBeRead +} + +class Contact{ + +string Id; + +string FirstName; + +string LastName; +} +``` + +## Services & Interfaces +```mermaid +classDiagram +direction LR +Book --> "1" Languages : Language +Book --> "*" Contributor : Contributors +Author --> "*" Link : Links +Work --> "1" Ratings : Ratings +Work --> "*" Author : Authors +Book --> "*" Work : Works +Book --> "*" Author : Authors + +class IUserLibraryManager { + <> + +AddBook(Book book) : Task + +AddBook(string id) : Task + +AddBookByIsbn(string isbn) : Task + +RemoveBook(Book book) : Task + +RemoveBook(string id) : Task + +RemoveBook(string id) : Task + +AddToFavorites(Book book) : Task + +AddToFavorites(string bookId) : Task + +RemoveFromFavorites(Book book) : Task + +RemoveFromFavorites(string bookId) : Task + +UpdateBook(Book updatedBook) : Task + +AddContact(Contact contact) : Task + +RemoveContact(Contact contact) : Task + +LendBook(Book book, Contact contact, DateTime? loanDate) : Task + +GetBackBook(Book book, DateTime? returnedDate) : Task + +BorrowBook(Book book, Contact owner, DateTime? borrowedDate) : Task + +GiveBackBook(Book book, DateTime? returnedDate) : Task + + +GetCurrentLoans(int index, int count) + +GetPastLoans(int index, int count) + +GetCurrentBorrowings(int index, int count) + +GetPastBorrowings(int index, int count) + +GetContacts(int index, int count) +} + +class ILibraryManager { + <> + +GetBookById(string id) + +GetBookByIsbn(string isbn) + +GetBooksByTitle(string title, int index, int count, string sort) + +GetBooksByAuthorId(string authorId, int index, int count, string sort) + +GetBooksByAuthor(string author, int index, int count, string sort) + +GetAuthorById(string id) + +GetAuthorsByName(string substring, int index, int count, string sort) +} + +class Status { + <> +} + +IUserLibraryManager ..|> ILibraryManager +IUserLibraryManager ..> Status +IUserLibraryManager ..> Contact +IUserLibraryManager ..> Book +ILibraryManager ..> Book +ILibraryManager ..> Author +``` + +# TO BE CONTINUED + # TP1 : Pages & Views _à terminer pour le 17 septembre 2023 - 23h59_ @@ -71,6 +276,11 @@ Lorsqu'on clique sur un le filtre "Date de publication" de la page "Mes Livres", Un clic sur une de ces années permet d'aller sur la même page que celle qui affiche la liste des livres, mais seuls les livres publiée cette année apparaitront. +### Emprunts / Prêts +Lorsqu'on clique sur le menu "En prêt" sur la page d'accueil, on peut voir la liste de nos emprunts et de nos prêts répartis par contacts. Par exemple : + +Le switch permet de voir les livres qu'on a prêtés regroupés par contacts, ou les livres qu'on a empruntés regroupés par prêteurs. + ### Le fameux bouton "+" Un clic sur le bouton "+" fait apparaître un sous-menu permettant d'ajouter un livre à la bibliothèque : - en scannant un code-barres (cf. plus bas) diff --git a/Sources/BookApp/Pages/Filtrage.xaml b/Sources/BookApp/Pages/Filtrage.xaml index de42150..6ad91e7 100644 --- a/Sources/BookApp/Pages/Filtrage.xaml +++ b/Sources/BookApp/Pages/Filtrage.xaml @@ -4,6 +4,9 @@ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" xmlns:composants="clr-namespace:BookApp.Composants" + xmlns:vm="clr-namespace:BookApp.ViewModel" + xmlns:model="clr-namespace:Model;assembly=Model" + x:DataType="vm:TousViewModel" x:Class="BookApp.Pages.Filtrage"> @@ -64,7 +67,37 @@ - + + + + + + + + + + + + + + + +