Tags give the ability to mark specific points in history as being important
-
1.21.0
1ea7edae · ·1.21.0 - Tri des challenges par date de création (plus récents d'abord) dans l'administration
-
1.20.3
9bf8e988 · ·Version 1.20.3 - Correction : certaines recherches de livres renvoyaient une erreur 500 (NonUniqueResultException) quand un auteur, éditeur, sujet, type ou tag existait en double. Les recherches par nom tolèrent désormais les doublons.
-
1.20.2
46f5ec7c · ·Version 1.20.2 - Mises à jour de dépendances : Spring Boot 3.5.16, Jackson datatype JSR-310 2.22.0
-
1.20.1
4ff6a714 · ·Version 1.20.1 - Correction : le nombre d'objectifs atteints par participant s'affiche désormais correctement dans la liste des participants d'un challenge (il restait bloqué à 0/X)
-
1.20.0
0cd9fd8c · ·Version 1.20.0 - Pagination de la recherche de livres distante (paramètre page transmis à ISBNDB) - Tolérance aux doublons d'ISBN : évite une erreur possible lors de l'ajout d'un livre - Administration : nombre de challenges et indicateur de connexion Google par utilisateur ; e-mail retiré de la réponse de la liste des utilisateurs
-
1.19.0
26eca9b1 · ·Version 1.19.0 - Stat "livre le plus ajoute" calculee par titre normalise : les editions d'un meme livre (ISBN/book_id differents) sont regroupees, le compteur somme toutes les editions, et la stat expose mostAddedBookIds pour la modale des contributeurs toutes editions confondues (backlog#142)
-
1.18.0
8db0a6a3 · ·Version 1.18.0 - Persistance de la cle de signature JWT sur disque + expiration des tokens a 30 jours, alignee sur 03:00 Europe/Paris (fini les deconnexions au redemarrage de l'API) - Nouvel endpoint d'agregat /groups/{id}/books (popularite + tagIds par groupe, paginable) - Montee Spring Boot 3.5.14 et image eclipse-temurin -
1.17.0
4a631157 · ·- Ordonne les utilisateurs par date de création dans l'administration - Permet aux admins de créer/modifier les objectifs d'un challenge qui n'est pas le leur
-
1.16.0
6ddd322b · ·1.16.0 - Administration : nouveaux compteurs sur les onglets, filtre des challenges par visibilite (Public/Prive), et affichage du nombre de notifications actives par utilisateur. Securisation interne de la migration de cascade sur les groupes (sans impact utilisateur).
-
1.15.0
e72c94ca · ·1.15.0 - Nouvel endpoint DELETE /challenges/{id} qui permet a un createur de supprimer son challenge lorsqu'il n'a aucun participant. -
1.14.0
7e21f89e · ·1.14.0 - Nouvel endpoint PATCH /users/me/display-name pour qu'un utilisateur puisse modifier son nom (validation : non vide, max 50, unicité)
-
1.13.0
8ec0073a · ·1.13.0 - Les administrateurs peuvent modifier (et supprimer) n'importe quel challenge, pas uniquement ceux qu'ils ont créés - Nouvel endpoint admin PATCH /admin/challenges/{id}/creator pour réattribuer un challenge à un autre utilisateur - L'endpoint admin /admin/users supporte désormais un paramètre de recherche q (sur nom affiché et e-mail) -
1.12.0
f26c54d9 · ·Connexion via Google côté API Nouvel endpoint public POST /api/v1/authentication/google qui valide un ID Token Google (signature JWKS, audience, issuer, expiration, email_verified) et émet le JwtAuthenticationResponse habituel. AppUser porte désormais un champ google_sub (unique, nullable) et son password est nullable. signInWithGoogle : - retrouve l'utilisateur via google_sub (login direct), ou - lie silencieusement un compte mot-de-passe existant partageant le même email, ou - crée un nouveau compte (displayName Google suffixé si déjà pris). Refus du login mot-de-passe sur les comptes Google seuls (password null) avec message clair. Migration Flyway V36 : ajout de google_sub + DROP NOT NULL sur password (idempotente). Pré-requis déploiement : la variable d'environnement GOOGLE_OAUTH_CLIENT_ID doit être positionnée côté serveur prod (client ID obtenu depuis Google Cloud Console).
-
1.11.2
19876cdd · ·Éviter les doublons d'auteurs créés par variation de casse ISBNdb renvoie occasionnellement le même nom d'auteur dans une casse différente d'une saisie à l'autre (ex : "Xinran" puis "XINRAN" pour Funérailles célestes). Auparavant, cela créait deux entrées d'auteur distinctes en base, faussant les stats par auteur. La recherche d'auteur par nom est désormais insensible à la casse — les nouvelles saisies pointent toujours vers l'auteur existant peu importe la casse retournée par ISBNdb. Les doublons existants doivent être fusionnés manuellement en SQL (l'API n'en crée plus de nouveaux).
-
1.11.1
295b67d1 · ·Fix année de première publication quand OpenLibrary renvoie l'année d'édition OpenLibrary peut renvoyer l'année de l'édition au lieu de l'année de l'œuvre dans `first_publish_year`. Cas signalé en prod : "Un coeur faible" de Dostoïevski (ISBN 9782742727698) marquait 2000 (édition Actes Sud) au lieu de 1848 (œuvre). L'enrichissement consulte désormais OpenLibrary ET Wikidata, et garde l'année la plus ancienne — la date de première publication est toujours antérieure ou égale à toute date d'édition. Une fois déployé, reset puis backfill pour rejouer l'enrichissement sur les livres affectés : `UPDATE book SET first_publication_year_enriched_at = NULL, first_publication_year = 0;` puis `POST /api/v1/internal/{secret}/books/backfill-first-publication-year`. -
1.11.0
0bed7b64 · ·Stats : drill-down, filtre par groupe, année d'œuvre, contraste carte - Endpoints "livres pour cette stat" sur les 3 surfaces (challenge, participant, user) : `GET /challenges/{id}/stats/books`, `/participants/{id}/library-stats/books`, `/users/{id}/stats/books`, avec params `countryIso`, `country`, `gender`, `year`, `publisher`. Côté challenge et participant, `groupId` restreint d'abord aux participations du groupe. - Filtre `groupId` étendu à l'endpoint `GET /participants/{id}/library-stats` (déjà présent sur challenge stats). - Stat "par année" et drill-down utilisent désormais `firstPublicationYear` quand renseigné (fallback `publicationYear`). Nouveau champ `Book.firstPublicationYear` + colonne `first_publication_year_enriched_at` (migration V34). `BookEnrichmentService` enrichit ce champ depuis OpenLibrary (search.json?isbn=...) avec fallback Wikidata par titre+auteur (P31 ∈ œuvre écrite, P577 date de publication) quand l'ISBN d'édition française n'est pas dans OL. Déclenché async au save d'un livre. - Endpoint backfill `POST /api/v1/internal/{secret}/books/backfill-first-publication-year` (rejoue tous les livres avec `first_publication_year_enriched_at IS NULL`). Une fois déployé, reset puis backfill : `UPDATE book SET first_publication_year_enriched_at = NULL, first_publication_year = 0;` puis `POST /api/v1/internal/{secret}/books/backfill-first-publication-year`. -
1.10.0
90532571 · ·Élargir WRITER_OCCUPATIONS aux mangakas et auteurs de BD Le filtre humain+écrivain de l'enrichissement automatique acceptait uniquement les occupations Wikidata "littéraires occidentales" (writer, novelist, poet, screenwriter, etc.) et rejetait les mangakas, scénaristes de BD, créateurs de BD et illustrateurs alors que leurs livres sont présents dans Boogoal. 10 occupations ajoutées : biographer, non-fiction writer, short story writer, mangaka, comics creator, comics artist, comics writer, manga writer, graphic novelist, penciller, illustrator. Devrait débloquer Waka Hirako, Q Hayashida, Jade Khoo, Jérôme Hamon et tous les auteurs similaires. Une fois déployé, relancer le backfill avec `UPDATE author SET nationality_enriched_at = NULL WHERE (nationality IS NULL OR nationality = '');` puis l'endpoint de backfill.
-
1.9.0
92117089 · ·Robustesse enrichissement et nat/genre dans l'admin - Plus de marquage `nationality_enriched_at` quand l'enrichissement échoue sur erreur transitoire (5xx, ResourceAccessException, 429) ET qu'aucune donnée n'a été récupérée. L'auteur reste à NULL et sera retenté par le prochain backfill au lieu d'être condamné définitivement par une panne ponctuelle d'OpenLibrary ou Wikidata. - Quand OpenLibrary plante (search ou détail), on bascule directement sur la recherche Wikidata avec les variants de nom au lieu de remonter l'exception et d'abandonner. - `searchOpenLibraryAuthor` préfère désormais un résultat dont le `name` matche exactement la requête (insensible casse/accents, via `normalizeForMatch`). Évite les homonymes type "Frank Herbert" → "Frank Herbert Hayward". - AdminBookView expose maintenant `authorNationality` et `authorGender` du 1er auteur, pour que l'admin voie d'un coup d'œil quels auteurs sont enrichis.
-
1.8.0
be132ca3 · ·Stats statuts de livre et fix recherche Wikidata - Nouveau champ `statusDistribution` (List<StatusCount>) sur les endpoints `GET /api/v1/challenges/{id}/stats` et `GET /api/v1/participants/{id}/library-stats`. Agrège les participations par statut (ADDED, STARTED, FINISHED, DNF) dans cet ordre fixe, avec une valeur à 0 pour les statuts non présents (front peut afficher une barre stable). - Méthode partagée `BookDistributionService.computeStatusDistribution` (mêmes patterns que les autres distributions). Les participations sans statut ou avec un statut inconnu retombent sur ADDED. - `AuthorEnrichmentService.lookupWikidataId` essaie maintenant le nom original puis le nom avec les mots inversés sur la recherche Wikidata directe. Récupère les cas où le nom est mal saisi (ordre inversé, asiatique nom-prénom, etc.) qui restaient introuvables sur Wikidata. L'endpoint `/debug-enrichment` indique la variante utilisée quand la 2e tentative match. Pour récupérer les auteurs sans nationalité (62% du parc, dont une partie due au souci d'ordre des mots), relancer le backfill après déploiement : reset `nationality_enriched_at = NULL` pour les auteurs sans nationalité puis appeler `POST /api/v1/internal/{secret}/authors/backfill-nationality`. -
1.7.0
7d0a20b9 · ·Administration et fix du compteur last_login_at - Nouveaux endpoints /api/v1/admin/{users,challenges,books} paginés, protégés par hasRole(ADMIN) : - GET /api/v1/admin/users — liste paginée des utilisateurs avec id, displayName, username, avatarUrl, createdAt, lastLoginAt - GET /api/v1/admin/challenges — liste paginée des challenges avec id, title, bannerUrl, creatorDisplayName, isPublic - GET /api/v1/admin/books — liste paginée des livres avec recherche cross-table (titre, nom d'auteur, ISBN) - Nouveaux champs sur AppUser : is_admin (booléen, défaut false), created_at (renseigné à l'inscription), last_login_at (mis à jour à chaque connexion). Le champ is_admin est exposé dans GET /users/me. - Migration V33 promeut l'admin initial. - Propagation correcte de la variable d'env BACKFILL_NATIONALITY_SECRET au container API (suite de !127).