feat: done on the session and quiz
This commit is contained in:
parent
5ac945eb18
commit
9c4b296d39
|
@ -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")
|
||||
|
|
|
@ -87,6 +87,8 @@ class Container(containers.DeclarativeContainer):
|
|||
session_repository,
|
||||
session_memory_repository,
|
||||
user_repository,
|
||||
quiz_repository,
|
||||
answer_repository,
|
||||
)
|
||||
|
||||
question_generation_service = providers.Factory(
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue