86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
from sqlalchemy import select
|
|
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 add_file(db: AsyncSession, data: LibraryFileRequest) -> bool:
|
|
"""
|
|
创建题库文件及其题目
|
|
"""
|
|
file = LibraryFile(
|
|
subject=data.subject,
|
|
module=data.module,
|
|
name=data.name,
|
|
size=data.size,
|
|
type=data.type
|
|
)
|
|
|
|
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 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,
|
|
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
|
|
],
|
|
)
|
|
|
|
|
|
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=f.id,
|
|
subject=f.subject,
|
|
module=f.module,
|
|
name=f.name,
|
|
type=f.type,
|
|
size=f.size,
|
|
uploadTime=f.create_time.strftime("%Y-%m-%d %H:%M:%S"),
|
|
questions=[],
|
|
)
|
|
for f in files
|
|
]
|