from typing import List from repositories import QuizRepository from schemas import QuizGetSchema from schemas.requests import QuizCreateSchema from schemas.response import UserQuizListResponse from exception import DataNotFoundException from mapper import map_quiz_entity_to_schema from exception import ValidationException class QuizService: def __init__(self, quiz_repository=QuizRepository): self.quiz_repository = quiz_repository def get_quiz(self, quiz_id) -> QuizGetSchema: data = self.quiz_repository.get_by_id(quiz_id) if data is None: raise DataNotFoundException("Quiz not found") return map_quiz_entity_to_schema(data) def get_user_quiz( self, user_id: str, page: int = 1, page_size: int = 10 ) -> UserQuizListResponse: quizzes = self.quiz_repository.get_by_user_id(user_id, page, page_size) total_user_quiz = self.quiz_repository.count_by_user_id(user_id) return UserQuizListResponse( total=total_user_quiz, quizzes=[map_quiz_entity_to_schema(quiz) for quiz in quizzes], ) def create_quiz(self, quiz_data: QuizCreateSchema): for question in quiz_data.question_listings: if question.type == "option" and ( not question.options or len(question.options) != 4 ): raise ValidationException( "Option type questions must have exactly 4 options." ) return self.quiz_repository.create(quiz_data) def update_quiz(self, quiz_id, quiz_data): return self.quiz_repository.update(quiz_id, quiz_data) def delete_quiz(self, quiz_id): return self.quiz_repository.delete(quiz_id) def quiz_recommendation(self): data = self.quiz_repository if data is None: raise DataNotFoundException("Quiz not found") return map_quiz_entity_to_schema(data)