From 5f3a3f5f0389efa0a74900b9a869540e3f9141f2 Mon Sep 17 00:00:00 2001 From: alma Date: Fri, 25 Apr 2025 12:57:56 +0200 Subject: [PATCH] panel 2 courier api --- app/api/courrier/route.ts | 166 +++++--------------------------------- 1 file changed, 18 insertions(+), 148 deletions(-) diff --git a/app/api/courrier/route.ts b/app/api/courrier/route.ts index 510a2ede..e197c4f5 100644 --- a/app/api/courrier/route.ts +++ b/app/api/courrier/route.ts @@ -36,6 +36,12 @@ const emailCache = new LRUCache({ ttl: 1000 * 60 * 5, // Cache for 5 minutes }); +// Simple in-memory cache for email content +const emailContentCache = new LRUCache({ + max: 100, + ttl: 1000 * 60 * 15, // 15 minutes +}); + // Keep IMAP connections per user with timeouts const connectionPool = new Map box.path); - emailCache.set(foldersCacheKey, availableFolders); - } - - // 7. Open mailbox - const mailbox = await client.mailboxOpen(folder); - - const result: Email[] = []; - - // 8. Fetch emails (if any exist) - // Define start and end variables HERE - let start = 1; - let end = 0; - - if (mailbox.exists > 0) { - // Calculate range with boundaries - start = Math.min((page - 1) * limit + 1, mailbox.exists); - end = Math.min(start + limit - 1, mailbox.exists); - - // Use sequence numbers in descending order for newest first - const range = `${mailbox.exists - end + 1}:${mailbox.exists - start + 1}`; - - // Fetch messages with optimized options - const options: any = { - envelope: true, - flags: true, - bodyStructure: true - }; - - // Only fetch preview if requested - if (preview) { - options.bodyParts = ['TEXT', 'HTML']; - } - - const messages = await client.fetch(range, options); - - // Process messages - for await (const message of messages) { - // Extract preview content correctly - let previewContent = null; - if (preview && message.bodyParts) { - // Try HTML first, then TEXT - const htmlPart = message.bodyParts.get('HTML'); - const textPart = message.bodyParts.get('TEXT'); - previewContent = htmlPart?.toString() || textPart?.toString() || null; - } - - 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] || '', - to: message.envelope.to?.map((addr: any) => addr.address).join(', ') || '', - subject: message.envelope.subject || '(No subject)', - date: message.envelope.date?.toISOString() || new Date().toISOString(), - read: message.flags.has('\\Seen'), - starred: message.flags.has('\\Flagged'), - folder: mailbox.path, - hasAttachments: message.bodyStructure?.type === 'multipart', - flags: Array.from(message.flags), - preview: previewContent - }; - - result.push(email); - } - } - - // 9. Prepare response data - const responseData = { - emails: result, - folders: availableFolders, - total: mailbox.exists, - hasMore: end < mailbox.exists, - page, - limit - }; - - // 10. Cache the results - emailCache.set(cacheKey, responseData); - - return NextResponse.json(responseData); - } catch (error) { - // Connection error - remove from pool - connectionPool.delete(session.user.id); - throw error; - } - } catch (error) { - console.error('Error in courrier route:', error); - return NextResponse.json( - { error: 'An unexpected error occurred' }, - { status: 500 } - ); - } +export async function GET( + request: Request, + { params }: { params: { id: string } } +) { + // Get the ID from the URL + const id = await Promise.resolve(params.id); + + // Create the new URL for redirect + const url = new URL(`/api/courrier/${id}`, request.url); + + // Redirect to the new endpoint + return NextResponse.redirect(url); } // Helper method to release connection when app shutting down