Files
matrix-show/backend/app/routes/chat.py
T
2026-06-04 17:59:53 +08:00

79 lines
2.4 KiB
Python

from fastapi import APIRouter, Depends
from sqlalchemy import select, func
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.database import get_session
from app.models.orm import Message, Character
from app.models.schemas import MessageCreate, MessageResponse
router = APIRouter()
@router.get("/messages", response_model=list[MessageResponse])
async def list_messages(
session: AsyncSession = Depends(get_session),
):
result = await session.execute(
select(Message).order_by(Message.created_at.asc())
)
messages = list(result.scalars().all())
return [
MessageResponse(
id=m.id,
session_id=m.session_id,
character_id=m.character_id,
game_phase=m.game_phase,
msg_type=m.msg_type,
content=m.content,
target_character_id=m.target_character_id,
clue_id=m.clue_id,
metadata=m.metadata or {},
created_at=m.created_at,
character_name=m.character.name if m.character else None,
character_role=m.character.role if m.character else None,
)
for m in messages
]
@router.post("/messages", response_model=MessageResponse)
async def create_message(
req: MessageCreate,
session: AsyncSession = Depends(get_session),
):
message = Message(
session_id=req.session_id,
character_id=req.character_id,
game_phase=req.game_phase,
msg_type=req.msg_type,
content=req.content,
target_character_id=req.target_character_id,
)
session.add(message)
await session.commit()
await session.refresh(message)
char_name = None
char_role = None
if message.character_id:
result = await session.execute(select(Character).where(Character.id == message.character_id))
char = result.scalars().first()
if char:
char_name = char.name
char_role = char.role
return MessageResponse(
id=message.id,
session_id=message.session_id,
character_id=message.character_id,
game_phase=message.game_phase,
msg_type=message.msg_type,
content=message.content,
target_character_id=message.target_character_id,
clue_id=message.clue_id,
metadata=message.metadata or {},
created_at=message.created_at,
character_name=char_name,
character_role=char_role,
)