import random from typing import Optional from dependency_injector.wiring import Provide, inject from fastapi import APIRouter, Depends, Path, Query, UploadFile from app.configs.constants import EducationalContent from app.dtos.reading import ReadingDTO from app.middlewares import Authorized, IsAuthenticatedViaBearerToken from app.controllers.abc 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)