import random from dependency_injector.wiring import inject, Provide from fastapi import APIRouter, Path, Query, Depends, BackgroundTasks from app.middlewares import Authorized, IsAuthenticatedViaBearerToken from app.configs.constants import EducationalContent from app.controllers.abc import ISpeakingController from app.dtos import SaveSpeakingDTO, SpeakingGenerateVideoDTO, SpeakingGenerateInteractiveVideoDTO controller = "speaking_controller" speaking_router = APIRouter() @speaking_router.get( '/{task}', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def get_speaking_task( task: int = Path(..., ge=1, le=3), topic: str = Query(default=random.choice(EducationalContent.MTI_TOPICS)), difficulty: str = Query(default=random.choice(EducationalContent.DIFFICULTIES)), speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.get_speaking_task(task, topic, difficulty) @speaking_router.post( '/', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def save_speaking( data: SaveSpeakingDTO, background_tasks: BackgroundTasks, speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.save_speaking(data, background_tasks) @speaking_router.post( '/generate_speaking_video', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def generate_speaking_video( data: SpeakingGenerateVideoDTO, speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.generate_speaking_video(data) @speaking_router.post( '/generate_interactive_video', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def generate_interactive_video( data: SpeakingGenerateInteractiveVideoDTO, speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.generate_interactive_video(data)