from typing import List, Optional from aiogram.types import BufferedInputFile from fastapi import APIRouter, UploadFile, File, Form, Depends from fastapi.openapi.models import MediaType from starlette import status from starlette.exceptions import HTTPException from starlette.requests import Request from starlette.responses import Response, JSONResponse from api.models.AssetDTO import AssetsResponse, AssetResponse from models.Asset import Asset, AssetType from repos.dao import DAO from api.dependency import get_dao import logging logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/assets", tags=["Assets"]) @router.get("/{asset_id}") async def get_asset(asset_id: str, request: Request,dao: DAO = Depends(get_dao),) -> Response: logger.debug(f"get_asset called for ID: {asset_id}") asset = await dao.assets.get_asset(asset_id) # 2. Проверка на существование if not asset: raise HTTPException(status_code=404, detail="Asset not found") headers = { # Кэшировать на 1 год (31536000 сек) "Cache-Control": "public, max-age=31536000, immutable" } return Response(content=asset.data, media_type="image/png", headers=headers) @router.get("") async def get_assets(request: Request, dao: DAO = Depends(get_dao), limit: int = 10, offset: int = 0) -> AssetsResponse: logger.info(f"get_assets called. Limit: {limit}, Offset: {offset}") assets = await dao.assets.get_assets(limit, offset) # assets = await dao.assets.get_assets() # This line seemed redundant/conflicting in original code total_count = await dao.assets.get_asset_count() return AssetsResponse(assets=assets, total_count=total_count) @router.post("/upload", response_model=AssetResponse, status_code=status.HTTP_201_CREATED) async def upload_asset( file: UploadFile = File(...), linked_char_id: Optional[str] = Form(None), dao: DAO = Depends(get_dao), ): logger.info(f"upload_asset called. Filename: {file.filename}, ContentType: {file.content_type}, LinkedCharId: {linked_char_id}") if not file.content_type: raise HTTPException(status_code=400, detail="Unknown file type") if not file.content_type.startswith("image/"): raise HTTPException(status_code=400, detail=f"Unsupported content type: {file.content_type}") data = await file.read() if not data: raise HTTPException(status_code=400, detail="Empty file") asset = Asset( name=file.filename or "upload", type=AssetType.IMAGE, linked_char_id=linked_char_id, data=data, ) asset_id = await dao.assets.create_asset(asset) asset.id = str(asset_id) logger.info(f"Asset created successfully. ID: {asset_id}") return AssetResponse( id=asset.id, name=asset.name, type=asset.type.value if hasattr(asset.type, "value") else asset.type, linked_char_id=asset.linked_char_id, created_at=asset.created_at, )