courrier multi account restore compose

This commit is contained in:
alma 2025-04-30 14:52:08 +02:00
parent 43067c6240
commit aabf043b60

View File

@ -2,11 +2,17 @@ import { NextResponse } from 'next/server';
import { getServerSession } from 'next-auth'; import { getServerSession } from 'next-auth';
import { authOptions } from '@/app/api/auth/[...nextauth]/route'; import { authOptions } from '@/app/api/auth/[...nextauth]/route';
import { getImapConnection } from '@/lib/services/email-service'; import { getImapConnection } from '@/lib/services/email-service';
import { prisma } from '@/lib/prisma';
import { getRedisClient } from '@/lib/redis';
// Cache TTL for unread counts (30 seconds)
const UNREAD_COUNTS_CACHE_TTL = 30;
// Key for unread counts cache
const UNREAD_COUNTS_CACHE_KEY = (userId: string) => `email:unread:${userId}`;
/** /**
* API route for fetching unread counts for email folders * API route for fetching unread counts for email folders
* This solves the 500 error that occurred when the /unread-counts path was mistakenly being * Optimized with proper caching and connection reuse
* handled by the [id] route handler which expected a numeric ID
*/ */
export async function GET(request: Request) { export async function GET(request: Request) {
try { try {
@ -19,29 +25,53 @@ export async function GET(request: Request) {
); );
} }
// Get all accounts from the user's session const userId = session.user.id;
const accountIds = await getUserAccountIds(session.user.id); const redis = getRedisClient();
console.log(`[UNREAD_API] Got ${accountIds.length} accounts for user ${session.user.id}`);
// First try to get from cache
const cachedCounts = await redis.get(UNREAD_COUNTS_CACHE_KEY(userId));
if (cachedCounts) {
// Use cached results if available
console.log(`[UNREAD_API] Using cached unread counts for user ${userId}`);
return NextResponse.json(JSON.parse(cachedCounts));
}
console.log(`[UNREAD_API] Cache miss for user ${userId}, fetching unread counts`);
// Get all accounts from the database directly
const accounts = await prisma.mailCredentials.findMany({
where: { userId },
select: {
id: true,
email: true
}
});
console.log(`[UNREAD_API] Found ${accounts.length} accounts for user ${userId}`);
if (accounts.length === 0) {
return NextResponse.json({ default: {} });
}
// Mapping to hold the unread counts // Mapping to hold the unread counts
const unreadCounts: Record<string, Record<string, number>> = {}; const unreadCounts: Record<string, Record<string, number>> = {};
// For each account, get the unread counts for standard folders // For each account, get the unread counts for standard folders
for (const accountId of accountIds) { for (const account of accounts) {
const accountId = account.id;
try { try {
// Get IMAP connection for this account // Get IMAP connection for this account
const client = await getImapConnection(session.user.id, accountId); console.log(`[UNREAD_API] Processing account ${accountId} (${account.email})`);
const client = await getImapConnection(userId, accountId);
unreadCounts[accountId] = {}; unreadCounts[accountId] = {};
// Standard folders to check // Standard folders to check
const standardFolders = ['INBOX', 'Sent', 'Drafts', 'Trash', 'Junk', 'Spam', 'Archive', 'Sent Items']; const standardFolders = ['INBOX', 'Sent', 'Drafts', 'Trash', 'Junk', 'Spam', 'Archive', 'Sent Items', 'Archives', 'Notes', 'Éléments supprimés'];
// Get mailboxes for this account to check if folders exist // Get mailboxes for this account to check if folders exist
const mailboxes = await client.list(); const mailboxes = await client.list();
const availableFolders = mailboxes.map(mb => mb.path); const availableFolders = mailboxes.map(mb => mb.path);
console.log(`[UNREAD_API] Account ${accountId} has folders: ${availableFolders.join(', ')}`);
// Check each standard folder if it exists // Check each standard folder if it exists
for (const folder of standardFolders) { for (const folder of standardFolders) {
// Skip if folder doesn't exist in this account // Skip if folder doesn't exist in this account
@ -51,7 +81,7 @@ export async function GET(request: Request) {
} }
try { try {
// Open the mailbox // Check folder status without opening it (more efficient)
const status = await client.status(folder, { unseen: true }); const status = await client.status(folder, { unseen: true });
if (status && typeof status.unseen === 'number') { if (status && typeof status.unseen === 'number') {
@ -69,15 +99,21 @@ export async function GET(request: Request) {
} }
} }
// Close connection when done // Don't close the connection - let the connection pool handle it
await client.logout(); // This avoids opening and closing connections repeatedly
} catch (accountError) { } catch (accountError) {
console.error(`[UNREAD_API] Error processing account ${accountId}:`, accountError); console.error(`[UNREAD_API] Error processing account ${accountId}:`, accountError);
// Continue to next account even if this one fails
} }
} }
// Save to cache for 30 seconds to avoid hammering the IMAP server
await redis.set(
UNREAD_COUNTS_CACHE_KEY(userId),
JSON.stringify(unreadCounts),
'EX',
UNREAD_COUNTS_CACHE_TTL
);
return NextResponse.json(unreadCounts); return NextResponse.json(unreadCounts);
} catch (error: any) { } catch (error: any) {
console.error("[UNREAD_API] Error fetching unread counts:", error); console.error("[UNREAD_API] Error fetching unread counts:", error);