import random from typing import Optional from dependency_injector.wiring import Provide, inject from fastapi import APIRouter, Depends, Path, Query, UploadFile from ielts_be.configs.constants import EducationalContent from ielts_be.dtos.reading import ReadingDTO from ielts_be.middlewares import Authorized, IsAuthenticatedViaBearerToken from ielts_be.controllers import IReadingController controller = "reading_controller" reading_router = APIRouter() @reading_router.post( '/import', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def upload( exercises: UploadFile, solutions: UploadFile = None, reading_controller: IReadingController = Depends(Provide[controller]) ): return await reading_controller.import_exam(exercises, solutions) @reading_router.get( '/{passage}', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def generate_passage( topic: Optional[str] = Query(None), word_count: Optional[int] = Query(None), passage: int = Path(..., ge=1, le=3), reading_controller: IReadingController = Depends(Provide[controller]) ): topic = random.choice(EducationalContent.TOPICS) if not topic else topic return await reading_controller.generate_reading_passage(passage, topic, word_count) @reading_router.post( '/', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def generate_reading( dto: ReadingDTO, reading_controller: IReadingController = Depends(Provide[controller]) ): return await reading_controller.generate_reading_exercises(dto)