dashboard-nanobot/backend/api/topic_router.py

92 lines
2.9 KiB
Python

from typing import Any, Dict, Optional
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlmodel import Session
from core.database import get_session
from services.topic_service import (
create_topic,
delete_topic,
delete_topic_item,
get_topic_item_stats,
list_topic_items,
list_topics,
mark_topic_item_read,
update_topic,
)
router = APIRouter()
class TopicCreateRequest(BaseModel):
topic_key: str
name: Optional[str] = None
description: Optional[str] = None
is_active: bool = True
routing: Optional[Dict[str, Any]] = None
view_schema: Optional[Dict[str, Any]] = None
class TopicUpdateRequest(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
is_active: Optional[bool] = None
routing: Optional[Dict[str, Any]] = None
view_schema: Optional[Dict[str, Any]] = None
@router.get("/api/bots/{bot_id}/topics")
def list_bot_topics(bot_id: str, session: Session = Depends(get_session)):
return list_topics(session, bot_id)
@router.post("/api/bots/{bot_id}/topics")
def create_bot_topic(bot_id: str, payload: TopicCreateRequest, session: Session = Depends(get_session)):
return create_topic(
session,
bot_id=bot_id,
topic_key=payload.topic_key,
name=payload.name,
description=payload.description,
is_active=payload.is_active,
routing=payload.routing,
view_schema=payload.view_schema,
)
@router.put("/api/bots/{bot_id}/topics/{topic_key}")
def update_bot_topic(bot_id: str, topic_key: str, payload: TopicUpdateRequest, session: Session = Depends(get_session)):
return update_topic(session, bot_id=bot_id, topic_key=topic_key, updates=payload.model_dump(exclude_unset=True))
@router.delete("/api/bots/{bot_id}/topics/{topic_key}")
def delete_bot_topic(bot_id: str, topic_key: str, session: Session = Depends(get_session)):
return delete_topic(session, bot_id=bot_id, topic_key=topic_key)
@router.get("/api/bots/{bot_id}/topic-items")
def list_bot_topic_items(
bot_id: str,
topic_key: Optional[str] = None,
cursor: Optional[int] = None,
limit: int = 50,
session: Session = Depends(get_session),
):
return list_topic_items(session, bot_id=bot_id, topic_key=topic_key, cursor=cursor, limit=limit)
@router.get("/api/bots/{bot_id}/topic-items/stats")
def get_bot_topic_item_stats(bot_id: str, session: Session = Depends(get_session)):
return get_topic_item_stats(session, bot_id=bot_id)
@router.post("/api/bots/{bot_id}/topic-items/{item_id}/read")
def mark_bot_topic_item_read(bot_id: str, item_id: int, session: Session = Depends(get_session)):
return mark_topic_item_read(session, bot_id=bot_id, item_id=item_id)
@router.delete("/api/bots/{bot_id}/topic-items/{item_id}")
def delete_bot_topic_item(bot_id: str, item_id: int, session: Session = Depends(get_session)):
return delete_topic_item(session, bot_id=bot_id, item_id=item_id)