import { NextResponse } from 'next/server'; import { getServerSession } from 'next-auth'; import { authOptions } from '@/app/api/auth/[...nextauth]/route'; import { getEmails } from '@/lib/services/email-service'; import { getCachedEmailList, cacheEmailList, invalidateFolderCache } from '@/lib/redis'; // Simple in-memory cache (will be removed in a future update) interface EmailCacheEntry { data: any; timestamp: number; } // Cache for 1 minute only const CACHE_TTL = 60 * 1000; const emailListCache: Record = {}; export async function GET(request: Request) { try { // Authenticate user const session = await getServerSession(authOptions); if (!session || !session.user?.id) { return NextResponse.json( { error: "Not authenticated" }, { status: 401 } ); } // Extract query parameters const { searchParams } = new URL(request.url); const page = parseInt(searchParams.get("page") || "1"); const perPage = parseInt(searchParams.get("perPage") || "20"); const folder = searchParams.get("folder") || "INBOX"; const searchQuery = searchParams.get("search") || ""; const accountId = searchParams.get("accountId") || ""; // Try to get from Redis cache first, but only if it's not a search query if (!searchQuery) { const cacheKey = accountId ? `${session.user.id}:${accountId}:${folder}` : `${session.user.id}:${folder}`; const cachedEmails = await getCachedEmailList(session.user.id, folder, page, perPage); if (cachedEmails) { console.log(`Using Redis cached emails for ${cacheKey}:${page}:${perPage}`); return NextResponse.json(cachedEmails); } } console.log(`Redis cache miss for ${session.user.id}:${folder}:${page}:${perPage}, fetching emails from IMAP`); // Use the email service to fetch emails, passing the accountId if provided const emailsResult = await getEmails( session.user.id, folder, page, perPage, searchQuery, accountId ); // The result is already cached in the getEmails function return NextResponse.json(emailsResult); } catch (error: any) { console.error("Error fetching emails:", error); return NextResponse.json( { error: "Failed to fetch emails", message: error.message }, { status: 500 } ); } } export async function POST(request: Request) { try { const session = await getServerSession(authOptions); if (!session?.user?.id) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } const { emailId, folderName } = await request.json(); if (!emailId) { return NextResponse.json({ error: 'Missing emailId parameter' }, { status: 400 }); } // Invalidate Redis cache for the folder if (folderName) { await invalidateFolderCache(session.user.id, folderName); } else { // If no folder specified, invalidate all folders (using a wildcard pattern) const folders = ['INBOX', 'Sent', 'Drafts', 'Trash', 'Junk']; for (const folder of folders) { await invalidateFolderCache(session.user.id, folder); } } return NextResponse.json({ success: true }); } catch (error) { console.error('Error in POST handler:', error); return NextResponse.json({ error: 'An unexpected error occurred' }, { status: 500 }); } }