diff --git a/app/blueprints/history.py b/app/blueprints/history.py index 96108fd..b711025 100644 --- a/app/blueprints/history.py +++ b/app/blueprints/history.py @@ -20,3 +20,12 @@ def user_detail_history( answer_id, controller: HistoryController = Provide[Container.history_controller] ): return controller.get_detail_quiz_history(answer_id) + + +@history_blueprint.route("/session/", methods=["GET"]) +@inject +def session_history( + session_id: str, + controller: HistoryController = Provide[Container.history_controller], +): + return controller.get_session_history(session_id) diff --git a/app/controllers/history_controller.py b/app/controllers/history_controller.py index 6ed0574..0468786 100644 --- a/app/controllers/history_controller.py +++ b/app/controllers/history_controller.py @@ -22,3 +22,11 @@ class HistoryController: ) except Exception as e: return make_error_response(e) + + def get_session_history(self, session_id): + try: + result = self.history_service.get_session_history(session_id) + + return make_response(message="success get history session", data=result) + except Exception as e: + return make_error_response(e) diff --git a/app/di_container.py b/app/di_container.py index db99967..7e91f9e 100644 --- a/app/di_container.py +++ b/app/di_container.py @@ -85,6 +85,8 @@ class Container(containers.DeclarativeContainer): HistoryService, quiz_repository, answer_repository, + session_repository, + user_repository, ) subject_service = providers.Factory( diff --git a/app/repositories/session_repostory.py b/app/repositories/session_repostory.py index 6c63720..04d63d5 100644 --- a/app/repositories/session_repostory.py +++ b/app/repositories/session_repostory.py @@ -19,15 +19,13 @@ class SessionRepository: return str(result.inserted_id) def find_by_session_id(self, session_id: str) -> Optional[SessionEntity]: - doc = self.collection.find_one({"_id": session_id}) + doc = self.collection.find_one({"_id": ObjectId(session_id)}) return SessionEntity(**doc) if doc else None def find_by_session_code(self, session_code: str) -> Optional[SessionEntity]: doc = self.collection.find_one({"session_code": session_code}) return SessionEntity(**doc) if doc else None - from bson import ObjectId - def update(self, session_id: str, update_fields: SessionEntity) -> bool: result = self.collection.update_one( {"_id": ObjectId(session_id)}, diff --git a/app/services/history_service.py b/app/services/history_service.py index b00f51b..191d760 100644 --- a/app/services/history_service.py +++ b/app/services/history_service.py @@ -1,19 +1,30 @@ -from app.repositories import UserAnswerRepository, QuizRepository +from app.repositories import ( + UserAnswerRepository, + QuizRepository, + SessionRepository, + UserRepository, +) from app.schemas.response import ( HistoryResultSchema, QuizHistoryResponse, QuestionResult, ) +from app.helpers import DatetimeUtil + class HistoryService: def __init__( self, quiz_repository: QuizRepository, answer_repository: UserAnswerRepository, + session_repository: SessionRepository, + user_repository: UserRepository, ): self.quiz_repository = quiz_repository self.answer_repository = answer_repository + self.session_repository = session_repository + self.user_repository = user_repository def get_history_by_user_id(self, user_id: str): answer_data = self.answer_repository.get_by_user(user_id) @@ -23,7 +34,7 @@ class HistoryService: quiz_ids = [asn.quiz_id for asn in answer_data] quiz_data = self.quiz_repository.get_by_ids(quiz_ids) quiz_map = {str(quiz.id): quiz for quiz in quiz_data} - + result = [] for answer in answer_data: quiz = quiz_map.get(answer.quiz_id) @@ -79,3 +90,30 @@ class HistoryService: question_listings=question_results, ) return result + + def get_session_history(self, session_id): + session_data = self.session_repository.find_by_session_id(session_id) + + participants = [] + + for participant in session_data.participants: + answer = self.answer_repository.get_by_userid_and_sessionid( + user_id=participant["id"], + session_id=session_id, + ) + + user = self.user_repository.get_user_by_id(user_id=participant["id"]) + + participants.append( + { + "id": str(user.id), + "name": user.name, + "score": answer.total_score, + } + ) + session_data.id = str(session_data.id) + session_data.participants = participants + session_data.created_at = DatetimeUtil.to_string(session_data.created_at) + session_data.started_at = DatetimeUtil.to_string(session_data.started_at) + session_data.ended_at = DatetimeUtil.to_string(session_data.ended_at) + return session_data