feat: done make get answer by session and user id
This commit is contained in:
parent
f89a7646d8
commit
53fb989d67
|
@ -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]):
|
||||
|
|
|
@ -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)}")
|
||||
|
|
|
@ -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)}
|
||||
|
|
|
@ -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",
|
||||
]
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue