NeahNew/app/api/courrier/fix-folders/route.ts
2025-05-05 13:04:01 +02:00

116 lines
3.0 KiB
TypeScript

import { NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import { authOptions } from "@/app/api/auth/options";
import { prisma } from '@/lib/prisma';
import { getMailboxes } from '@/lib/services/email-service';
import { ImapFlow } from 'imapflow';
import { cacheImapSession, getCachedImapSession } from '@/lib/redis';
export async function POST() {
// Verify auth
const session = await getServerSession(authOptions);
if (!session?.user?.id) {
return NextResponse.json(
{ error: 'Unauthorized' },
{ status: 401 }
);
}
const userId = session.user.id;
const results = {
success: false,
userId,
accountsProcessed: 0,
foldersFound: 0,
accounts: [] as any[]
};
try {
// Get all accounts for this user
const accounts = await prisma.mailCredentials.findMany({
where: { userId },
select: {
id: true,
email: true,
password: true,
host: true,
port: true
}
});
if (accounts.length === 0) {
return NextResponse.json({
success: false,
error: 'No email accounts found'
});
}
// Process each account
for (const account of accounts) {
try {
// Connect to IMAP server for this account
const client = new ImapFlow({
host: account.host,
port: account.port,
secure: true,
auth: {
user: account.email,
pass: account.password,
},
logger: false,
tls: {
rejectUnauthorized: false
}
});
await client.connect();
// Get folders for this account
const folders = await getMailboxes(client);
// Store the results
results.accounts.push({
id: account.id,
email: account.email,
folderCount: folders.length,
folders
});
results.foldersFound += folders.length;
results.accountsProcessed++;
// Get existing session data
const existingSession = await getCachedImapSession(userId);
// Update the Redis cache with the folders
await cacheImapSession(userId, {
...(existingSession || { lastActive: Date.now() }),
mailboxes: folders,
lastVisit: Date.now()
});
// Close connection
await client.logout();
} catch (error) {
results.accounts.push({
id: account.id,
email: account.email,
error: error instanceof Error ? error.message : 'Unknown error'
});
}
}
results.success = results.accountsProcessed > 0;
return NextResponse.json(results);
} catch (error) {
return NextResponse.json(
{
success: false,
error: 'Failed to fix folders',
details: error instanceof Error ? error.message : 'Unknown error'
},
{ status: 500 }
);
}
}