feat: add api and mcp
This commit is contained in:
1 parent
6a5cde6ae4
commit
c40e720163
30 files changed
+2354
-31
No files matched your search
@@ -0,0 +1,77 @@
|
||||
from typing import Annotated
|
||||
|
||||
import asyncpg
|
||||
from dishka.integrations.fastapi import DishkaRoute, FromDishka
|
||||
from fastapi import APIRouter, HTTPException, Query
|
||||
from pydantic import BaseModel
|
||||
|
||||
from utils.read import annotations
|
||||
from utils.read.models import DEFAULT_LIMIT, AnnotationView, Page
|
||||
|
||||
router = APIRouter(
|
||||
prefix="/api/annotations", tags=["annotations"], route_class=DishkaRoute
|
||||
)
|
||||
|
||||
|
||||
class AnnotationCreate(BaseModel):
|
||||
account_id: int
|
||||
chat_id: int
|
||||
message_id: int
|
||||
text: str
|
||||
|
||||
|
||||
class AnnotationUpdate(BaseModel):
|
||||
text: str
|
||||
|
||||
|
||||
@router.get("")
|
||||
async def list_annotations(
|
||||
pool: FromDishka[asyncpg.Pool],
|
||||
account_id: Annotated[int, Query()],
|
||||
chat_id: Annotated[int | None, Query()] = None,
|
||||
message_id: Annotated[int | None, Query()] = None,
|
||||
limit: Annotated[int, Query()] = DEFAULT_LIMIT,
|
||||
offset: Annotated[int, Query()] = 0,
|
||||
) -> list[AnnotationView]:
|
||||
return await annotations.list_annotations(
|
||||
pool,
|
||||
account_id,
|
||||
Page(limit=limit, offset=offset),
|
||||
chat_id=chat_id,
|
||||
message_id=message_id,
|
||||
)
|
||||
|
||||
|
||||
@router.post("", status_code=201)
|
||||
async def create_annotation(
|
||||
pool: FromDishka[asyncpg.Pool], body: AnnotationCreate
|
||||
) -> AnnotationView:
|
||||
return await annotations.create_annotation(
|
||||
pool, body.account_id, body.chat_id, body.message_id, body.text
|
||||
)
|
||||
|
||||
|
||||
@router.get("/{annotation_id}")
|
||||
async def get_annotation(
|
||||
pool: FromDishka[asyncpg.Pool], annotation_id: int
|
||||
) -> AnnotationView:
|
||||
annotation = await annotations.get_annotation(pool, annotation_id)
|
||||
if annotation is None:
|
||||
raise HTTPException(status_code=404, detail="annotation not found")
|
||||
return annotation
|
||||
|
||||
|
||||
@router.put("/{annotation_id}")
|
||||
async def update_annotation(
|
||||
pool: FromDishka[asyncpg.Pool], annotation_id: int, body: AnnotationUpdate
|
||||
) -> AnnotationView:
|
||||
annotation = await annotations.update_annotation(pool, annotation_id, body.text)
|
||||
if annotation is None:
|
||||
raise HTTPException(status_code=404, detail="annotation not found")
|
||||
return annotation
|
||||
|
||||
|
||||
@router.delete("/{annotation_id}", status_code=204)
|
||||
async def delete_annotation(pool: FromDishka[asyncpg.Pool], annotation_id: int) -> None:
|
||||
if not await annotations.delete_annotation(pool, annotation_id):
|
||||
raise HTTPException(status_code=404, detail="annotation not found")
|
||||
Reference in new issue
Block a user