courrier multi account restore compose
This commit is contained in:
parent
43067c6240
commit
aabf043b60
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user