from sqlalchemy import select, delete from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from models.library import LibraryFile, LibraryFileQuestion from schemas.library import LibraryFileRequest, LibraryFileResponse, QuestionResponse async def list_files(db: AsyncSession) -> list[LibraryFileResponse]: stmt = select(LibraryFile).order_by(LibraryFile.create_time.desc()) files = (await db.execute(stmt)).scalars().all() return [ LibraryFileResponse( id=file.id, subject=file.subject, module=file.module, name=file.name, type=file.type, size=file.size, content=file.content, uploadTime=file.create_time.strftime("%Y-%m-%d %H:%M:%S"), questions=[], ) for file in files ] async def add_file(db: AsyncSession, data: LibraryFileRequest) -> bool: """ 创建题库文件及其题目 """ file = LibraryFile( subject=data.subject, module=data.module, name=data.name, size=data.size, type=data.type, content=data.content, ) db.add(file) await db.flush() for q in data.questions: question = LibraryFileQuestion( library_file_id=file.id, type=q.type, question=q.question, options=q.options, answer=q.answer ) db.add(question) await db.commit() return True async def edit_file(db: AsyncSession, file_id: int, data: LibraryFileRequest) -> bool: """ 编辑题库文件及其题目 """ result = await db.execute( select(LibraryFile).where(LibraryFile.id == file_id) ) file = result.scalar_one_or_none() if not file: return False file.subject = data.subject file.module = data.module file.name = data.name file.size = data.size file.type = data.type file.content = data.content await db.execute( delete(LibraryFileQuestion) .where(LibraryFileQuestion.library_file_id == file.id) ) # 4. 插入新题目 for q in data.questions: question = LibraryFileQuestion( library_file_id=file.id, type=q.type, question=q.question, options=q.options, answer=q.answer, ) db.add(question) await db.commit() return True async def get_file(db: AsyncSession, file_id: int) -> LibraryFileResponse: stmt = ( select(LibraryFile) .options(selectinload(LibraryFile.questions)) .where(LibraryFile.id == file_id) ) result = await db.execute(stmt) file = result.scalar_one_or_none() return LibraryFileResponse( id=file.id, subject=file.subject, module=file.module, name=file.name, type=file.type, size=file.size, content=file.content, uploadTime=file.create_time.strftime("%Y-%m-%d %H:%M:%S"), questions=[ QuestionResponse( id=q.id, type=q.type, question=q.question, options=q.options, answer=q.answer ) for q in file.questions ], )