mirror of
https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir.git
synced 2025-08-11 21:23:54 -04:00
146 lines
No EOL
3.5 KiB
Markdown
146 lines
No EOL
3.5 KiB
Markdown
# Salles de Quiz
|
|
|
|
Les salles de quiz ont été extraites dans leur propre container afin de limiter les dégats liés soit a une surutilisation d'une salle ou une attaque sur le logiciel.
|
|
|
|
En éffet, le découplement permet a un quiz de:
|
|
|
|
- Survivre même si le backend est non-fonctionnel
|
|
- Mourir sans entrainer toute l'application avec elle
|
|
- Créer/Supprimer des salles automatiquement dépendant de la demande
|
|
|
|
Pour éffectuer ceci il faut éffectuer une petite gymnastique. Il y a une route dans l'api servant à gerer les salles. Lorsqu'un utilisateur demande le socket d'une salle : "/api/rooms/{id}/socket", la requette rebondit sur le proxy Nginx. Celui-ci contacte le backend afin d'obtenir l'addresse de l'ordinateur auquel envoyer la requette et redirige le socket vers ce pc.
|
|
|
|
|
|
## Diagramme de séquence
|
|
```plantuml
|
|
@startuml
|
|
actor Teacher
|
|
actor Student
|
|
entity Nginx
|
|
entity Frontend
|
|
entity Api
|
|
entity Docker
|
|
entity Database
|
|
|
|
group Quiz Creation
|
|
Teacher -> Frontend : Create a quizroom
|
|
Frontend -> Api : Create a quizroom
|
|
Api -> Docker : Create a quizroom
|
|
Docker -> QuizRoom **
|
|
QuizRoom -> Docker : creation successful
|
|
Docker -> Api : Creation Successful
|
|
|
|
loop every seconds until healthy or 30s:
|
|
Api -> QuizRoom : Checking Health via /health
|
|
QuizRoom -> Api : Doesn't answer, answer healthy or unhealthy
|
|
end
|
|
|
|
Api -> Database : Create Room
|
|
Database -> Api : Room created
|
|
Api -> Teacher : Route to room socket
|
|
end
|
|
|
|
group Quiz Joining:
|
|
Teacher -> Nginx : Join Room
|
|
Nginx -> Api : Get room infos from id
|
|
Api -> Nginx : Ip:port of room
|
|
Nginx -> QuizRoom: Give teacher's connexion
|
|
|
|
Student -> Frontend: Join Room X
|
|
Frontend -> Nginx : Join Room X
|
|
Nginx -> Api : Get room infos from id
|
|
Api -> Nginx : Ip:port of room
|
|
Nginx -> QuizRoom: Give student's connexion
|
|
|
|
QuizRoom -> QuizRoom : Give Quiz ... (Multiple actions)
|
|
|
|
Student -> QuizRoom: Disconnect
|
|
Teacher -> QuizRoom: Disconect
|
|
end
|
|
|
|
group QuizManagement (Every 10 seconds)
|
|
Api -> QuizRoom : Checking number of people in the room
|
|
QuizRoom -> Api : Number of people (0) or Unhealthy
|
|
Api -> Database : Mark room to deletion
|
|
end
|
|
|
|
group Quiz Deletion (Every 30 seconds)
|
|
Api -> Database : Give all rooms marked for deletion
|
|
Database -> Api : rooms
|
|
Api -> Docker : delete rooms
|
|
Docker -> QuizRoom : delete
|
|
Docker -> Api : Deleted
|
|
end
|
|
|
|
@enduml
|
|
```
|
|
|
|
## Classes touchant cette fonctionalitée
|
|
```plantuml
|
|
@startuml
|
|
class Room{
|
|
+id
|
|
+name
|
|
+host
|
|
+nbStudents
|
|
+mustBeCleaned
|
|
}
|
|
|
|
class RoomRepository {
|
|
+get(id)
|
|
+create(room)
|
|
+delete(id)
|
|
+update(room,id)
|
|
+getAll()
|
|
}
|
|
|
|
class RoomController {
|
|
+setupRoom(options)
|
|
+deleteRoom(roomId)
|
|
+listRooms()
|
|
+getRoomStatus(roomId)
|
|
+updateRoom(room,roomId)
|
|
}
|
|
|
|
class RoomRouter{
|
|
+ / : GET
|
|
+ /:id : GET
|
|
+ / : POST
|
|
+ /:id : PUT
|
|
+ /:id : DELETE
|
|
}
|
|
|
|
class BaseRoomProvider {
|
|
+createRoom(roomid,options)
|
|
+deleteRoom(roomId)
|
|
+getRoomInfo(roomId)
|
|
+getRoomStatus(roomId)
|
|
+listRooms()
|
|
-cleanup()
|
|
-syncInstantiatedRooms()
|
|
#updateRoomInfos()
|
|
}
|
|
|
|
class DockerRoomProvider
|
|
circle Dockerode
|
|
|
|
|
|
Room - RoomRepository
|
|
BaseRoomProvider o-- RoomRepository
|
|
DockerRoomProvider --|> BaseRoomProvider
|
|
DockerRoomProvider - Dockerode
|
|
Dockerode o-- QuizRoom
|
|
RoomController o-- BaseRoomProvider
|
|
RoomRouter o-- RoomController
|
|
|
|
class QuizRoom{
|
|
+create-room()
|
|
+join-room()
|
|
+next-question()
|
|
+launch-student-mode()
|
|
+end-quiz()
|
|
+submit-answers()
|
|
-disconnect()
|
|
}
|
|
@enduml
|
|
``` |