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,
"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")

View File

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

View File

@ -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")

View File

@ -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