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 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 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]: 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: 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) return AssetsResponse(assets=assets, 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: character = await dao.chars.get_character(character_id) return character @router.post("/{character_id}/_run", response_model=Asset) async def post_character_generation(character_id: str, generation: GenerationRequest, request: Request) -> GenerationResponse: generation_service = request.app.state.generation_service