diff --git a/app/blueprints/quiz.py b/app/blueprints/quiz.py index e5a1b4a..4e2ca9c 100644 --- a/app/blueprints/quiz.py +++ b/app/blueprints/quiz.py @@ -63,7 +63,12 @@ def get_quiz_populer( ): page = request.args.get("page") limit = request.args.get("limit") - return controller.get_quiz_populer(page=page, limit=limit) + lang_code = request.args.get("lang_code") or "id" + return controller.get_quiz_populer( + page=page, + limit=limit, + lang_code=lang_code, + ) @quiz_bp.route("/recommendation", methods=["GET"]) @@ -74,7 +79,13 @@ def get_quiz_recommendation( user_id = request.args.get("user_id") page = request.args.get("page") limit = request.args.get("limit") - return controller.get_quiz_recommendation(user_id=user_id, page=page, limit=limit) + lang_code = request.args.get("lang_code") or "id" + return controller.get_quiz_recommendation( + user_id=user_id, + page=page, + limit=limit, + lang_code=lang_code, + ) @quiz_bp.route("/user/", methods=["GET"]) @@ -94,6 +105,7 @@ def search_quiz(controller: QuizController = Provide[Container.quiz_controller]) subject_id = request.args.get("subject_id") page = int(request.args.get("page", 1)) limit = int(request.args.get("limit", 10)) + lang_code = request.args.get("lang_code") or "id" 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 2fa7ade..8be95b8 100644 --- a/app/controllers/quiz_controller.py +++ b/app/controllers/quiz_controller.py @@ -94,11 +94,15 @@ class QuizController: except Exception as e: return make_error_response(e) - def get_quiz_populer(self, page, limit): + def get_quiz_populer(self, page, limit, lang_code): try: page = int(page) if page is not None else 1 limit = int(limit) if limit is not None else 3 - result = self.quiz_service.get_quiz_populer(page=page, limit=limit) + result = self.quiz_service.get_quiz_populer( + page=page, + limit=limit, + lang_code=lang_code, + ) return make_response(message="success retrieve populer quiz", data=result) except DataNotFoundException as e: return make_response(message=e.message, status_code=e.status_code) @@ -111,14 +115,16 @@ class QuizController: except Exception as e: return make_error_response(e) - def get_quiz_recommendation(self, user_id, page, limit): + def get_quiz_recommendation(self, user_id, page, limit, lang_code): try: page = int(page) if page is not None else 1 limit = int(limit) if limit is not None else 3 + result = self.quiz_service.get_quiz_recommendation( user_id=user_id, page=page, limit=limit, + lang_code=lang_code, ) return make_response(message="success retrieve populer quiz", data=result) except DataNotFoundException as e: diff --git a/app/mapper/quiz_mapper.py b/app/mapper/quiz_mapper.py index 2692d7a..118ada4 100644 --- a/app/mapper/quiz_mapper.py +++ b/app/mapper/quiz_mapper.py @@ -67,6 +67,7 @@ class QuizMapper: description=schema.description, is_public=schema.is_public, date=datetime, + language_code=schema.lang_code, total_quiz=len(schema.question_listings), limit_duration=total_duration, question_listings=[ diff --git a/app/repositories/answer_generation_repository.py b/app/repositories/answer_generation_repository.py index 7051935..fd836f5 100644 --- a/app/repositories/answer_generation_repository.py +++ b/app/repositories/answer_generation_repository.py @@ -7,6 +7,7 @@ from tensorflow.keras.preprocessing.text import tokenizer_from_json # type: ign import re + class AnswerGenerationRepository: MODEL_PATH = "app/lstm_model/question_generation/qa_lstm_model_final_v2.keras" TOKENIZER_PATH = "app/lstm_model/question_generation/qa_tokenizers_v2.json" diff --git a/app/repositories/quiz_repositroy.py b/app/repositories/quiz_repositroy.py index 2c24b3b..2983bcd 100644 --- a/app/repositories/quiz_repositroy.py +++ b/app/repositories/quiz_repositroy.py @@ -98,30 +98,57 @@ class QuizRepository: return self.collection.count_documents({"author_id": user_id}) def get_top_played_quizzes( - self, page: int = 1, limit: int = 3, is_public: bool = True + self, + page: int = 1, + limit: int = 3, + is_public: bool = True, + lang_code: str = "id", ) -> List[QuizEntity]: skip = (page - 1) * limit cursor = ( - self.collection.find({"is_public": is_public}) + self.collection.find( + { + "is_public": is_public, + "language_code": lang_code, + } + ) .sort("total_user_playing", -1) .skip(skip) .limit(limit) ) return [QuizEntity(**doc) for doc in cursor] - def get_random_quizzes(self, limit: int = 3) -> List[QuizEntity]: + def get_random_quizzes( + self, + limit: int = 3, + lang_code: str = "id", + ) -> List[QuizEntity]: pipeline = [ - {"$match": {"is_public": True}}, + { + "$match": { + "is_public": True, + "language_code": lang_code, + } + }, {"$sample": {"size": limit}}, ] cursor = self.collection.aggregate(pipeline) return [QuizEntity(**doc) for doc in cursor] def get_random_quizzes_by_subjects( - self, subject_ids: List[str], limit: int = 3 + self, + subject_ids: List[str], + limit: int = 3, + lang_code: str = "id", ) -> List[QuizEntity]: pipeline = [ - {"$match": {"subject_id": {"$in": subject_ids}, "is_public": True}}, + { + "$match": { + "subject_id": {"$in": subject_ids}, + "is_public": True, + "language_code": lang_code, + } + }, {"$sample": {"size": limit}}, ] cursor = self.collection.aggregate(pipeline) diff --git a/app/schemas/requests/quiz/create_quiz_schema.py b/app/schemas/requests/quiz/create_quiz_schema.py index 7193c0e..c571507 100644 --- a/app/schemas/requests/quiz/create_quiz_schema.py +++ b/app/schemas/requests/quiz/create_quiz_schema.py @@ -7,6 +7,7 @@ from .quiz_item_schema import QuestionItemSchema class QuizCreateSchema(BaseModel): title: str description: Optional[str] = None + lang_code: str = "id" is_public: bool = False subject_id: str author_id: Optional[str] = None diff --git a/app/services/quiz_service.py b/app/services/quiz_service.py index 0745440..c0b31ca 100644 --- a/app/services/quiz_service.py +++ b/app/services/quiz_service.py @@ -14,8 +14,6 @@ from app.exception import DataNotFoundException, ValidationException from app.mapper import QuizMapper from app.helpers import DatetimeUtil -from flask import current_app - class QuizService: def __init__( @@ -105,9 +103,14 @@ class QuizService: def delete_quiz(self, quiz_id): return self.quiz_repository.delete(quiz_id) - def get_quiz_populer(self, page: int, limit: int): + def get_quiz_populer(self, page: int, limit: int, lang_code: str): + + data = self.quiz_repository.get_top_played_quizzes( + page=page, + limit=limit, + lang_code=lang_code, + ) - data = self.quiz_repository.get_top_played_quizzes(page=page, limit=limit) if not data: raise DataNotFoundException("Quiz not found") @@ -122,25 +125,36 @@ class QuizService: ) return result - def get_quiz_recommendation(self, user_id: str, page: int, limit: int): - if not user_id: - quiz_data = self.quiz_repository.get_random_quizzes(limit=limit) - else: + def get_quiz_recommendation( + self, + user_id: str, + page: int, + limit: int, + lang_code: str, + ): + quiz_data = [] + + if user_id: user_answer = self.answer_repository.get_by_user(user_id=user_id) - if not user_answer: - return [] + if user_answer: + quiz_ids = list({answer.quiz_id for answer in user_answer}) + quiz_work = self.quiz_repository.get_by_ids(quiz_ids) - quiz_ids = list({answer.quiz_id for answer in user_answer}) - quiz_work = self.quiz_repository.get_by_ids(quiz_ids) + if quiz_work: + quiz_subjects = list({quiz.subject_id for quiz in quiz_work}) - if not quiz_work: - return [] + if quiz_subjects: + quiz_data = self.quiz_repository.get_random_quizzes_by_subjects( + subject_ids=quiz_subjects, + limit=limit, + lang_code=lang_code, + ) - quiz_subjects = list({quiz.subject_id for quiz in quiz_work}) - - quiz_data = self.quiz_repository.get_random_quizzes_by_subjects( - subject_ids=quiz_subjects, limit=limit + if not quiz_data: + quiz_data = self.quiz_repository.get_random_quizzes( + limit=limit, + lang_code=lang_code, ) result = []