74 lines
2.5 KiB
Python
74 lines
2.5 KiB
Python
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,
|
|
) |