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 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: 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: assets = await dao.assets.get_assets(limit, offset) assets = await dao.assets.get_assets() 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), ): 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) 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, )