diff --git a/app/api/courrier/login/route.ts b/app/api/courrier/login/route.ts deleted file mode 100644 index 34706a67..00000000 --- a/app/api/courrier/login/route.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { NextResponse } from 'next/server'; -import { getServerSession } from 'next-auth'; -import { authOptions } from '@/app/api/auth/[...nextauth]/route'; -import { - saveUserEmailCredentials, - getUserEmailCredentials, - testEmailConnection -} from '@/lib/services/email-service'; -import { prefetchUserEmailData } from '@/lib/services/prefetch-service'; -import { - cacheEmailCredentials, - invalidateUserEmailCache, - getCachedEmailCredentials -} from '@/lib/redis'; -import { prisma } from '@/lib/prisma'; - -export async function POST(request: Request) { - try { - // Authenticate user - const session = await getServerSession(authOptions); - if (!session?.user?.id) { - return NextResponse.json( - { error: 'Unauthorized' }, - { status: 401 } - ); - } - - // Get credentials from request - const { email, password, host, port } = await request.json(); - - // Validate required fields - if (!email || !password || !host || !port) { - return NextResponse.json( - { error: 'Missing required fields' }, - { status: 400 } - ); - } - - // Test connection before saving - const connectionSuccess = await testEmailConnection({ - email, - password, - host, - port: parseInt(port) - }); - - if (!connectionSuccess) { - return NextResponse.json( - { error: 'Failed to connect to email server. Please check your credentials.' }, - { status: 401 } - ); - } - - // Invalidate all cached data for this user as they are changing their credentials - await invalidateUserEmailCache(session.user.id); - - // Create credentials object with required fields - const credentials = { - email, - password, - host, - port: parseInt(port), - secure: true // Default to secure connection - }; - - // Save credentials in the database and Redis - // Use email as the accountId since it's unique per user - await saveUserEmailCredentials(session.user.id, email, credentials); - - // Start prefetching email data in the background - // We don't await this to avoid blocking the response - prefetchUserEmailData(session.user.id).catch(err => { - console.error('Background prefetch error:', err); - }); - - return NextResponse.json({ success: true }); - } catch (error) { - console.error('Error in login handler:', error); - return NextResponse.json( - { error: 'An unexpected error occurred' }, - { status: 500 } - ); - } -} - -export async function GET() { - try { - const session = await getServerSession(authOptions); - if (!session?.user?.id) { - return NextResponse.json( - { error: 'Unauthorized' }, - { status: 401 } - ); - } - - // First try to get from Redis cache - let credentials = await getCachedEmailCredentials(session.user.id, 'default'); - - // If not in cache, get from database - if (!credentials) { - credentials = await prisma.mailCredentials.findUnique({ - where: { - userId: session.user.id - }, - select: { - email: true, - host: true, - port: true - } - }); - } else { - // Remove password from response - const { password, ...safeCredentials } = credentials; - credentials = safeCredentials; - } - - if (!credentials) { - return NextResponse.json( - { error: 'No stored credentials found' }, - { status: 404 } - ); - } - - return NextResponse.json(credentials); - } catch (error) { - return NextResponse.json( - { error: 'Failed to retrieve credentials' }, - { status: 500 } - ); - } -} \ No newline at end of file diff --git a/app/courrier/login/page.tsx b/app/courrier/login/page.tsx deleted file mode 100644 index 8726f4ba..00000000 --- a/app/courrier/login/page.tsx +++ /dev/null @@ -1,116 +0,0 @@ -'use client'; - -import { useState } from 'react'; -import { useRouter } from 'next/navigation'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; - -export default function MailLoginPage() { - const router = useRouter(); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [host, setHost] = useState('mail.infomaniak.com'); - const [port, setPort] = useState('993'); - const [error, setError] = useState(''); - const [loading, setLoading] = useState(false); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setError(''); - setLoading(true); - - try { - const response = await fetch('/api/courrier/login', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - email, - password, - host, - port, - }), - }); - - const data = await response.json(); - - if (!response.ok) { - throw new Error(data.error || 'Failed to connect to email server'); - } - - // Redirect to mail page - router.push('/mail'); - } catch (err) { - setError(err instanceof Error ? err.message : 'An error occurred'); - } finally { - setLoading(false); - } - }; - - return ( -