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
-
Read your newsletters as RSS feeds!
+
+ Read your newsletters as RSS feeds!
+
@@ -24,6 +50,11 @@ export function Header({ onOpenAddNewsletter, onOpenSettings }: HeaderProps) {
Add Newsletter
+
+