2025-09-14 17:15:48 +00:00

101 lines
3.5 KiB
Python

# from fastapi import APIRouter, Depends
# from sqlalchemy.ext.asyncio import AsyncSession
# from .database import async_session
# from . import crud, openrouter_client
# router = APIRouter()
# async def get_db():
# async with async_session() as db:
# yield db
# @router.get("/history/{telegram_id}")
# async def get_history(telegram_id: str, db: AsyncSession = Depends(get_db)):
# user = await crud.get_or_create_user(db, telegram_id)
# history = await crud.get_conversation(db, user, limit=20)
# return [{"role": m.role, "content": m.content} for m in history]
# @router.post("/chat/{telegram_id}")
# async def chat(telegram_id: str, payload: dict, db: AsyncSession = Depends(get_db)):
# user = await crud.get_or_create_user(db, telegram_id)
# user_msg = payload.get("message", "")
# if not user_msg:
# return {"error": "Empty message"}
# await crud.add_message(db, user, "user", user_msg)
# history = await crud.get_conversation(db, user, limit=10)
# messages_payload = [{"role": m.role, "content": m.content} for m in history]
# response = await openrouter_client.generate_response(messages_payload)
# await crud.add_message(db, user, "assistant", response)
# return {"response": response}
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from sqlalchemy.orm import selectinload
from app import models, schemas
from .database import async_session
router = APIRouter()
# --- Dependency ---
async def get_db() -> AsyncSession:
async with async_session() as db:
yield db
# 📌 Получить профиль пользователя (берём первого для примера)
@router.get("/profile", response_model=schemas.UserOut)
async def get_profile(db: AsyncSession = Depends(get_db)):
result = await db.execute(
select(models.User).options(
selectinload(models.User.chats).selectinload(models.Chat.messages)
)
)
user = result.scalars().first()
if not user:
raise HTTPException(status_code=404, detail="User not found")
return user
# 📌 Получить список чатов
@router.get("/chats", response_model=list[schemas.ChatOut])
async def get_chats(db: AsyncSession = Depends(get_db)):
result = await db.execute(
select(models.Chat).options(selectinload(models.Chat.messages))
)
return result.scalars().all()
# 📌 Сообщения конкретного чата
@router.get("/chats/{chat_id}/messages", response_model=list[schemas.MessageOut])
async def get_chat_messages(chat_id: int, db: AsyncSession = Depends(get_db)):
result = await db.execute(
select(models.Chat)
.options(selectinload(models.Chat.messages))
.filter_by(id=chat_id)
)
chat = result.scalars().first()
if not chat:
raise HTTPException(status_code=404, detail="Chat not found")
return chat.messages
# 📌 Добавить новое сообщение
@router.post("/chats/{chat_id}/messages", response_model=schemas.MessageOut)
async def add_message(chat_id: int, msg: schemas.MessageBase, db: AsyncSession = Depends(get_db)):
result = await db.execute(
select(models.Chat).filter_by(id=chat_id)
)
chat = result.scalars().first()
if not chat:
raise HTTPException(status_code=404, detail="Chat not found")
new_msg = models.Message(chat_id=chat_id, role=msg.role, content=msg.content)
db.add(new_msg)
await db.commit()
await db.refresh(new_msg)
return new_msg