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})