Files
ai-char-bot/api/dependency.py

56 lines
2.0 KiB
Python

# dependency.py
from fastapi import Request, Depends
from motor.motor_asyncio import AsyncIOMotorClient
from adapters.google_adapter import GoogleAdapter
from adapters.kling_adapter import KlingAdapter
from api.service.generation_service import GenerationService
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
def get_gemini_client(request: Request) -> GoogleAdapter:
return request.app.state.gemini_client
def get_bot_client(request: Request) -> Bot:
return request.app.state.bot
def get_s3_adapter(request: Request) -> Optional[S3Adapter]:
return request.app.state.s3_adapter
# Провайдер DAO (собирается из mongo_client)
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, s3_adapter)
def get_kling_adapter(request: Request) -> Optional[KlingAdapter]:
return request.app.state.kling_adapter
# Провайдер сервиса (собирается из DAO и Gemini)
def get_generation_service(
dao: DAO = Depends(get_dao),
gemini: GoogleAdapter = Depends(get_gemini_client),
s3_adapter: S3Adapter = Depends(get_s3_adapter),
bot: Bot = Depends(get_bot_client),
kling_adapter: Optional[KlingAdapter] = Depends(get_kling_adapter),
) -> GenerationService:
return GenerationService(dao, gemini, s3_adapter, bot, kling_adapter=kling_adapter)
from fastapi import Header
async def get_project_id(x_project_id: Optional[str] = Header(None, alias="X-Project-ID")) -> Optional[str]:
return x_project_id