Initial commit: IMAP Mail Filter Service
This commit is contained in:
+100
@@ -0,0 +1,100 @@
|
||||
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})
|
||||
Reference in New Issue
Block a user