sessionmanager.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package sessionmanager
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "io"
  6. "net/http"
  7. "net/url"
  8. "git.andreafazzi.eu/andrea/probo/pkg/models"
  9. "git.andreafazzi.eu/andrea/probo/pkg/store"
  10. "git.andreafazzi.eu/andrea/probo/pkg/store/file"
  11. )
  12. type SessionManager struct {
  13. ParticipantStore *store.ParticipantStore
  14. QuizStore *store.QuizStore
  15. ParticipantFilter map[string]string
  16. QuizFilter map[string]string
  17. ServerURL string
  18. Token int
  19. examFileStore *file.ExamFileStore
  20. }
  21. func NewSessionManager(url string, pStore *store.ParticipantStore, qStore *store.QuizStore, pFilter map[string]string, qFilter map[string]string) (*SessionManager, error) {
  22. sm := new(SessionManager)
  23. sm.ServerURL = url
  24. var err error
  25. sm.examFileStore, err = file.NewDefaultExamFileStore()
  26. if err != nil {
  27. return nil, err
  28. }
  29. for _, p := range pStore.ReadAll() {
  30. _, err := sm.examFileStore.Create(&models.Exam{
  31. Participant: p,
  32. Quizzes: qStore.ReadAll(),
  33. })
  34. if err != nil {
  35. return nil, err
  36. }
  37. }
  38. return sm, nil
  39. }
  40. func (sm *SessionManager) GetExams() []*models.Exam {
  41. return sm.examFileStore.ReadAll()
  42. }
  43. func (sm *SessionManager) Pull(rStore *file.ResponseFileStore, sessionID string) error {
  44. url, err := url.JoinPath(sm.ServerURL, "responses/", sessionID)
  45. if err != nil {
  46. return err
  47. }
  48. rr, err := http.Get(url)
  49. if err != nil {
  50. return err
  51. }
  52. responseBody, err := io.ReadAll(rr.Body)
  53. if err != nil {
  54. return err
  55. }
  56. responses := make([]*models.Response, 0)
  57. err = json.Unmarshal(responseBody, &responses)
  58. if err != nil {
  59. return err
  60. }
  61. for _, response := range responses {
  62. _, err := rStore.Create(response)
  63. if err != nil {
  64. return err
  65. }
  66. }
  67. return nil
  68. }
  69. func (sm *SessionManager) Push(name string) (*models.Session, error) {
  70. session := &models.Session{
  71. Name: name,
  72. Exams: make(map[string]*models.Exam),
  73. }
  74. for _, e := range sm.GetExams() {
  75. session.Exams[e.Participant.Token] = e
  76. }
  77. payload, err := session.Marshal()
  78. if err != nil {
  79. return nil, err
  80. }
  81. url, err := url.JoinPath(sm.ServerURL, "create")
  82. if err != nil {
  83. return nil, err
  84. }
  85. response, err := http.Post(url, "application/json", bytes.NewReader(payload))
  86. if err != nil {
  87. return nil, err
  88. }
  89. responseBody, err := io.ReadAll(response.Body)
  90. if err != nil {
  91. return nil, err
  92. }
  93. err = json.Unmarshal(responseBody, &session)
  94. if err != nil {
  95. return nil, err
  96. }
  97. return session, nil
  98. }