98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
from fastapi import APIRouter, Depends, HTTPException
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.database import get_db
|
|
from app.models.db_models import Account
|
|
from app.schemas.schemas import (
|
|
AccountCreate,
|
|
AccountListResponse,
|
|
AccountResponse,
|
|
AccountUpdate,
|
|
)
|
|
from app.services.encryption import decrypt, encrypt
|
|
from app.services.imap_client import async_test_connection
|
|
|
|
router = APIRouter(prefix="/api/accounts", tags=["accounts"])
|
|
|
|
|
|
@router.get("/", response_model=list[AccountListResponse])
|
|
def list_accounts(db: Session = Depends(get_db)):
|
|
accounts = db.query(Account).order_by(Account.name).all()
|
|
result = []
|
|
for acc in accounts:
|
|
data = AccountListResponse.model_validate(acc)
|
|
data.filter_rule_count = len(acc.filter_rules)
|
|
result.append(data)
|
|
return result
|
|
|
|
|
|
@router.get("/{account_id}", response_model=AccountResponse)
|
|
def get_account(account_id: int, db: Session = Depends(get_db)):
|
|
account = db.get(Account, account_id)
|
|
if not account:
|
|
raise HTTPException(404, "Konto nicht gefunden")
|
|
return account
|
|
|
|
|
|
@router.post("/", response_model=AccountResponse, status_code=201)
|
|
def create_account(data: AccountCreate, db: Session = Depends(get_db)):
|
|
account_data = data.model_dump()
|
|
account_data["password"] = encrypt(account_data["password"])
|
|
if account_data.get("smtp_password"):
|
|
account_data["smtp_password"] = encrypt(account_data["smtp_password"])
|
|
account = Account(**account_data)
|
|
db.add(account)
|
|
db.commit()
|
|
db.refresh(account)
|
|
return account
|
|
|
|
|
|
@router.put("/{account_id}", response_model=AccountResponse)
|
|
def update_account(account_id: int, data: AccountUpdate, db: Session = Depends(get_db)):
|
|
account = db.get(Account, account_id)
|
|
if not account:
|
|
raise HTTPException(404, "Konto nicht gefunden")
|
|
for key, value in data.model_dump(exclude_unset=True).items():
|
|
if key == "password" and value:
|
|
value = encrypt(value)
|
|
elif key == "smtp_password" and value:
|
|
value = encrypt(value)
|
|
setattr(account, key, value)
|
|
db.commit()
|
|
db.refresh(account)
|
|
return account
|
|
|
|
|
|
@router.delete("/{account_id}", status_code=204)
|
|
def delete_account(account_id: int, db: Session = Depends(get_db)):
|
|
account = db.get(Account, account_id)
|
|
if not account:
|
|
raise HTTPException(404, "Konto nicht gefunden")
|
|
db.delete(account)
|
|
db.commit()
|
|
|
|
|
|
@router.post("/{account_id}/test")
|
|
async def test_account_connection(account_id: int, db: Session = Depends(get_db)):
|
|
account = db.get(Account, account_id)
|
|
if not account:
|
|
raise HTTPException(404, "Konto nicht gefunden")
|
|
success = await async_test_connection(
|
|
host=account.imap_host,
|
|
port=account.imap_port,
|
|
username=account.username,
|
|
password=decrypt(account.password),
|
|
use_ssl=account.use_ssl,
|
|
)
|
|
return {"success": success, "message": "Verbindung erfolgreich" if success else "Verbindung fehlgeschlagen"}
|
|
|
|
|
|
@router.post("/{account_id}/poll-now")
|
|
async def poll_now(account_id: int, db: Session = Depends(get_db)):
|
|
account = db.get(Account, account_id)
|
|
if not account:
|
|
raise HTTPException(404, "Konto nicht gefunden")
|
|
from app.services.scheduler import poll_account
|
|
await poll_account(account_id)
|
|
return {"message": f"Polling für '{account.name}' durchgeführt"}
|