65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
from typing import Annotated
|
|
|
|
import asyncpg
|
|
from dishka.integrations.fastapi import DishkaRoute, FromDishka
|
|
from fastapi import APIRouter, HTTPException, Query
|
|
|
|
from utils.read import peers, people
|
|
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 people.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 people.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 people.get_chat_changes(pool, account_id, chat_id)
|