// Estante 3D: las obras de un usuario que pueden ir en el mueble. Los tomos de cada una se piden aparte (/api/volumes), porque pueden tardar. import { hasNoVolumes } from './volumes.js' export function setupShelf({ db, json, isBookId, downloadCover, MY_DOWNLOADS }) { function works(userId) { const out = new Map() const add = (id, fields) => { const w = out.get(id) || { id, title: '', cover: null, last: 0, chapterId: null, chapterNum: null, page: 0, lang: null } w.title ||= fields.title || '' w.cover ||= fields.cover || null w.last = Math.max(w.last, fields.at || 0) if (fields.chapterId) Object.assign(w, { chapterId: fields.chapterId, chapterNum: fields.chapterNum ?? null, page: fields.page || 0, lang: fields.lang || null }) out.set(id, w) } for (const r of db.prepare('SELECT manga_id, manga_title, cover, chapter_id, chapter_num, page, lang, updated_at FROM progress WHERE user_id = ?').all(userId)) { add(r.manga_id, { title: r.manga_title, cover: r.cover, chapterId: r.chapter_id, chapterNum: r.chapter_num, page: r.page, lang: r.lang, at: r.updated_at }) } for (const r of db.prepare('SELECT manga_id, title, cover, last_new_at, created_at FROM follows WHERE user_id = ? AND active = 1').all(userId)) { add(r.manga_id, { title: r.title, cover: r.cover, at: r.last_new_at || r.created_at }) } for (const r of db.prepare(`SELECT manga_id, title, folder, updated_at, json_extract(meta, '$.manga.cover') meta_cover FROM downloads WHERE ${MY_DOWNLOADS}`).all(userId)) { add(r.manga_id, { title: r.title, cover: downloadCover(r.manga_id, r.folder, r.meta_cover), at: r.updated_at }) } for (const r of db.prepare('SELECT i.manga_id, i.title, i.cover, i.added_at FROM list_items i JOIN lists l ON l.id = i.list_id WHERE l.user_id = ?').all(userId)) { add(r.manga_id, { title: r.title, cover: r.cover, at: r.added_at }) } const typeOf = db.prepare('SELECT type FROM manga_meta WHERE manga_id = ?') return [...out.values()].filter(w => !isBookId(w.id) && !hasNoVolumes(typeOf.get(w.id)?.type)).sort((a, b) => b.last - a.last) } function route(p, method, res, user) { if (p !== '/api/shelf' || method !== 'GET') return false json(res, 200, { works: works(user.id) }) return true } return { route, works } }