diff --git a/app/api/courrier/route.ts b/app/api/courrier/route.ts index 5ae450fb..a844120b 100644 --- a/app/api/courrier/route.ts +++ b/app/api/courrier/route.ts @@ -4,6 +4,22 @@ import { getServerSession } from 'next-auth'; import { authOptions } from '@/app/api/auth/[...nextauth]/route'; import { prisma } from '@/lib/prisma'; +// Define the Email type +interface Email { + id: string; + from: string; + fromName: string; + to: string; + subject: string; + date: string; + read: boolean; + starred: boolean; + folder: string; + hasAttachments: boolean; + flags: string[]; + preview?: string; +} + // Add caching for better performance const cache = new Map(); @@ -33,32 +49,23 @@ export async function GET(request: Request) { ); } - // Get credentials from database const credentials = await prisma.mailCredentials.findUnique({ - where: { - userId: session.user.id - } + where: { userId: session.user.id } }); if (!credentials) { return NextResponse.json( - { error: 'No mail credentials found. Please configure your email account.' }, + { error: 'No mail credentials found' }, { status: 401 } ); } - // Get query parameters const url = new URL(request.url); const folder = url.searchParams.get('folder') || 'INBOX'; const page = parseInt(url.searchParams.get('page') || '1'); const limit = parseInt(url.searchParams.get('limit') || '20'); const preview = url.searchParams.get('preview') === 'true'; - // Calculate start and end sequence numbers - const start = (page - 1) * limit + 1; - const end = start + limit - 1; - - // Connect to IMAP server const client = new ImapFlow({ host: credentials.host, port: credentials.port, @@ -69,50 +76,46 @@ export async function GET(request: Request) { }, logger: false, emitLogs: false, - tls: { - rejectUnauthorized: false - } + tls: { rejectUnauthorized: false } }); try { await client.connect(); - // Get list of all mailboxes first const mailboxes = await client.list(); const availableFolders = mailboxes.map(box => box.path); - // Open the requested mailbox const mailbox = await client.mailboxOpen(folder); - const result = []; + const start = (page - 1) * limit + 1; + const end = start + limit - 1; + + const result: Email[] = []; - // Only try to fetch if the mailbox has messages if (mailbox.exists > 0) { - // Adjust start and end to be within bounds const adjustedStart = Math.min(start, mailbox.exists); const adjustedEnd = Math.min(end, mailbox.exists); - // Fetch both metadata and preview content const messages = await client.fetch(`${adjustedStart}:${adjustedEnd}`, { envelope: true, flags: true, bodyStructure: true, - // Only fetch preview content if requested ...(preview ? { bodyParts: ['TEXT'], bodyPartsOptions: { TEXT: { - maxLength: 1000 // Limit preview length + maxLength: 1000 } } } : {}) }); for await (const message of messages) { - result.push({ - id: message.uid, + const email: Email = { + id: message.uid.toString(), from: message.envelope.from?.[0]?.address || '', - fromName: message.envelope.from?.[0]?.name || message.envelope.from?.[0]?.address?.split('@')[0] || '', + fromName: message.envelope.from?.[0]?.name || + message.envelope.from?.[0]?.address?.split('@')[0] || '', to: message.envelope.to?.map(addr => addr.address).join(', ') || '', subject: message.envelope.subject || '(No subject)', date: message.envelope.date?.toISOString() || new Date().toISOString(), @@ -121,9 +124,9 @@ export async function GET(request: Request) { folder: mailbox.path, hasAttachments: message.bodyStructure?.type === 'multipart', flags: Array.from(message.flags), - // Include preview content if available - preview: preview ? message.bodyParts?.TEXT?.toString() : null - }); + preview: preview ? message.bodyParts?.get('TEXT')?.toString() : undefined + }; + result.push(email); } } @@ -134,11 +137,7 @@ export async function GET(request: Request) { hasMore: end < mailbox.exists }); } finally { - try { - await client.logout(); - } catch (e) { - console.error('Error during logout:', e); - } + await client.logout(); } } catch (error) { console.error('Error in courrier route:', error);