from sqlalchemy.orm import Session from typing import List, Optional from app.models.quiz import Quiz from app.models.question import Question from app.schemas.quiz import QuizCreate, QuizUpdate def create_quiz(db: Session, quiz_data: QuizCreate) -> Quiz: """Create a new quiz.""" # Extract question_ids question_ids = quiz_data.question_ids quiz_dict = quiz_data.model_dump(exclude={"question_ids"}) # Create quiz db_quiz = Quiz(**quiz_dict) db.add(db_quiz) db.commit() # Add questions to quiz questions = db.query(Question).filter(Question.id.in_(question_ids)).all() db_quiz.questions = questions db.commit() db.refresh(db_quiz) return db_quiz def get_quiz(db: Session, quiz_id: int) -> Optional[Quiz]: """Get a quiz by ID.""" return db.query(Quiz).filter(Quiz.id == quiz_id).first() def get_quiz_with_questions(db: Session, quiz_id: int) -> Optional[Quiz]: """Get a quiz by ID with questions.""" return db.query(Quiz).filter(Quiz.id == quiz_id).first() def get_quizzes( db: Session, skip: int = 0, limit: int = 100, category_id: Optional[int] = None ) -> List[Quiz]: """Get all quizzes with optional filtering and pagination.""" query = db.query(Quiz) if category_id: query = query.filter(Quiz.category_id == category_id) return query.offset(skip).limit(limit).all() def update_quiz(db: Session, quiz_id: int, quiz_data: QuizUpdate) -> Optional[Quiz]: """Update an existing quiz.""" db_quiz = get_quiz(db, quiz_id) if not db_quiz: return None # Update quiz fields update_data = quiz_data.model_dump(exclude={"question_ids"}, exclude_unset=True) for key, value in update_data.items(): setattr(db_quiz, key, value) # Update questions if provided if quiz_data.question_ids is not None: questions = db.query(Question).filter(Question.id.in_(quiz_data.question_ids)).all() db_quiz.questions = questions db.commit() db.refresh(db_quiz) return db_quiz def delete_quiz(db: Session, quiz_id: int) -> bool: """Delete a quiz.""" db_quiz = get_quiz(db, quiz_id) if db_quiz: db.delete(db_quiz) db.commit() return True return False