121 lines
3.6 KiB
TypeScript
121 lines
3.6 KiB
TypeScript
import {FastifyReply, FastifyRequest} from 'fastify';
|
|
import * as booksService from './books.service';
|
|
import {getExtension} from '../../shared/extensions';
|
|
import {BookRequest, ChapterRequest, SearchRequest} from '../types';
|
|
|
|
export async function getBook(req: any, reply: FastifyReply) {
|
|
try {
|
|
const { id } = req.params;
|
|
const source = req.query.source;
|
|
|
|
let book;
|
|
if (source === 'anilist') {
|
|
book = await booksService.getBookById(id);
|
|
} else {
|
|
const ext = getExtension(source);
|
|
const result = await booksService.getBookInfoExtension(ext, id);
|
|
book = result || null;
|
|
}
|
|
|
|
return book;
|
|
} catch (err) {
|
|
return { error: (err as Error).message };
|
|
}
|
|
}
|
|
|
|
|
|
export async function getTrending(req: FastifyRequest, reply: FastifyReply) {
|
|
try {
|
|
const results = await booksService.getTrendingBooks();
|
|
return { results };
|
|
} catch (err) {
|
|
return { results: [] };
|
|
}
|
|
}
|
|
|
|
export async function getPopular(req: FastifyRequest, reply: FastifyReply) {
|
|
try {
|
|
const results = await booksService.getPopularBooks();
|
|
return { results };
|
|
} catch (err) {
|
|
return { results: [] };
|
|
}
|
|
}
|
|
|
|
export async function searchBooks(req: SearchRequest, reply: FastifyReply) {
|
|
try {
|
|
const query = req.query.q;
|
|
|
|
const dbResults = await booksService.searchBooksLocal(query);
|
|
if (dbResults.length > 0) {
|
|
return { results: dbResults };
|
|
}
|
|
|
|
console.log(`[Books] Local DB miss for "${query}", fetching live...`);
|
|
const anilistResults = await booksService.searchBooksAniList(query);
|
|
if (anilistResults.length > 0) {
|
|
return { results: anilistResults };
|
|
}
|
|
|
|
return { results: [] };
|
|
|
|
} catch (e) {
|
|
const error = e as Error;
|
|
console.error("Search Error:", error.message);
|
|
return { results: [] };
|
|
}
|
|
}
|
|
|
|
export async function searchBooksInExtension(req: any, reply: FastifyReply) {
|
|
try {
|
|
const extensionName = req.params.extension;
|
|
const query = req.query.q;
|
|
|
|
const ext = getExtension(extensionName);
|
|
if (!ext) return { results: [] };
|
|
|
|
const results = await booksService.searchBooksInExtension(ext, extensionName, query);
|
|
return { results };
|
|
} catch (e) {
|
|
const error = e as Error;
|
|
console.error("Search Error:", error.message);
|
|
return { results: [] };
|
|
}
|
|
}
|
|
|
|
export async function getChapters(req: any, reply: FastifyReply) {
|
|
try {
|
|
const { id } = req.params;
|
|
const source = req.query.source || 'anilist';
|
|
const provider = req.query.provider;
|
|
const extensionBookId = req.query.extensionBookId;
|
|
|
|
const isExternal = source !== 'anilist';
|
|
return await booksService.getChaptersForBook(id, isExternal, provider, extensionBookId);
|
|
} catch (err) {
|
|
console.error(err);
|
|
return { chapters: [] };
|
|
}
|
|
}
|
|
|
|
export async function getChapterContent(req: any, reply: FastifyReply) {
|
|
try {
|
|
const { bookId, chapter, provider } = req.params;
|
|
const source = req.query.source || 'anilist';
|
|
const lang = req.query.lang || 'none';
|
|
|
|
const content = await booksService.getChapterContent(
|
|
bookId,
|
|
chapter,
|
|
provider,
|
|
source,
|
|
lang
|
|
);
|
|
|
|
return reply.send(content);
|
|
} catch (err) {
|
|
console.error("getChapterContent error:", (err as Error).message);
|
|
return reply.code(500).send({ error: "Error loading chapter" });
|
|
}
|
|
}
|