feat(manga): implémenter la page Découvrir avec recommandations MangaDex
- Endpoint GET /api/manga-discover via DiscoverMangaStateProvider + DiscoverMangaHandler
- Algorithme : top 5 manga de la collection → appel /manga/{id}/recommendation
par source → agrégation avec système de votes (multi-sources = plus pertinent)
- Filtrage : tags exclus (Oneshot, Doujinshi, Self-Published), contentRating,
et suppression des manga déjà en bibliothèque
- Page Vue DiscoverPage.vue : chargement auto au montage, bouton Actualiser,
modal détail, ajout à la bibliothèque
- Adapteurs InMemory de test mis à jour (discover + getMangaRecommendations)
This commit is contained in:
parent
65453c87e5
commit
814fe46ce5
@@ -40,7 +40,12 @@ export const useMangaStore = defineStore('manga', {
|
||||
|
||||
// --- Add Manga State ---
|
||||
addingManga: false,
|
||||
addMangaError: null
|
||||
addMangaError: null,
|
||||
|
||||
// --- Discover State ---
|
||||
discoverResults: [],
|
||||
loadingDiscover: false,
|
||||
discoverError: null
|
||||
}),
|
||||
|
||||
getters: {
|
||||
@@ -170,6 +175,25 @@ export const useMangaStore = defineStore('manga', {
|
||||
this.loadingSearch = false;
|
||||
},
|
||||
|
||||
// --- Discover Actions ---
|
||||
async loadDiscoverRecommendations() {
|
||||
if (this.loadingDiscover) return;
|
||||
|
||||
this.loadingDiscover = true;
|
||||
this.discoverError = null;
|
||||
this.discoverResults = [];
|
||||
|
||||
try {
|
||||
const data = await mangaRepository.discoverManga();
|
||||
this.discoverResults = data.items || [];
|
||||
} catch (error) {
|
||||
this.discoverError = error.message;
|
||||
throw error;
|
||||
} finally {
|
||||
this.loadingDiscover = false;
|
||||
}
|
||||
},
|
||||
|
||||
// --- Add Manga Actions ---
|
||||
async createFromMangaDex(externalId) {
|
||||
if (this.addingManga) return;
|
||||
|
||||
Reference in New Issue
Block a user