38 lines
1.0 KiB
Python
38 lines
1.0 KiB
Python
"""Mailbox (folder) listing (SPEC §9.3 folder views, archive action)."""
|
|||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import uuid
|
||
|
|
from typing import Annotated
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Depends
|
||
|
|
from pydantic import BaseModel
|
||
|
|
from sqlalchemy import select
|
||
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
|
|
||
|
|
from app.db import get_session
|
||
|
|
from app.identity.deps import CurrentUser
|
||
|
|
from app.models import Mailbox
|
||
|
|
|
||
|
|
router = APIRouter(prefix="/mailboxes", tags=["mail"])
|
||
|
|
|
||
|
|
DbSession = Annotated[AsyncSession, Depends(get_session)]
|
||
|
|
|
||
|
|
|
||
|
|
class MailboxOut(BaseModel):
|
||
|
|
id: uuid.UUID
|
||
|
|
account_id: uuid.UUID
|
||
|
|
path: str
|
||
|
|
special_use: str | None
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("", response_model=list[MailboxOut])
|
||
|
|
async def list_mailboxes(user: CurrentUser, db: DbSession) -> list[MailboxOut]:
|
||
|
|
rows = await db.scalars(
|
||
|
|
select(Mailbox).where(Mailbox.user_id == user.id).order_by(Mailbox.account_id, Mailbox.path)
|
||
|
|
)
|
||
|
|
return [
|
||
|
|
MailboxOut(id=m.id, account_id=m.account_id, path=m.path, special_use=m.special_use)
|
||
|
|
for m in rows
|
||
|
|
]
|