imap-mail-filter-service/app/main.py

101 lines
3.3 KiB
Python

import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from app.config import settings
from app.database import Base, engine
logging.basicConfig(
level=getattr(logging, settings.log_level.upper(), logging.INFO),
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
)
logger = logging.getLogger(__name__)
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("Starte IMAP Mail Filter Service...")
Base.metadata.create_all(bind=engine)
logger.info("Datenbank initialisiert.")
if settings.yaml_sync_on_startup:
from app.services.yaml_service import import_from_file
result = import_from_file()
logger.info("YAML-Startup-Import: %s", result)
from app.services.scheduler import start_scheduler, stop_scheduler
start_scheduler()
yield
stop_scheduler()
logger.info("Service wird beendet.")
app = FastAPI(title="IMAP Mail Filter Service", lifespan=lifespan)
app.mount("/static", StaticFiles(directory="app/static"), name="static")
templates = Jinja2Templates(directory="app/templates")
from fastapi import Depends, Request # noqa: E402
from sqlalchemy.orm import Session # noqa: E402
from app.database import get_db # noqa: E402
from app.models.db_models import Account # noqa: E402
from app.routers import accounts, filters, yaml_sync # noqa: E402
app.include_router(accounts.router)
app.include_router(filters.router)
app.include_router(yaml_sync.router)
# --- Web-UI Routen ---
@app.get("/")
def dashboard(request: Request, db: Session = Depends(get_db)):
accs = db.query(Account).order_by(Account.name).all()
account_list = []
for acc in accs:
account_list.append({
"id": acc.id,
"name": acc.name,
"username": acc.username,
"imap_host": acc.imap_host,
"enabled": acc.enabled,
"poll_interval_seconds": acc.poll_interval_seconds,
"last_poll_at": acc.last_poll_at,
"filter_rule_count": len(acc.filter_rules),
})
return templates.TemplateResponse("dashboard.html", {"request": request, "accounts": account_list})
@app.get("/accounts")
def accounts_page(request: Request, db: Session = Depends(get_db)):
accs = db.query(Account).order_by(Account.name).all()
return templates.TemplateResponse("accounts.html", {"request": request, "accounts": accs})
@app.get("/accounts/new")
def new_account_page(request: Request):
return templates.TemplateResponse("account_form.html", {"request": request, "account": None})
@app.get("/accounts/{account_id}/edit")
def edit_account_page(account_id: int, request: Request, db: Session = Depends(get_db)):
account = db.get(Account, account_id)
return templates.TemplateResponse("account_form.html", {"request": request, "account": account})
@app.get("/filters")
def filters_page(request: Request, account_id: int = 0, db: Session = Depends(get_db)):
accs = db.query(Account).order_by(Account.name).all()
return templates.TemplateResponse("filters.html", {
"request": request,
"accounts": accs,
"selected_account_id": account_id,
})
@app.get("/yaml")
def yaml_page(request: Request):
return templates.TemplateResponse("yaml.html", {"request": request})