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, )