diff --git a/backend/app/routers/imap.py b/backend/app/routers/imap.py index 2199f03..1592b7c 100644 --- a/backend/app/routers/imap.py +++ b/backend/app/routers/imap.py @@ -8,6 +8,7 @@ from app.core.imap import _test_imap_connection, get_folders from app.core.logging import get_logger from app.crud.settings import create_or_update_settings, get_settings from app.schemas.settings import Settings, SettingsCreate +from app.services.email_processor import process_emails logger = get_logger(__name__) router = APIRouter() @@ -71,3 +72,15 @@ def read_folders(db: Session = Depends(get_db)): logger.info(f"Found {len(folders)} IMAP folders") return folders + + +@router.post("/imap/process") +def trigger_email_processing(db: Session = Depends(get_db)): + """Trigger the email processing manually.""" + logger.info("Request to manually trigger email processing") + try: + process_emails(db) + return {"message": "Email processing triggered successfully."} + except Exception as e: + logger.error(f"Error triggering email processing: {e}", exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) diff --git a/backend/app/tests/test_routers.py b/backend/app/tests/test_routers.py index 59054e0..ea9016a 100644 --- a/backend/app/tests/test_routers.py +++ b/backend/app/tests/test_routers.py @@ -102,6 +102,15 @@ def test_get_imap_folders(mock_imap, client: TestClient): assert response.json() == ["INBOX", "Processed"] +@patch("app.routers.imap.process_emails") +def test_trigger_email_processing(mock_process_emails, client: TestClient): + """Test triggering email processing manually.""" + response = client.post("/imap/process") + assert response.status_code == 200 + assert response.json() == {"message": "Email processing triggered successfully."} + mock_process_emails.assert_called_once() + + def test_create_newsletter(client: TestClient): """Test creating a newsletter.""" unique_email = f"newsletter_{uuid.uuid4()}@example.com" diff --git a/frontend/components/letterfeed/Header.tsx b/frontend/components/letterfeed/Header.tsx index 3e2b9bd..e868714 100644 --- a/frontend/components/letterfeed/Header.tsx +++ b/frontend/components/letterfeed/Header.tsx @@ -1,6 +1,10 @@ +"use client" + import { Button } from "@/components/ui/button" -import { Plus, Settings } from "lucide-react" +import { processEmails } from "@/lib/api" +import { Mail, Plus, Settings } from "lucide-react" import Image from "next/image" +import { toast } from "sonner" interface HeaderProps { onOpenAddNewsletter: () => void @@ -8,13 +12,35 @@ interface HeaderProps { } export function Header({ onOpenAddNewsletter, onOpenSettings }: HeaderProps) { + const handleProcessEmails = async () => { + try { + await processEmails() + toast.success("Email processing started successfully!") + } catch (error) { + const message = + error instanceof Error + ? error.message + : "An unexpected error occurred." + console.error(error) + toast.error(message) + } + } + return (
- LetterFeed Logo + LetterFeed Logo

LetterFeed

-

Read your newsletters as RSS feeds!

+

+ Read your newsletters as RSS feeds! +

@@ -24,6 +50,11 @@ export function Header({ onOpenAddNewsletter, onOpenSettings }: HeaderProps) { Add Newsletter + +