from typing import List, Any, Coroutine from fastapi import APIRouter, Depends from pydantic import BaseModel from starlette.exceptions import HTTPException from starlette.requests import Request from api.models.AssetDTO import AssetsResponse, AssetResponse from api.models.GenerationRequest import GenerationRequest, GenerationResponse from models.Asset import Asset from models.Character import Character from repos.dao import DAO from api.dependency import get_dao import logging logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/characters", tags=["Characters"]) @router.get("/", response_model=List[Character]) async def get_characters(request: Request, dao: DAO = Depends(get_dao), ) -> List[Character]: logger.info("get_characters called") characters = await dao.chars.get_all_characters() return characters @router.get("/{character_id}/assets", response_model=AssetsResponse) async def get_character_assets(character_id: str, dao: DAO = Depends(get_dao), limit: int = 10, offset: int = 0, ) -> AssetsResponse: logger.info(f"get_character_assets called. CharacterID: {character_id}, Limit: {limit}, Offset: {offset}") character = await dao.chars.get_character(character_id) if character is None: raise HTTPException(status_code=404, detail="Character not found") assets = await dao.assets.get_assets_by_char_id(character_id, limit, offset) total_count = await dao.assets.get_asset_count(character_id) asset_responses = [AssetResponse.model_validate(a.model_dump()) for a in assets] return AssetsResponse(assets=asset_responses, total_count=total_count) @router.get("/{character_id}", response_model=Character) async def get_character_by_id(character_id: str, request: Request, dao: DAO = Depends(get_dao)) -> Character: logger.debug(f"get_character_by_id called. ID: {character_id}") character = await dao.chars.get_character(character_id) return character @router.post("/{character_id}/_run", response_model=GenerationResponse) async def post_character_generation(character_id: str, generation: GenerationRequest, request: Request) -> GenerationResponse: logger.info(f"post_character_generation called. CharacterID: {character_id}") generation_service = request.app.state.generation_service