feat: done on the session and quiz

This commit is contained in:
akhdanre 2025-05-16 13:40:37 +07:00
parent 5ac945eb18
commit 9c4b296d39
4 changed files with 66 additions and 8 deletions

View File

@ -102,7 +102,10 @@ class SocketController:
"message": message, "message": message,
"room": session_code, "room": session_code,
"argument": "adm_update", "argument": "adm_update",
"data": session["quiz_info"], "data": {
"session_info": session["session_info"],
"quiz_info": session["quiz_info"],
},
}, },
to=request.sid, to=request.sid,
) )
@ -114,10 +117,12 @@ class SocketController:
"message": message, "message": message,
"room": session_code, "room": session_code,
"argument": "adm_update", "argument": "adm_update",
"data": session["quiz_info"]["participants"], "data": {
"participants": session["session_info"]["participants"],
},
}, },
room=session_code, room=session_code,
skip_sid=request.sid, # Skip user yang baru join skip_sid=request.sid,
) )
@self.socketio.on("submit_answer") @self.socketio.on("submit_answer")

View File

@ -87,6 +87,8 @@ class Container(containers.DeclarativeContainer):
session_repository, session_repository,
session_memory_repository, session_memory_repository,
user_repository, user_repository,
quiz_repository,
answer_repository,
) )
question_generation_service = providers.Factory( question_generation_service = providers.Factory(

View File

@ -2,7 +2,7 @@ import json
from typing import Dict, Any, List, Optional from typing import Dict, Any, List, Optional
from redis import Redis from redis import Redis
from app.helpers import DatetimeUtil from app.helpers import DatetimeUtil
from app.models.entities import SessionEntity from app.models.entities import SessionEntity, QuizEntity
class SessionMemoryRepository: class SessionMemoryRepository:
@ -147,3 +147,28 @@ class SessionMemoryRepository:
return True return True
return False 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")

View File

@ -1,6 +1,12 @@
from typing import Optional from typing import Optional
from uuid import uuid4 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.models.entities import SessionEntity
from app.helpers import DatetimeUtil from app.helpers import DatetimeUtil
@ -11,10 +17,14 @@ class SessionService:
repository_mongo: SessionRepository, repository_mongo: SessionRepository,
repository_redis: SessionMemoryRepository, repository_redis: SessionMemoryRepository,
user_repository: UserRepository, user_repository: UserRepository,
quiz_repository: QuizRepository,
answer_repository: UserAnswerRepository,
): ):
self.repository_mongo = repository_mongo self.repository_mongo = repository_mongo
self.repository_redis = repository_redis self.repository_redis = repository_redis
self.user_repository = user_repository 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: def create_session(self, quiz_id: str, host_id: str, limit_participan: int) -> str:
generateed_code = uuid4().hex[:6].upper() generateed_code = uuid4().hex[:6].upper()
@ -31,6 +41,8 @@ class SessionService:
session_id = self.repository_mongo.insert(session) session_id = self.repository_mongo.insert(session)
session.id = session_id session.id = session_id
self.repository_redis.create_session(session_id, session) 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 { return {
"session_id": session_id, "session_id": session_id,
"session_code": generateed_code, "session_code": generateed_code,
@ -47,8 +59,20 @@ class SessionService:
u["id"] == user_id for u in session.get("participants", []) 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: 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: if is_existing_user:
return { return {
@ -56,7 +80,8 @@ class SessionService:
"user_id": str(user.id), "user_id": str(user.id),
"username": user.name, "username": user.name,
"user_pic": user.pic_url, "user_pic": user.pic_url,
"quiz_info": session, "session_info": session,
"quiz_info": quiz_info,
"new_user": not is_existing_user, "new_user": not is_existing_user,
} }
self.repository_redis.add_user_to_session( self.repository_redis.add_user_to_session(
@ -74,7 +99,8 @@ class SessionService:
"user_id": str(user.id), "user_id": str(user.id),
"username": user.name, "username": user.name,
"user_pic": user.pic_url, "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, "new_user": not is_existing_user,
} }
return response return response