diff --git a/app/blueprints/quiz.py b/app/blueprints/quiz.py index 44f953f..31f4b5c 100644 --- a/app/blueprints/quiz.py +++ b/app/blueprints/quiz.py @@ -65,6 +65,10 @@ def get_user_quiz( @inject def search_quiz(controller: QuizController = Provide[Container.quiz_controller]): keyword = request.args.get("keyword", "") + subject_id = request.args.get("subject_id") page = int(request.args.get("page", 1)) limit = int(request.args.get("limit", 10)) - return controller.search_quiz(keyword=keyword, page=page, limit=limit) + + return controller.search_quiz( + keyword=keyword, subject_id=subject_id, page=page, limit=limit + ) diff --git a/app/controllers/quiz_controller.py b/app/controllers/quiz_controller.py index 0daf1bf..f6630cf 100644 --- a/app/controllers/quiz_controller.py +++ b/app/controllers/quiz_controller.py @@ -107,9 +107,11 @@ class QuizController: except Exception as e: return make_error_response(e) - def search_quiz(self, keyword: str, page: int, limit: int): + def search_quiz(self, keyword: str, subject_id: str, page: int, limit: int): try: - quiz, total = self.quiz_service.search_quiz(keyword, page, limit) + quiz, total = self.quiz_service.search_quiz( + keyword, subject_id, page, limit + ) return make_response( message="success", data=quiz, diff --git a/app/repositories/quiz_repositroy.py b/app/repositories/quiz_repositroy.py index bf0f6c6..06dd7a9 100644 --- a/app/repositories/quiz_repositroy.py +++ b/app/repositories/quiz_repositroy.py @@ -51,25 +51,25 @@ class QuizRepository: # return [QuizEntity(**doc) for doc in cursor] def search_by_title_or_category( - self, keyword: str, page: int, page_size: int + self, keyword: str, subject_id: Optional[str], page: int, page_size: int ) -> List[QuizEntity]: skip = (page - 1) * page_size + + query_conditions = [ + {"is_public": True}, + { + "$or": [ + {"title": {"$regex": keyword, "$options": "i"}}, + # {"category": {"$regex": keyword, "$options": "i"}}, + ] + }, + ] + + if subject_id: + query_conditions.append({"subject_id": subject_id}) + cursor = ( - self.collection.find( - { - "$and": [ - {"is_public": True}, - { - "$or": [ - {"title": {"$regex": keyword, "$options": "i"}}, - # {"category": {"$regex": keyword, "$options": "i"}}, - ] - }, - ] - } - ) - .skip(skip) - .limit(page_size) + self.collection.find({"$and": query_conditions}).skip(skip).limit(page_size) ) return [QuizEntity(**doc) for doc in cursor] diff --git a/app/services/quiz_service.py b/app/services/quiz_service.py index efdd55a..411dc83 100644 --- a/app/services/quiz_service.py +++ b/app/services/quiz_service.py @@ -27,11 +27,14 @@ class QuizService: return QuizMapper.map_quiz_entity_to_schema(data, quiz_subject) def search_quiz( - self, keyword: str, page: int = 1, page_size: int = 10 + self, keyword: str, subject_id: str, page: int = 1, page_size: int = 10 ) -> tuple[list[ListingQuizResponse], int]: quizzes = self.quiz_repository.search_by_title_or_category( - keyword, page, page_size + keyword=keyword, + page=page, + page_size=page_size, + subject_id=subject_id, ) total = self.quiz_repository.count_by_search(keyword) mapped_quizzes = [] @@ -56,7 +59,7 @@ class QuizService: return UserQuizListResponse(total=0, quizzes=[]) total_user_quiz = self.quiz_repository.count_by_user_id(user_id) - + print(total_user_quiz) user = self.user_repostory.get_user_by_id(user_id)