From 8d6e0c85b2194f9c58b4a27b934a06f612909dda Mon Sep 17 00:00:00 2001 From: alma Date: Thu, 1 May 2025 22:12:24 +0200 Subject: [PATCH] courrier preview --- app/api/courrier/delete/route.ts | 119 +++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 app/api/courrier/delete/route.ts diff --git a/app/api/courrier/delete/route.ts b/app/api/courrier/delete/route.ts new file mode 100644 index 00000000..1b0e618a --- /dev/null +++ b/app/api/courrier/delete/route.ts @@ -0,0 +1,119 @@ +import { NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '@/app/api/auth/[...nextauth]/route'; +import { getImapConnection } from '@/lib/services/email-service'; +import { invalidateFolderCache } from '@/lib/redis'; + +export async function POST(request: Request) { + try { + // Authenticate user + const session = await getServerSession(authOptions); + if (!session || !session.user?.id) { + return NextResponse.json( + { error: "Not authenticated" }, + { status: 401 } + ); + } + + // Extract request body + const body = await request.json(); + const { emailIds, folder, accountId } = body; + + // Validate required parameters + if (!emailIds || !Array.isArray(emailIds) || emailIds.length === 0) { + console.error('[DELETE API] Missing or invalid emailIds parameter:', emailIds); + return NextResponse.json( + { error: "Missing or invalid emailIds parameter" }, + { status: 400 } + ); + } + + if (!folder) { + console.error('[DELETE API] Missing folder parameter'); + return NextResponse.json( + { error: "Missing folder parameter" }, + { status: 400 } + ); + } + + // Extract account ID from folder name if present and none was explicitly provided + const folderAccountId = folder.includes(':') ? folder.split(':')[0] : undefined; + + // Use the most specific account ID available + const effectiveAccountId = folderAccountId || accountId || 'default'; + + // Normalize folder name by removing account prefix if present + const normalizedFolder = folder.includes(':') ? folder.split(':')[1] : folder; + + console.log(`[DELETE API] Deleting ${emailIds.length} emails from folder ${normalizedFolder}, account ${effectiveAccountId}`); + + // Get IMAP connection + const client = await getImapConnection(session.user.id, effectiveAccountId); + + try { + // Open the mailbox + await client.mailboxOpen(normalizedFolder); + + // Check if we're already in the trash folder + const inTrash = normalizedFolder.toLowerCase() === 'trash' || + normalizedFolder.toLowerCase() === 'bin' || + normalizedFolder.toLowerCase() === 'deleted'; + + if (inTrash) { + // If we're in trash, mark as deleted + console.log(`[DELETE API] In trash folder, marking emails as deleted: ${emailIds.join(', ')}`); + + // Mark messages as deleted + for (const emailId of emailIds) { + await client.messageFlagsAdd(emailId, ['\\Deleted']); + } + } else { + // If not in trash, move to trash + console.log(`[DELETE API] Moving emails to trash: ${emailIds.join(', ')}`); + + // Try to find the trash folder + const mailboxes = await client.list(); + let trashFolder = 'Trash'; + + // Look for common trash folder names + const trashFolderNames = ['Trash', 'TRASH', 'Bin', 'Deleted', 'Deleted Items']; + for (const folder of mailboxes) { + if (trashFolderNames.includes(folder.name) || + trashFolderNames.some(name => folder.name.toLowerCase().includes(name.toLowerCase()))) { + trashFolder = folder.name; + break; + } + } + + // Move messages to trash + for (const emailId of emailIds) { + await client.messageMove(emailId, trashFolder); + } + } + + // Invalidate cache for source folder + await invalidateFolderCache(session.user.id, effectiveAccountId, normalizedFolder); + + // Also invalidate trash folder cache + await invalidateFolderCache(session.user.id, effectiveAccountId, 'Trash'); + + return NextResponse.json({ + success: true, + message: `${emailIds.length} email(s) deleted successfully` + }); + } finally { + try { + // Always close the mailbox + await client.mailboxClose(); + } catch (error) { + console.error('Error closing mailbox:', error); + } + } + } catch (error) { + console.error('[DELETE API] Error processing delete request:', error); + return NextResponse.json( + { error: "Failed to delete emails", details: error instanceof Error ? error.message : String(error) }, + { status: 500 } + ); + } +} \ No newline at end of file