feat: Add pagination with total count to generation listings and enable filtering assets by type.
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -66,9 +66,9 @@ async def delete_asset(
|
|||||||
|
|
||||||
|
|
||||||
@router.get("")
|
@router.get("")
|
||||||
async def get_assets(request: Request, dao: DAO = Depends(get_dao), limit: int = 10, offset: int = 0) -> AssetsResponse:
|
async def get_assets(request: Request, dao: DAO = Depends(get_dao), type: Optional[str] = None, limit: int = 10, offset: int = 0) -> AssetsResponse:
|
||||||
logger.info(f"get_assets called. Limit: {limit}, Offset: {offset}")
|
logger.info(f"get_assets called. Limit: {limit}, Offset: {offset}")
|
||||||
assets = await dao.assets.get_assets(limit, offset)
|
assets = await dao.assets.get_assets(type, limit, offset)
|
||||||
# assets = await dao.assets.get_assets() # This line seemed redundant/conflicting in original code
|
# assets = await dao.assets.get_assets() # This line seemed redundant/conflicting in original code
|
||||||
total_count = await dao.assets.get_asset_count()
|
total_count = await dao.assets.get_asset_count()
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from starlette.requests import Request
|
|||||||
from api import service
|
from api import service
|
||||||
from api.dependency import get_generation_service
|
from api.dependency import get_generation_service
|
||||||
|
|
||||||
from api.models.GenerationRequest import GenerationResponse, GenerationRequest, PromptResponse, PromptRequest
|
from api.models.GenerationRequest import GenerationResponse, GenerationRequest, GenerationsResponse, PromptResponse, PromptRequest
|
||||||
from api.service.generation_service import GenerationService
|
from api.service.generation_service import GenerationService
|
||||||
from models.Generation import Generation
|
from models.Generation import Generation
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ async def prompt_from_image(
|
|||||||
return PromptResponse(prompt=generated_prompt)
|
return PromptResponse(prompt=generated_prompt)
|
||||||
|
|
||||||
|
|
||||||
@router.get("", response_model=List[GenerationResponse])
|
@router.get("", response_model=GenerationsResponse)
|
||||||
async def get_generations(character_id: Optional[str] = None, limit: int = 10, offset: int = 0,
|
async def get_generations(character_id: Optional[str] = None, limit: int = 10, offset: int = 0,
|
||||||
generation_service: GenerationService = Depends(get_generation_service)):
|
generation_service: GenerationService = Depends(get_generation_service)):
|
||||||
logger.info(f"get_generations called. CharacterId: {character_id}, Limit: {limit}, Offset: {offset}")
|
logger.info(f"get_generations called. CharacterId: {character_id}, Limit: {limit}, Offset: {offset}")
|
||||||
|
|||||||
@@ -18,6 +18,11 @@ class GenerationRequest(BaseModel):
|
|||||||
assets_list: List[str]
|
assets_list: List[str]
|
||||||
|
|
||||||
|
|
||||||
|
class GenerationsResponse(BaseModel):
|
||||||
|
generations: List["GenerationResponse"]
|
||||||
|
total_count: int
|
||||||
|
|
||||||
|
|
||||||
class GenerationResponse(BaseModel):
|
class GenerationResponse(BaseModel):
|
||||||
id: str
|
id: str
|
||||||
status: GenerationStatus
|
status: GenerationStatus
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -9,7 +9,7 @@ from aiogram import Bot
|
|||||||
from aiogram.types import BufferedInputFile
|
from aiogram.types import BufferedInputFile
|
||||||
from adapters.Exception import GoogleGenerationException
|
from adapters.Exception import GoogleGenerationException
|
||||||
from adapters.google_adapter import GoogleAdapter
|
from adapters.google_adapter import GoogleAdapter
|
||||||
from api.models.GenerationRequest import GenerationRequest, GenerationResponse
|
from api.models.GenerationRequest import GenerationRequest, GenerationResponse, GenerationsResponse
|
||||||
# Импортируйте ваши модели DAO, Asset, Generation корректно
|
# Импортируйте ваши модели DAO, Asset, Generation корректно
|
||||||
from models.Asset import Asset, AssetType, AssetContentType
|
from models.Asset import Asset, AssetType, AssetContentType
|
||||||
from models.Generation import Generation, GenerationStatus
|
from models.Generation import Generation, GenerationStatus
|
||||||
@@ -94,7 +94,10 @@ class GenerationService:
|
|||||||
|
|
||||||
async def get_generations(self, character_id: Optional[str] = None, limit: int = 10, offset: int = 0) -> List[
|
async def get_generations(self, character_id: Optional[str] = None, limit: int = 10, offset: int = 0) -> List[
|
||||||
Generation]:
|
Generation]:
|
||||||
return await self.dao.generations.get_generations(character_id = character_id,limit=limit, offset=offset)
|
generations = await self.dao.generations.get_generations(character_id = character_id,limit=limit, offset=offset)
|
||||||
|
total_count = await self.dao.generations.count_generations(character_id = character_id)
|
||||||
|
generations = [GenerationResponse(**gen.model_dump()) for gen in generations]
|
||||||
|
return GenerationsResponse(generations=generations, total_count=total_count)
|
||||||
|
|
||||||
async def get_generation(self, generation_id: str) -> Optional[GenerationResponse]:
|
async def get_generation(self, generation_id: str) -> Optional[GenerationResponse]:
|
||||||
gen = await self.dao.generations.get_generation(generation_id)
|
gen = await self.dao.generations.get_generation(generation_id)
|
||||||
|
|||||||
4
main.py
4
main.py
@@ -51,7 +51,8 @@ ADMIN_ID = int(os.getenv("ADMIN_ID", 0))
|
|||||||
|
|
||||||
def setup_logging():
|
def setup_logging():
|
||||||
logging.basicConfig(level=logging.INFO,
|
logging.basicConfig(level=logging.INFO,
|
||||||
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s")
|
format="%(asctime)s [%(levelname)s] %(name)s (%(filename)s:%(lineno)d): %(message)s",
|
||||||
|
force=True)
|
||||||
|
|
||||||
|
|
||||||
# --- ИНИЦИАЛИЗАЦИЯ ЗАВИСИМОСТЕЙ ---
|
# --- ИНИЦИАЛИЗАЦИЯ ЗАВИСИМОСТЕЙ ---
|
||||||
@@ -115,6 +116,7 @@ gen_router.message.middleware(AlbumMiddleware(latency=0.8))
|
|||||||
@asynccontextmanager
|
@asynccontextmanager
|
||||||
async def lifespan(app: FastAPI):
|
async def lifespan(app: FastAPI):
|
||||||
# --- STARTUP ---
|
# --- STARTUP ---
|
||||||
|
setup_logging()
|
||||||
print("🚀 Starting up...")
|
print("🚀 Starting up...")
|
||||||
|
|
||||||
# 1. Настройка DAO для FastAPI
|
# 1. Настройка DAO для FastAPI
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -46,7 +46,10 @@ class AssetsRepo:
|
|||||||
res = await self.collection.insert_one(asset.model_dump())
|
res = await self.collection.insert_one(asset.model_dump())
|
||||||
return str(res.inserted_id)
|
return str(res.inserted_id)
|
||||||
|
|
||||||
async def get_assets(self, limit: int = 10, offset: int = 0, with_data: bool = False) -> List[Asset]:
|
async def get_assets(self, asset_type: Optional[str] = None, limit: int = 10, offset: int = 0, with_data: bool = False) -> List[Asset]:
|
||||||
|
filter = {}
|
||||||
|
if asset_type:
|
||||||
|
filter["type"] = asset_type
|
||||||
args = {}
|
args = {}
|
||||||
if not with_data:
|
if not with_data:
|
||||||
args["data"] = 0
|
args["data"] = 0
|
||||||
@@ -68,7 +71,7 @@ class AssetsRepo:
|
|||||||
# So list DOES NOT return thumbnails by default.
|
# So list DOES NOT return thumbnails by default.
|
||||||
args["thumbnail"] = 0
|
args["thumbnail"] = 0
|
||||||
|
|
||||||
res = await self.collection.find({}, args).sort("created_at", -1).skip(offset).limit(limit).to_list(None)
|
res = await self.collection.find(filter, args).sort("created_at", -1).skip(offset).limit(limit).to_list(None)
|
||||||
assets = []
|
assets = []
|
||||||
for doc in res:
|
for doc in res:
|
||||||
doc["id"] = str(doc.pop("_id"))
|
doc["id"] = str(doc.pop("_id"))
|
||||||
|
|||||||
@@ -39,5 +39,13 @@ class GenerationRepo:
|
|||||||
generations.append(Generation(**generation))
|
generations.append(Generation(**generation))
|
||||||
return generations
|
return generations
|
||||||
|
|
||||||
|
async def count_generations(self, character_id: Optional[str] = None, status: Optional[GenerationStatus] = None) -> int:
|
||||||
|
args = {}
|
||||||
|
if character_id is not None:
|
||||||
|
args["linked_character_id"] = character_id
|
||||||
|
if status is not None:
|
||||||
|
args["status"] = status
|
||||||
|
return await self.collection.count_documents(args)
|
||||||
|
|
||||||
async def update_generation(self, generation: Generation, ):
|
async def update_generation(self, generation: Generation, ):
|
||||||
res = await self.collection.update_one({"_id": ObjectId(generation.id)}, {"$set": generation.model_dump()})
|
res = await self.collection.update_one({"_id": ObjectId(generation.id)}, {"$set": generation.model_dump()})
|
||||||
|
|||||||
Reference in New Issue
Block a user