diff --git a/app/blueprints/quiz.py b/app/blueprints/quiz.py index bd968b3..7ded161 100644 --- a/app/blueprints/quiz.py +++ b/app/blueprints/quiz.py @@ -37,6 +37,13 @@ def submit_answer(controller: QuizController = Provide[Container.quiz_controller return controller.submit_answer(req_body) +@quiz_bp.route("/answer/session", methods=["POST"]) +@inject +def get_answer_session(controller: QuizController = Provide[Container.quiz_controller]): + req_body = request.get_json() + return controller.get_user_ans_session(req_body) + + @quiz_bp.route("/answer", methods=["GET"]) @inject def get_answer(controller: QuizController = Provide[Container.quiz_controller]): diff --git a/app/controllers/quiz_controller.py b/app/controllers/quiz_controller.py index bb2fd49..8c2cdb2 100644 --- a/app/controllers/quiz_controller.py +++ b/app/controllers/quiz_controller.py @@ -75,7 +75,7 @@ class QuizController: def get_answer(self, quiz_id, user_id, session_id): try: # self.answer_service. - pass + pass except Exception as e: return make_error_response(e) @@ -139,3 +139,25 @@ class QuizController: return make_response(message="succes labeling", data=result) except Exception as e: return make_error_response(e) + + def get_user_ans_session(self, body): + try: + session_id = body.get("session_id") + user_id = body.get("user_id") + + if not session_id and not user_id: + return make_response( + message="session_id or user_id must be provided", status_code=400 + ) + + data = self.answer_service.get_answer_session( + session_id=session_id, + user_id=user_id, + ) + + return make_response(message="Successfully retrieved the answer", data=data) + + except KeyError as e: + return make_error_response(f"Missing required key: {str(e)}") + except Exception as e: + return make_error_response(f"An error occurred: {str(e)}") diff --git a/app/repositories/answer_repository.py b/app/repositories/answer_repository.py index c2acefc..2a95116 100644 --- a/app/repositories/answer_repository.py +++ b/app/repositories/answer_repository.py @@ -19,6 +19,18 @@ class UserAnswerRepository: return None return UserAnswerEntity(**result) + def get_by_userid_and_sessionid( + self, + user_id: str, + session_id: str, + ) -> Optional[UserAnswerEntity]: + result = self.collection.find_one( + {"user_id": user_id, "session_id": session_id} + ) + if not result: + return None + return UserAnswerEntity(**result) + def get_by_user_and_quiz(self, user_id: str, quiz_id: str) -> List[dict]: result = self.collection.find( {"user_id": user_id, "quiz_id": ObjectId(quiz_id)} diff --git a/app/schemas/response/__init__.py b/app/schemas/response/__init__.py index 60dac02..da62b7f 100644 --- a/app/schemas/response/__init__.py +++ b/app/schemas/response/__init__.py @@ -8,6 +8,7 @@ from .recomendation.recomendation_response_schema import ListingQuizResponse from .subject.get_subject_schema import GetSubjectResponse from .auth.login_response import LoginResponseSchema from .user.user_response_scema import UserResponseSchema +from .answer.answer_session_response import AnsweredQuizResponse __all__ = [ "QuizCreationResponse", @@ -21,4 +22,5 @@ __all__ = [ "GetSubjectResponse", "LoginResponseSchema", "UserResponseSchema", + "AnsweredQuizResponse", ] diff --git a/app/schemas/response/answer/answer_session_response.py b/app/schemas/response/answer/answer_session_response.py new file mode 100644 index 0000000..41c67b6 --- /dev/null +++ b/app/schemas/response/answer/answer_session_response.py @@ -0,0 +1,13 @@ +from pydantic import BaseModel +from typing import List, Dict + + +class AnsweredQuizResponse(BaseModel): + id: str + session_id: str + quiz_id: str + user_id: str + answered_at: str + answers: List[Dict] + total_score: int + total_correct: int diff --git a/app/services/answer_service.py b/app/services/answer_service.py index 17a912a..5100b3a 100644 --- a/app/services/answer_service.py +++ b/app/services/answer_service.py @@ -1,8 +1,10 @@ from app.repositories import UserAnswerRepository, QuizRepository, UserRepository from app.schemas.requests import UserAnswerSchema +from app.schemas.response import AnsweredQuizResponse from app.models import UserAnswerEntity from app.models.entities import AnswerItemEntity from app.exception import ValidationException +from app.helpers import DatetimeUtil class AnswerService: @@ -103,3 +105,35 @@ class AnswerService: def delete_answer(self, answer_id): return self.answer_repository.delete_by_id(answer_id) + + def get_answer_session(self, session_id: str, user_id: str) -> AnsweredQuizResponse: + answer_data: UserAnswerEntity = ( + self.answer_repository.get_by_userid_and_sessionid( + session_id=session_id, + user_id=user_id, + ) + ) + + if not answer_data: + return None + + data = AnsweredQuizResponse( + id=str(answer_data.id), + session_id=answer_data.session_id, + quiz_id=answer_data.quiz_id, + user_id=answer_data.user_id, + answered_at=DatetimeUtil.to_string(answer_data.answered_at), + answers=[ + { + "question_index": ans.question_index, + "answer": ans.answer, + "is_correct": ans.is_correct, + "time_spent": ans.time_spent, + } + for ans in answer_data.answers + ], + total_score=answer_data.total_score, + total_correct=answer_data.total_correct, + ) + + return data