from typing import Annotated import asyncpg from dishka.integrations.fastapi import DishkaRoute, FromDishka from fastapi import APIRouter, Query from utils.policy import repository from utils.policy.models import FolderSpec router = APIRouter(prefix="/api/folders", tags=["folders"], route_class=DishkaRoute) def _serialize(spec: FolderSpec) -> dict: return { "folder_id": spec.folder_id, "order_index": spec.order_index, "title": spec.title, "include_ids": sorted(spec.include_ids), "exclude_ids": sorted(spec.exclude_ids), "pinned_ids": sorted(spec.pinned_ids), "contacts": spec.contacts, "non_contacts": spec.non_contacts, "groups": spec.groups, "broadcasts": spec.broadcasts, "bots": spec.bots, "is_chatlist": spec.is_chatlist, } @router.get("") async def list_folders( pool: FromDishka[asyncpg.Pool], account_id: Annotated[int, Query()] ) -> list[dict]: folders = await repository.list_folders(pool, account_id) return [_serialize(spec) for spec in folders]