Acter le statut de lecture par utilisateur et la table Auteur
Le statut de lecture sort de `Livre` vers une table par utilisateur : le livre reste commun au foyer, sa lecture devient personnelle. La decision « collection commune » n'est pas remise en cause. L'auteur passe d'un champ texte libre a une table dediee avec forme normalisee, prerequis du regroupement par auteur et de la recherche insensible aux accents. Le regroupement automatique est limite aux variantes sures ; les rapprochements ambigus doivent etre proposes, pas appliques silencieusement — une fusion erronee se defait mal. IDEES.md : la liste d'envies sera personnelle elle aussi, et exportable. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -31,6 +31,8 @@ Application self-hosted de gestion de bibliothèque personnelle, à héberger su
|
|||||||
| Base de données | SQLite + Entity Framework Core | Fichier unique, pas de serveur DB séparé, adapté à un usage perso/familial |
|
| Base de données | SQLite + Entity Framework Core | Fichier unique, pas de serveur DB séparé, adapté à un usage perso/familial |
|
||||||
| Auth / multi-utilisateur | SSO YunoHost via **en-têtes SSOwat** (`YNH_USER`) | Pas de login custom. OIDC **écarté** : non documenté par YunoHost (vérifié le 2026-08-17). Voir « Intégration SSO » |
|
| Auth / multi-utilisateur | SSO YunoHost via **en-têtes SSOwat** (`YNH_USER`) | Pas de login custom. OIDC **écarté** : non documenté par YunoHost (vérifié le 2026-08-17). Voir « Intégration SSO » |
|
||||||
| Portée des données | **Collection commune** à tous les utilisateurs, avec traçabilité de qui a ajouté chaque livre | Usage familial : une bibliothèque de foyer, pas des collections étanches. Laisse la possibilité de cloisonner plus tard sans migration lourde |
|
| Portée des données | **Collection commune** à tous les utilisateurs, avec traçabilité de qui a ajouté chaque livre | Usage familial : une bibliothèque de foyer, pas des collections étanches. Laisse la possibilité de cloisonner plus tard sans migration lourde |
|
||||||
|
| Statut de lecture | **Par utilisateur**, pas commun (décidé le 2026-08-17, après la phase 3) | Le livre est commun, sa lecture est personnelle : deux membres du foyer lisent le même exemplaire à des rythmes différents. Sort `Statut` de `Livre` vers une table dédiée |
|
||||||
|
| Auteurs | **Table dédiée** avec nom normalisé, remplaçant le champ texte libre | Nécessaire au regroupement par auteur et à la recherche insensible aux accents. Regroupement **automatique seulement quand c'est sûr**, sinon proposé à l'utilisateur |
|
||||||
| Ebooks | **Fiches uniquement**, pas de stockage de fichiers | Inventaire, pas hébergement. Évite l'espace disque YunoHost, les sauvegardes lourdes, et garde le cache hors-ligne léger |
|
| Ebooks | **Fiches uniquement**, pas de stockage de fichiers | Inventaire, pas hébergement. Évite l'espace disque YunoHost, les sauvegardes lourdes, et garde le cache hors-ligne léger |
|
||||||
| Architecture serveur | **x86_64** → publish `linux-x64` | Serveur PC/VPS confirmé par l'utilisateur |
|
| Architecture serveur | **x86_64** → publish `linux-x64` | Serveur PC/VPS confirmé par l'utilisateur |
|
||||||
| Production des binaires | **Compilation locale + release manuelle**, via un script réutilisable en CI plus tard | Ne pas se bloquer sur l'outillage ; Gitea Actions nécessiterait un runner, non vérifié |
|
| Production des binaires | **Compilation locale + release manuelle**, via un script réutilisable en CI plus tard | Ne pas se bloquer sur l'outillage ; Gitea Actions nécessiterait un runner, non vérifié |
|
||||||
@@ -275,6 +277,10 @@ Garder `Pret` comme table séparée (pas un champ sur `Livre`) pour conserver l'
|
|||||||
|
|
||||||
**`AjoutePar` est une information, pas une frontière.** La bibliothèque est commune : ne **jamais** filtrer les requêtes de lecture sur ce champ. Il sert à savoir qui a saisi le livre (et implicitement à qui il appartient), pas à restreindre l'accès. Ce choix permet de basculer plus tard vers des bibliothèques cloisonnées sans migration de schéma.
|
**`AjoutePar` est une information, pas une frontière.** La bibliothèque est commune : ne **jamais** filtrer les requêtes de lecture sur ce champ. Il sert à savoir qui a saisi le livre (et implicitement à qui il appartient), pas à restreindre l'accès. Ce choix permet de basculer plus tard vers des bibliothèques cloisonnées sans migration de schéma.
|
||||||
|
|
||||||
|
**Le statut de lecture n'appartient plus à `Livre`.** Il vit dans une table par utilisateur (`LivreId` + `YNH_USER` + statut, unicité sur le couple). Un livre sans ligne pour l'utilisateur courant est simplement « non commencé ». Ne jamais réintroduire de colonne `Statut` sur `Livre` : elle redeviendrait commune à tout le foyer.
|
||||||
|
|
||||||
|
**L'auteur n'est plus un champ texte sur `Livre`.** Une table dédiée porte le nom d'affichage et une forme normalisée servant au regroupement et à la recherche. Le regroupement automatique ne s'applique qu'aux variantes **sûres** (casse, accents, initiales, ordre nom/prénom) ; les rapprochements ambigus — « Hamilton » seul vers « Peter F. Hamilton » — doivent être **proposés**, jamais appliqués silencieusement : une fusion erronée est difficile à défaire.
|
||||||
|
|
||||||
**Les prêts ne concernent en pratique que les livres physiques** — les ebooks étant de simples fiches, il n'y a pas d'objet à prêter. `Emprunteur` reste un **texte libre**, sans lien avec les comptes YunoHost : on suit les prêts à des personnes extérieures au foyer, pas les échanges entre utilisateurs de l'app.
|
**Les prêts ne concernent en pratique que les livres physiques** — les ebooks étant de simples fiches, il n'y a pas d'objet à prêter. `Emprunteur` reste un **texte libre**, sans lien avec les comptes YunoHost : on suit les prêts à des personnes extérieures au foyer, pas les échanges entre utilisateurs de l'app.
|
||||||
|
|
||||||
## Historique du projet (pourquoi ces choix)
|
## Historique du projet (pourquoi ces choix)
|
||||||
|
|||||||
@@ -67,6 +67,10 @@ Correction envisagée : une fois `dc:creator` nettoyé, si le titre **se termine
|
|||||||
|
|
||||||
Idée de fonctionnalité, **hors périmètre v1**, à ne pas implémenter sans décision explicite.
|
Idée de fonctionnalité, **hors périmètre v1**, à ne pas implémenter sans décision explicite.
|
||||||
|
|
||||||
|
**La liste d'envies est personnelle**, pas commune : chacun la sienne, comme le statut de lecture. C'est le pendant naturel de la décision actée sur les statuts.
|
||||||
|
|
||||||
|
**Export de la liste d'envies** souhaité — pour l'emporter en librairie ou la partager avant un anniversaire. Format à choisir le moment venu ; du texte simple ou du CSV suffira probablement, et reste lisible partout sans dépendance.
|
||||||
|
|
||||||
Pouvoir suivre les livres qu'on aimerait acquérir. Le déclencheur serait le regroupement par auteur : en cliquant sur un auteur déjà présent dans la bibliothèque (exemple donné : Bernard Werber), afficher **sa bibliographie complète**, avec les ouvrages déjà possédés grisés — et la possibilité de marquer les autres comme souhaités.
|
Pouvoir suivre les livres qu'on aimerait acquérir. Le déclencheur serait le regroupement par auteur : en cliquant sur un auteur déjà présent dans la bibliothèque (exemple donné : Bernard Werber), afficher **sa bibliographie complète**, avec les ouvrages déjà possédés grisés — et la possibilité de marquer les autres comme souhaités.
|
||||||
|
|
||||||
Ce que ça impliquerait, à évaluer le moment venu :
|
Ce que ça impliquerait, à évaluer le moment venu :
|
||||||
|
|||||||
Reference in New Issue
Block a user