57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
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__)
|
|
|
|
from api.endpoints.auth import get_current_user
|
|
|
|
router = APIRouter(prefix="/api/characters", tags=["Characters"], dependencies=[Depends(get_current_user)])
|
|
|
|
|
|
@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
|