diff --git a/app/api/courrier/[id]/mark-read/route.ts b/app/api/courrier/[id]/mark-read/route.ts index 7cea058d..7ca438c5 100644 --- a/app/api/courrier/[id]/mark-read/route.ts +++ b/app/api/courrier/[id]/mark-read/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server'; import { getServerSession } from 'next-auth'; -import { authOptions } from '@/app/api/auth/[...nextauth]/route'; +import { authOptions } from '@/lib/auth'; import { markEmailReadStatus } from '@/lib/services/email-service'; // Global cache reference (will be moved to a proper cache solution in the future) @@ -33,59 +33,37 @@ export async function POST( { params }: { params: { id: string } } ) { try { - // Get session const session = await getServerSession(authOptions); if (!session?.user?.id) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } - // No need to await Promise.resolve(), params is already an object const { id: emailId } = params; if (!emailId) { return NextResponse.json({ error: 'Email ID is required' }, { status: 400 }); } - try { - // Use the email service to mark the email as read - // First try with INBOX folder - let success = await markEmailReadStatus(session.user.id, emailId, true, 'INBOX'); - - // If not found in INBOX, try to find it in other common folders - if (!success) { - const commonFolders = ['Sent', 'Drafts', 'Trash', 'Spam', 'Junk']; - - for (const folder of commonFolders) { - success = await markEmailReadStatus(session.user.id, emailId, true, folder); - if (success) { - // If found in a different folder, invalidate that folder's cache - invalidateCache(session.user.id, folder); - break; - } - } - } else { - // Email found in INBOX, invalidate INBOX cache - invalidateCache(session.user.id, 'INBOX'); - } - - if (!success) { - return NextResponse.json( - { error: 'Email not found in any folder' }, - { status: 404 } - ); - } + const { folder = 'INBOX', accountId } = await request.json(); - return NextResponse.json({ success: true }); - } catch (error) { - console.error('Error marking email as read:', error); + const success = await markEmailReadStatus( + session.user.id, + emailId, + true, + folder + ); + + if (!success) { return NextResponse.json( { error: 'Failed to mark email as read' }, { status: 500 } ); } + + return NextResponse.json({ success: true }); } catch (error) { console.error('Error marking email as read:', error); return NextResponse.json( - { error: 'Failed to mark email as read' }, + { error: 'Internal server error' }, { status: 500 } ); } diff --git a/lib/services/email-service.ts b/lib/services/email-service.ts index 7a3a742f..1dc739d1 100644 --- a/lib/services/email-service.ts +++ b/lib/services/email-service.ts @@ -41,10 +41,17 @@ setInterval(() => { Object.entries(connectionPool).forEach(([key, { client, lastUsed }]) => { if (now - lastUsed > CONNECTION_TIMEOUT) { console.log(`Closing idle IMAP connection for ${key}`); - client.logout().catch(err => { - console.error(`Error closing connection for ${key}:`, err); - }); - delete connectionPool[key]; + try { + if (client.usable) { + client.logout().catch(err => { + console.error(`Error closing connection for ${key}:`, err); + }); + } + } catch (error) { + console.error(`Error checking connection status for ${key}:`, error); + } finally { + delete connectionPool[key]; + } } }); }, 60 * 1000); // Check every minute