from typing import Annotated import asyncpg from dishka.integrations.fastapi import DishkaRoute, FromDishka from fastapi import APIRouter, HTTPException, Query from utils.read import peers from utils.read.models import ( PeerGroups, PeerHistoryView, PeerOverview, PeerView, ProfileChange, ) router = APIRouter(prefix="/api", tags=["peers"], route_class=DishkaRoute) AccountId = Annotated[int, Query()] @router.get("/peers/batch") async def get_peers( pool: FromDishka[asyncpg.Pool], account_id: AccountId, ids: Annotated[str, Query()] ) -> list[PeerView]: parsed = [int(part) for part in ids.split(",") if part.strip()] return await peers.get_peers(pool, account_id, parsed) @router.get("/peers/{peer_id}") async def get_peer( pool: FromDishka[asyncpg.Pool], peer_id: int, account_id: AccountId ) -> PeerView: peer = await peers.get_peer(pool, account_id, peer_id) if peer is None: raise HTTPException(status_code=404, detail="peer not found") return peer @router.get("/peers/{peer_id}/history") async def peer_history( pool: FromDishka[asyncpg.Pool], peer_id: int, account_id: AccountId ) -> list[PeerHistoryView]: return await peers.get_peer_history(pool, account_id, peer_id) @router.get("/peers/{peer_id}/overview") async def peer_overview( pool: FromDishka[asyncpg.Pool], peer_id: int, account_id: AccountId ) -> PeerOverview: return await peers.get_overview(pool, account_id, peer_id) @router.get("/peers/{peer_id}/groups") async def peer_groups( pool: FromDishka[asyncpg.Pool], peer_id: int, account_id: AccountId ) -> PeerGroups: return await peers.get_groups(pool, account_id, peer_id) @router.get("/chats/{chat_id}/changes") async def chat_changes( pool: FromDishka[asyncpg.Pool], chat_id: int, account_id: AccountId ) -> list[ProfileChange]: return await peers.get_chat_changes(pool, account_id, chat_id)