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.speaking import ( SaveSpeakingDTO, GenerateVideo1DTO, GenerateVideo2DTO, GenerateVideo3DTO ) controller = "speaking_controller" speaking_router = APIRouter() @speaking_router.get( '/1', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def get_speaking_task( first_topic: str = Query(default=random.choice(EducationalContent.MTI_TOPICS)), second_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_part(1, first_topic, difficulty, second_topic) @speaking_router.get( '/{task}', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def get_speaking_task( task: int = Path(..., ge=2, 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_part(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_video/1', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def generate_video_1( data: GenerateVideo1DTO, speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.generate_video( 1, data.avatar, data.first_topic, data.questions, second_topic=data.second_topic ) @speaking_router.post( '/generate_video/2', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def generate_video_2( data: GenerateVideo2DTO, speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.generate_video( 2, data.avatar, data.topic, [data.question], prompts=data.prompts, suffix=data.suffix ) @speaking_router.post( '/generate_video/3', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def generate_video_3( data: GenerateVideo3DTO, speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.generate_video( 3, data.avatar, data.topic, data.questions )