feat: done on the session and quiz
This commit is contained in:
parent
5ac945eb18
commit
9c4b296d39
|
@ -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")
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue