This commit is contained in:
xds
2026-02-06 14:07:10 +03:00
parent 37e69088a1
commit cdb09e84fc
20 changed files with 470 additions and 30 deletions

View File

@@ -11,6 +11,9 @@ from repos.dao import DAO
from aiogram import Bot
from adapters.s3_adapter import S3Adapter
from typing import Optional
# Провайдеры "сырых" клиентов из состояния приложения
def get_mongo_client(request: Request) -> AsyncIOMotorClient:
return request.app.state.mongo_client
@@ -21,11 +24,17 @@ def get_gemini_client(request: Request) -> GoogleAdapter:
def get_bot_client(request: Request) -> Bot:
return request.app.state.bot
def get_s3_adapter(request: Request) -> Optional[S3Adapter]:
return getattr(request.app.state, "s3_adapter", None)
# Провайдер DAO (собирается из mongo_client)
def get_dao(mongo_client: AsyncIOMotorClient = Depends(get_mongo_client)) -> DAO:
def get_dao(
mongo_client: AsyncIOMotorClient = Depends(get_mongo_client),
s3_adapter: Optional[S3Adapter] = Depends(get_s3_adapter)
) -> DAO:
# FastAPI кэширует результат Depends в рамках одного запроса,
# так что DAO создастся один раз за запрос.
return DAO(mongo_client)
return DAO(mongo_client, s3_adapter)
# Провайдер сервиса (собирается из DAO и Gemini)
def get_generation_service(

View File

@@ -156,4 +156,15 @@ async def regenerate_thumbnails(dao: DAO = Depends(get_dao)):
logger.error(f"Failed to regenerate thumbnail for asset {asset.id}: {e}")
count += 1
return {"status": "completed", "processed": count, "updated": updated}
return {"status": "completed", "processed": count, "updated": updated}
@router.post("/migrate_to_minio")
async def migrate_to_minio(dao: DAO = Depends(get_dao)):
"""
Migrates assets from MongoDB to MinIO.
"""
logger.info("Starting migration to MinIO")
result = await dao.assets.migrate_to_minio()
logger.info(f"Migration result: {result}")
return result