from typing import Optional from fastapi import APIRouter, HTTPException, status from sqlmodel import select from app.db import SessionDep from app.dependencies import CurrentUser from app.models.mail_log import MailLog, MailLogPublic from app.models.purchase_round import PurchaseRound from app.models.route import Route router = APIRouter(prefix="/mail-logs", tags=["mail-logs"]) @router.get("", response_model=list[MailLogPublic]) def list_mail_logs( session: SessionDep, current_user: CurrentUser, participant_id: Optional[int] = None, purchase_round_id: Optional[int] = None, ) -> list[MailLog]: statement = ( select(MailLog) .join(PurchaseRound) .join(Route) .where(Route.organization_id == current_user.organization_id) ) if participant_id is not None: statement = statement.where(MailLog.participant_id == participant_id) if purchase_round_id is not None: statement = statement.where(MailLog.purchase_round_id == purchase_round_id) statement = statement.order_by(MailLog.id.desc()) return list(session.exec(statement).all()) @router.get("/{log_id}", response_model=MailLogPublic) def get_mail_log(log_id: int, session: SessionDep, current_user: CurrentUser) -> MailLog: mail_log = session.exec( select(MailLog) .join(PurchaseRound) .join(Route) .where(MailLog.id == log_id, Route.organization_id == current_user.organization_id) ).first() if mail_log is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Mail log not found") return mail_log