BooqIn
Le site BooqIn
est un réseau social dédié aux livres.
Un des concepts centraux du site est celui des collections de livres. Les utilisateurs peuvent créer leurs propres collections de livres. Certaines collections sont automatiquement générées par le site.
Le site offre toutes les fonctionnalités d'un réseau social. Les utilisateurs peuvent commenter et voter sur les livres, les commentaires des autres, ainsi que sur les collections. Ils peuvent également suivre des collections, des livres et d'autres utilisateurs. Ils recevront des notifications en cas d'activité sur l'élément qu'ils suivent.
La fonctionnalité originale du site réside dans la possibilité pour les utilisateurs de se prêter des livres. Pour cela, les utilisateurs peuvent déclarer un certain nombre de livres comme prêtables. Le site propose un système de panier permettant de réserver les livres qu'un utilisateur souhaite emprunter. Une fois le panier validé, le site notifie les utilisateurs à qui l'on souhaite emprunter des livres, prépare une étiquette d'envoi à imprimer et permet de suivre le trajet du livre. Il envoie également des rappels à l'approche de la date limite du prêt.
Pour rendre le site vivant, il doit contenir une collection de livres. Vous devrez permettre une importation automatique de livres à partir d'API publiques (au moins deux) et offrir aux utilisateurs la possibilité d'ajouter des livres manuellement.
Vous devrez gérer l'API Google Books ainsi qu'une autre API publique de votre choix.
Pour simplifier la tâche, vous ne gérerez que des livres en langue anglaise et pourrez vous limiter aux auteurs mentionnés dans cette liste d'auteurs américains. Vous pouvez bien sûr aller au-delà de cette restriction, mais cela pourrait nécessiter des efforts supplémentaires. Vous pouvez supposer que tous les livres gérés ont un numéro ISBN.
Le site devra périodiquement (par exemple, tous les jours) enrichir la base de données des livres en interrogeant les API publiques. Votre code devra être conçu de manière à permettre facilement l'ajout d'une nouvelle API en complément des deux initiales.
Les utilisateurs peuvent créer des collections avec un titre et une description. Une collection peut être privée ou publique. Si elle est publique, elle peut être suivie par d'autres utilisateurs, qui peuvent y laisser des commentaires et voter pour elle. Les utilisateurs peuvent également supprimer une collection, enlever des livres ou en ajouter.
Le site propose aussi des collections intelligentes : l'utilisateur définit des critères pour les livres qui doivent apparaître dans la collection. Par exemple, un utilisateur peut demander une collection contenant les livres de Michael Connelly publiés il y a moins de 5 ans. Nous ne vous imposons pas de format ou de contraintes spécifiques : à vous de définir une solution adaptée.
Le site créera automatiquement un certain nombre de collections pour chaque utilisateur :
Le site maintiendra également des collections globales :
Chaque utilisateur possède une collection particulière appelée To Lend, qui regroupe les livres qu'il possède et qu'il accepte de prêter. Les livres de cette collection ont un statut indiquant leur disponibilité : prêtables, en cours d'expédition, prêtés, en cours de retour ou prêtés mais devant être rendus.
Les utilisateurs peuvent emprunter des livres. Pour ce faire, ils ont accès à un bouton Borrow sur la page de chaque livre. En cliquant dessus, le livre est ajouté au panier de l'utilisateur.
Il se peut qu'un utilisateur veuille emprunter un livre qui est indisponible sur votre site pour diverses raisons (disponible chez aucun utilisateur, tous déjà prêtés, ...). Dans ce cas, le bouton Borrow se doit d'être inaccessible et un nouveau bouton Notify devra apparaître. En cliquant dessus, l'utilisateur s'inscrit dans une file d'attente. Une fois ce livre de nouveau disponible, les utilisateurs de la file d'attente devront recevoir dans l'ordre une notification indiquant que le livre leur est réservé pour une durée d'une heure. Après cela, le livre sera réservé pour le suivant, etc... Si aucun ne répond dans le délai imparti, le livre sera disponible au prêt comme tout autre livre. Attention: Vous ne modifierez la file d'attente que lorsque qu'un utilisateur réserve le livre pour lequel il est en attente.
Un livre est prêté pour une durée de 4 semaines. Si l'utilisateur dépasse cette date, il reçoit une notification de rappel de la part du site.
L'utilisateur qui emprunte un livre possède une collection appelée Borrowed, qui regroupe les livres qu'il a empruntés.
C'est le site qui décide auprès de qui le livre sera emprunté. L'objectif de d'emprunter chez les utilisateurs qui empruntent le plus. Le but est de faire travailler en priorité les gens qui beneficient le plus du site. Idéalement, on voudrait que les prêtes autant de livres qu'ils en empruntent.
Lorsqu'un livre est ajouté au panier, le site garantit qu'il reste réservé pendant 20 minutes. Si l'utilisateur met plus de 20 minutes à valider son panier, il risque que toutes les copies disponibles du livre aient été prêtées.
Pour chaque livre, l'utilisateur empruntant les livres devra payer des frais de livraison. Une fois ces frais payés, l'utilisateur qui possède le livre est notifié et une étiquette pour l'envoi postal, avec l'adresse de l'emprunteur (en destinataire) et l'adresse du prêteur (en expéditeur), est générée. On partira du principe que si X livre(s) sont emprunté(s) au même utilisateur, les frais de livraison seront de X * le coût d'une livraison avec cependant une seule et même étiquette postale générée. Pour simplifier, on supposera que les frais de livraisons sont fixes à 6 euros pour un livre.
Pour s'acquitter des frais, vous devez fournir une interface de paiement à vos utilisateurs. Pour ce faire, vous utiliserez le magnifique outil qu'est Stripe. Stripe vous offre la possibilité d'effectuer des paiements tests en fournissant des numéros de cartes factices (dont certaines avec la fonctionnalité de "Secure3D"). Votre solution devra supporter au minimum les paiements par carte bancaire avec Secure3D. Dans un environnement optimal, toutes pages de paiements devraient utiliser https. Pour ce projet, vous n'utiliserez que http.
Le suivi de commande ne se fera pas de manière automatique mais de manière déclarative. Une fois l'utilisateur notifié, le statut du livre passe alors à en cours d'expédition Dès réception, l'autre utilisateur devra accuser réception du livre en changeant le statut du livre en prêté (après une semaine sans mise à jour de sa part, il sera notifié). Il en est de même pour les autres statuts décrits dans le premier paragraphe de la page "Prêt des livres".
Votre site acceptera trois types de visiteurs : les visiteurs non authentifiés, les visiteurs authentifiés et les administrateurs.
Les utilisateurs non authentifiés peuvent rechercher parmi les livres et les collections publiques. Ils peuvent consulter les votes (upvotes/downvotes) et les commentaires, mais ne peuvent pas interagir avec ces éléments.
Les utilisateurs authentifiés disposent de fonctionnalités supplémentaires :
Les administrateurs bénéficient de toutes les fonctionnalités des utilisateurs authentifiés et disposent de privilèges supplémentaires, notamment :
Votre site devra utiliser les technologies suivantes:
Spring
avec les modules Spring Data
et Spring Security
;Spring MVC
avec Thymeleaf
ou un autre moteur de templates. Ce client devra être entèrement fonctionnel mais certaines feature avancées comme les notifications peuvent ne pas être présentes. Spring Boot
pour la configuration de Spring
;Hibernate
comme ORM;H2
pour la base de donnée.Votre projet doit utiliser Maven
comme outil de build.
Vous collaborerez sur votre projet en utilisant Git
. Une fois votre groupe crée, vous créerez un projet sur GitLab.
Votre activité sur GitLab sera prise en compte dans votre note finale.
Spring Boot quand il est utilisé avec Spring Data et Hibernate met en place un pattern assez douteux : il crée une Session hibernate lors de chaque appel à une méthode du controleur. Comme cela est très bien expliqué dans cet article, cette approche peut entrainer des problèmes de performances.
Dans votre projet, vous devez désactiver ce pattern en mettant dans votre fichier application.properties:
spring.jpa.open-in-view=false
Votre site devra:
Vous serez évalué en partie sur la capacité de votre site à être utilisé par un très grand nombre d'utilisateurs sur une énorme base questions. Bien entendu, le choix de H2 comme base de données n'a aucun sens dans ce contexte mais c'est un compromis pour l'exercice.
Vous serez aussi évalué sur la qualité de votre architecture logicelle.
L'évaluation prendra en compte votre contribution individuelle au projet comme elle sera reflétée par votre activité sur le Git du projet.
Vous devez créer un groupe de 5 personnes (sauf dérogation négociée avec les enseignants). Dans votre groupe, vous désignerez un chef de projet qui servira d'intermédiaire avec les enseignants.
Le chef de projet est de créer le gitlab. Le nom doit être [BooqIn] NOM où NOM est le nom de famille du chef de projet Dans le README du projet, vous mettrez les noms et prénoms et les emails des membres du groupe. Ensuite, il invitera les membres du projet et les deux enseignants comme Maintener du projet: @acarayol et @Youssefooooo.
Le chef de projet doit aussi envoyer un mail aux deux enseignants avec la composition du groupe avant le 10 décembre 2024 à minuit.
Le projet doit contenir un README qui commence par la liste des membres du projet avec leurs adresses email en commençant par le responsable du projet. Le fichier README doit donner les instructions à suivre pour lancer le projet après avoir cloné le projet depuis GitLab.
Le projet doit contenir des données et fonctionner avec un base de données H2 tournant localement.
Pour le rendu, le projet doit être finalisé sur GitLab et déposé sur e-learning. Le chef de projet devra:
Après le dépot de votre projet, vous recevrez une liste de questions auxquelles vous devrez répondre dans un rapport. Vous ne pourrez plus modifier votre projet. Le rapport comptera dans l'évaluation.
Les dates limites sont fermes: ne rien avoir déposé à cette date ou ne pas être présent à la soutenance entraine automatiquement 0 au projet. Conformément aux modalités de contrôle des connaissances du master, la note de projet n'est pas compensable en deuxième session.