feat: done make get answer by session and user id

This commit is contained in:
akhdanre 2025-05-18 22:53:20 +07:00
parent f89a7646d8
commit 53fb989d67
6 changed files with 91 additions and 1 deletions

View File

@ -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]):

View File

@ -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)}")

View File

@ -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)}

View File

@ -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",
]

View File

@ -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

View File

@ -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