diff --git a/src/lib/api.ts b/src/lib/api.ts index 3d02a1c..95c42c4 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -1,4 +1,5 @@ import type { Comic, Genre, ComicType } from './types'; +import { getRedisClient } from './db'; const languageMap = { "en": "English", @@ -256,9 +257,27 @@ export async function getChaptersForSlugs( ): Promise { console.log(`Fetching chapters for slugs:`, slugs, `in language: ${lang}`); const chapters: ChapterDetail[] = []; + const redis = await getRedisClient(); + // Cache results for 1 hour (3600 seconds) + const CACHE_TTL = 60 * 60; + for (const slug of slugs) { console.log(`Processing slug: ${slug}`); + const cacheKey = `chapters:${slug}:${lang}`; + + try { + // Try to get cached chapters + const cachedChapters = await redis.get(cacheKey); + if (cachedChapters) { + console.log(`Using cached chapters for ${slug}`); + chapters.push(...JSON.parse(cachedChapters)); + continue; + } + } catch (error) { + console.error('Redis cache read error:', error); + } + const comicDetail = await getComicBySlug(slug); if (!comicDetail) { @@ -284,6 +303,19 @@ export async function getChaptersForSlugs( if (comicChapters.length > 0) { chapters.push(...comicChapters); + + // Cache the results + try { + await redis.set( + cacheKey, + JSON.stringify(comicChapters), + 'EX', + CACHE_TTL + ); + console.log(`Cached chapters for ${slug}`); + } catch (error) { + console.error('Redis cache write error:', error); + } } } diff --git a/src/lib/db.ts b/src/lib/db.ts index ffcc509..8382c7e 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -5,6 +5,7 @@ const REDIS_URL = import.meta.env.REDIS_URL || process.env.REDIS_URL; let redis: Redis | null = null; let redisRetryCount = 0; const MAX_RETRIES = 3; +const DEFAULT_CACHE_TTL = 60 * 60 * 24 * 30; // 30 days try { console.log('Environment check:', { @@ -60,7 +61,7 @@ try { } } -async function getRedisClient(): Promise { +export async function getRedisClient(): Promise { if (redis?.status === 'ready') return redis; if (redisRetryCount >= MAX_RETRIES) { @@ -109,7 +110,7 @@ export async function storeFeedMapping(feedId: string, slugs: string[], lang: st feedId, JSON.stringify(mapping), 'EX', - 60 * 60 * 24 * 30 // 30 days in seconds + DEFAULT_CACHE_TTL // Use the constant here ); } catch (error) { console.error('Error storing feed mapping:', error);