From 9c4b296d39035ba1bfbe4adb953ef80617211293 Mon Sep 17 00:00:00 2001 From: akhdanre Date: Fri, 16 May 2025 13:40:37 +0700 Subject: [PATCH] feat: done on the session and quiz --- app/controllers/socket_conroller.py | 11 ++++-- app/di_container.py | 2 ++ app/repositories/session_memory_repository.py | 27 ++++++++++++++- app/services/session_service.py | 34 ++++++++++++++++--- 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/app/controllers/socket_conroller.py b/app/controllers/socket_conroller.py index 23ebe43..d0818e6 100644 --- a/app/controllers/socket_conroller.py +++ b/app/controllers/socket_conroller.py @@ -102,7 +102,10 @@ class SocketController: "message": message, "room": session_code, "argument": "adm_update", - "data": session["quiz_info"], + "data": { + "session_info": session["session_info"], + "quiz_info": session["quiz_info"], + }, }, to=request.sid, ) @@ -114,10 +117,12 @@ class SocketController: "message": message, "room": session_code, "argument": "adm_update", - "data": session["quiz_info"]["participants"], + "data": { + "participants": session["session_info"]["participants"], + }, }, room=session_code, - skip_sid=request.sid, # Skip user yang baru join + skip_sid=request.sid, ) @self.socketio.on("submit_answer") diff --git a/app/di_container.py b/app/di_container.py index 60a2e3e..365b1a3 100644 --- a/app/di_container.py +++ b/app/di_container.py @@ -87,6 +87,8 @@ class Container(containers.DeclarativeContainer): session_repository, session_memory_repository, user_repository, + quiz_repository, + answer_repository, ) question_generation_service = providers.Factory( diff --git a/app/repositories/session_memory_repository.py b/app/repositories/session_memory_repository.py index 71852ea..bc4f32d 100644 --- a/app/repositories/session_memory_repository.py +++ b/app/repositories/session_memory_repository.py @@ -2,7 +2,7 @@ import json from typing import Dict, Any, List, Optional from redis import Redis from app.helpers import DatetimeUtil -from app.models.entities import SessionEntity +from app.models.entities import SessionEntity, QuizEntity class SessionMemoryRepository: @@ -147,3 +147,28 @@ class SessionMemoryRepository: return True return False + + def set_quiz_for_session(self, session_id: str, quiz_data: QuizEntity): + """ + Store quiz questions for a session. + """ + + data = quiz_data.model_dump() + data["id"] = str(data["id"]) ## objectId + data["date"] = DatetimeUtil.to_string(data["date"]) + + self.set_data(f"session:{session_id}:quiz", data) + + def get_quiz_for_session(self, session_id: str) -> QuizEntity: + """ + Retrieve quiz questions for a session. + """ + data = self.get_data(f"session:{session_id}:quiz") + data["date"] = DatetimeUtil.from_string(data["date"]) + return QuizEntity(**data) + + def delete_quiz_for_session(self, session_id: str): + """ + Delete quiz data for a session. + """ + self.delete_key(f"session:{session_id}:quiz") diff --git a/app/services/session_service.py b/app/services/session_service.py index d6600b3..9385f2e 100644 --- a/app/services/session_service.py +++ b/app/services/session_service.py @@ -1,6 +1,12 @@ from typing import Optional from uuid import uuid4 -from app.repositories import SessionRepository, UserRepository, SessionMemoryRepository +from app.repositories import ( + SessionRepository, + UserRepository, + SessionMemoryRepository, + QuizRepository, + UserAnswerRepository, +) from app.models.entities import SessionEntity from app.helpers import DatetimeUtil @@ -11,10 +17,14 @@ class SessionService: repository_mongo: SessionRepository, repository_redis: SessionMemoryRepository, user_repository: UserRepository, + quiz_repository: QuizRepository, + answer_repository: UserAnswerRepository, ): self.repository_mongo = repository_mongo self.repository_redis = repository_redis self.user_repository = user_repository + self.quiz_repository = quiz_repository + self.answer_repository = answer_repository def create_session(self, quiz_id: str, host_id: str, limit_participan: int) -> str: generateed_code = uuid4().hex[:6].upper() @@ -31,6 +41,8 @@ class SessionService: session_id = self.repository_mongo.insert(session) session.id = session_id self.repository_redis.create_session(session_id, session) + data = self.quiz_repository.get_by_id(quiz_id=quiz_id) + self.repository_redis.set_quiz_for_session(session_id, data) return { "session_id": session_id, "session_code": generateed_code, @@ -47,8 +59,20 @@ class SessionService: u["id"] == user_id for u in session.get("participants", []) ) + session_quiz = self.repository_redis.get_quiz_for_session(session["id"]) + + quiz_info = { + "title": session_quiz.title, + "limit_duration": session_quiz.title, + } + if session["host_id"] == user_id: - return {"is_admin": True, "message": "admin joined", "quiz_info": session} + return { + "is_admin": True, + "message": "admin joined", + "session_info": session, + "quiz_info": quiz_info, + } if is_existing_user: return { @@ -56,7 +80,8 @@ class SessionService: "user_id": str(user.id), "username": user.name, "user_pic": user.pic_url, - "quiz_info": session, + "session_info": session, + "quiz_info": quiz_info, "new_user": not is_existing_user, } self.repository_redis.add_user_to_session( @@ -74,7 +99,8 @@ class SessionService: "user_id": str(user.id), "username": user.name, "user_pic": user.pic_url, - "quiz_info": session if not is_existing_user else None, + "session_info": session if not is_existing_user else None, + "quiz_info": quiz_info, "new_user": not is_existing_user, } return response