79 lines
2.4 KiB
Python
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,
|
|
)
|