import { json } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; import { listBooks, recentlyAddedBooks, allProgress, getHomeStats } from '$lib/server/pocketbase'; import { log } from '$lib/server/logger'; import type { Book, Progress } from '$lib/server/pocketbase'; /** * GET /api/home * Returns home screen data: continue-reading list, recently updated books, and stats. * Requires authentication (enforced by layout guard). */ export const GET: RequestHandler = async ({ locals }) => { let allBooks: Book[] = []; let recentBooks: Book[] = []; let progressList: Progress[] = []; let stats = { totalBooks: 0, totalChapters: 0 }; try { [allBooks, recentBooks, progressList, stats] = await Promise.all([ listBooks(), recentlyAddedBooks(8), allProgress(locals.sessionId, locals.user?.id), getHomeStats() ]); } catch (e) { log.error('api/home', 'failed to load home data', { err: String(e) }); } const bookMap = new Map(allBooks.map((b) => [b.slug, b])); const continueReading = progressList .filter((p) => bookMap.has(p.slug)) .slice(0, 6) .map((p) => ({ book: bookMap.get(p.slug)!, chapter: p.chapter })); const inProgressSlugs = new Set(continueReading.map((c) => c.book.slug)); const recentlyUpdated = recentBooks.filter((b) => !inProgressSlugs.has(b.slug)).slice(0, 6); return json({ continue_reading: continueReading, recently_updated: recentlyUpdated, stats: { totalBooks: stats.totalBooks, totalChapters: stats.totalChapters, booksInProgress: continueReading.length } }); };