Jelajahi Sumber

Rename SessionManager

andrea 5 bulan lalu
induk
melakukan
e05ea6dd25

File diff ditekan karena terlalu besar
+ 0 - 0
server/data/sessions/session_24e5a5f5-8293-4e13-a825-656117db4d5b.json


+ 170 - 0
server/payload.json

@@ -0,0 +1,170 @@
+{
+    "ID": "fe0a7ee0-f31a-413d-f123-ab5068bcaaaa",
+    "Name": "Test session",
+    "Exams": {
+	"111222": {
+	    "id": "fe0a7ee0-f31a-413d-ba81-ab5068bc4c73",
+	    "created_at": "0001-01-01T00:00:00Z",
+	    "updated_at": "0001-01-01T00:00:00Z",
+	    "Participant": {
+		"ID": "1234",
+		"Firstname": "John",
+		"Lastname": "Smith",
+		"Token": 111222,
+		"Attributes": {
+		    "class": "1 D LIN"
+		}
+	    },
+	    "Quizzes": [
+		{
+		    "id": "0610939b-a1a3-4d0e-bbc4-2aae0e8ee4b9",
+		    "created_at": "2023-11-27T17:51:53.910642221+01:00",
+		    "updated_at": "0001-01-01T00:00:00Z",
+		    "hash": "",
+		    "question": {
+			"id": "98c0eec9-677f-464e-9e3e-864a859f29a3",
+			"created_at": "0001-01-01T00:00:00Z",
+			"updated_at": "0001-01-01T00:00:00Z",
+			"text": "Question text with #tag1."
+		    },
+		    "answers": [
+			{
+			    "id": "1ab5ff1f-74c8-4efc-abdc-d03a3640f3bc",
+			    "text": "Answer 1"
+			},
+			{
+			    "id": "74547724-b905-476f-8cfc-6ee633f92ef3",
+			    "text": "Answer 2"
+			},
+			{
+			    "id": "96c1a8ee-c50c-4ebc-89e4-9f3ca356adbd",
+			    "text": "Answer 3"
+			},
+			{
+			    "id": "16c4b95e-64ce-4666-8cbe-b66fa59eb23b",
+			    "text": "Answer 4"
+			}
+		    ],
+		    "tags": [
+			{
+			    "CreatedAt": "0001-01-01T00:00:00Z",
+			    "UpdatedAt": "0001-01-01T00:00:00Z",
+			    "DeletedAt": null,
+			    "name": "#tag1"
+			}
+		    ],
+		    "correct": {
+			"id": "1ab5ff1f-74c8-4efc-abdc-d03a3640f3bc",
+			"text": "Answer 1"
+		    },
+		    "CorrectPos": 0,
+		    "type": 0
+		},
+		{
+		    "id": "915818c4-b0ce-4efc-8def-7fc8d5fa7454",
+		    "created_at": "2023-11-27T17:51:53.91077796+01:00",
+		    "updated_at": "0001-01-01T00:00:00Z",
+		    "hash": "",
+		    "question": {
+			"id": "70793f0d-2855-4140-814e-40167464424b",
+			"created_at": "0001-01-01T00:00:00Z",
+			"updated_at": "0001-01-01T00:00:00Z",
+			"text": "Another question text with #tag1."
+		    },
+		    "answers": [
+			{
+			    "id": "1ab5ff1f-74c8-4efc-abdc-d03a3640f3bc",
+			    "text": "Answer 1"
+			},
+			{
+			    "id": "74547724-b905-476f-8cfc-6ee633f92ef3",
+			    "text": "Answer 2"
+			},
+			{
+			    "id": "96c1a8ee-c50c-4ebc-89e4-9f3ca356adbd",
+			    "text": "Answer 3"
+			},
+			{
+			    "id": "16c4b95e-64ce-4666-8cbe-b66fa59eb23b",
+			    "text": "Answer 4"
+			}
+		    ],
+		    "tags": [
+			{
+			    "CreatedAt": "0001-01-01T00:00:00Z",
+			    "UpdatedAt": "0001-01-01T00:00:00Z",
+			    "DeletedAt": null,
+			    "name": "#tag1"
+			}
+		    ],
+		    "correct": {
+			"id": "1ab5ff1f-74c8-4efc-abdc-d03a3640f3bc",
+			"text": "Answer 1"
+		    },
+		    "CorrectPos": 0,
+		    "type": 0
+		}
+	    ]
+	}
+    },
+    "333444": {
+	"id": "12345678-abcd-efgh-ijkl-9876543210ef",
+	"created_at": "2023-12-01T12:00:00Z",
+	"updated_at": "2023-12-01T12:00:00Z",
+	"Participant": {
+	    "ID": "5678",
+	    "Firstname": "Jane",
+	    "Lastname": "Doe",
+	    "Token": 333444,
+	    "Attributes": {
+		"class": "2 A SCI"
+	    }
+	},
+	"Quizzes": [
+	    {
+		"id": "22222222-abcd-efgh-ijkl-9876543210ef",
+		"created_at": "2023-12-01T12:00:00Z",
+		"updated_at": "2023-12-01T12:00:00Z",
+		"hash": "",
+		"question": {
+		    "id": "33333333-abcd-efgh-ijkl-9876543210ef",
+		    "created_at": "2023-12-01T12:00:00Z",
+		    "updated_at": "2023-12-01T12:00:00Z",
+		    "text": "Sample question text."
+		},
+		"answers": [
+		    {
+			"id": "44444444-abcd-efgh-ijkl-9876543210ef",
+			"text": "Option 1"
+		    },
+		    {
+			"id": "55555555-abcd-efgh-ijkl-9876543210ef",
+			"text": "Option 2"
+		    },
+		    {
+			"id": "66666666-abcd-efgh-ijkl-9876543210ef",
+			"text": "Option 3"
+		    },
+		    {
+			"id": "77777777-abcd-efgh-ijkl-9876543210ef",
+			"text": "Option 4"
+		    }
+		],
+		"tags": [
+		    {
+			"CreatedAt": "2023-12-01T12:00:00Z",
+			"UpdatedAt": "2023-12-01T12:00:00Z",
+			"DeletedAt": null,
+			"name": "#tag2"
+		    }
+		],
+		"correct": {
+		    "id": "44444444-abcd-efgh-ijkl-9876543210ef",
+		    "text": "Option 1"
+		},
+		"CorrectPos": 0,
+		"type": 0
+	    }
+	]
+    }
+}

+ 1 - 0
server/testdata/responses/README

@@ -0,0 +1 @@
+Please keep this file in the git tree in order to add the testdata/sessions folder.

+ 83 - 0
sessionmanager/sessionmanager.go

@@ -0,0 +1,83 @@
+package sessionmanager
+
+import (
+	"bytes"
+	"encoding/json"
+	"io"
+	"net/http"
+
+	"git.andreafazzi.eu/andrea/probo/models"
+	"git.andreafazzi.eu/andrea/probo/store"
+)
+
+type SessionManager struct {
+	Name string
+
+	ParticipantStore *store.ParticipantStore
+	QuizStore        *store.QuizStore
+
+	ParticipantFilter map[string]string
+	QuizFilter        map[string]string
+	ServerURL         string
+	Token             int
+
+	examStore *store.ExamStore
+}
+
+func NewSessionManager(url string, name string, pStore *store.ParticipantStore, qStore *store.QuizStore, pFilter map[string]string, qFilter map[string]string) (*SessionManager, error) {
+	sm := new(SessionManager)
+
+	sm.Name = name
+	sm.ServerURL = url
+	sm.examStore = store.NewStore[*models.Exam]()
+
+	for _, p := range pStore.ReadAll() {
+		_, err := sm.examStore.Create(&models.Exam{
+			Participant: p,
+			Quizzes:     qStore.ReadAll(),
+		})
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return sm, nil
+}
+
+func (sm *SessionManager) GetExams() []*models.Exam {
+	return sm.examStore.ReadAll()
+}
+
+func (sm *SessionManager) Push() (string, error) {
+	session := &models.Session{
+		Name:  sm.Name,
+		Exams: make(map[string]*models.Exam),
+	}
+
+	for _, e := range sm.GetExams() {
+		session.Exams[e.Participant.Token] = e
+	}
+
+	payload, err := session.Marshal()
+	if err != nil {
+		return "", err
+	}
+
+	response, err := http.Post(sm.ServerURL, "application/json", bytes.NewReader(payload))
+	if err != nil {
+		return "", err
+	}
+
+	responseBody, err := io.ReadAll(response.Body)
+	if err != nil {
+		return "", err
+	}
+
+	result := map[string]string{}
+	err = json.Unmarshal(responseBody, &result)
+	if err != nil {
+		return "", err
+	}
+
+	return result["id"], nil
+}

+ 25 - 0
store/file/session.go

@@ -0,0 +1,25 @@
+package file
+
+import (
+	"git.andreafazzi.eu/andrea/probo/models"
+	"git.andreafazzi.eu/andrea/probo/store"
+)
+
+type SessionFileStore = FileStore[*models.Session, *store.Store[*models.Session]]
+
+func NewSessionFileStore(config *FileStoreConfig[*models.Session, *store.SessionStore]) (*SessionFileStore, error) {
+	return NewFileStore[*models.Session](config, store.NewStore[*models.Session]())
+}
+
+func NewDefaultSessionFileStore() (*SessionFileStore, error) {
+	return NewSessionFileStore(
+		&FileStoreConfig[*models.Session, *store.SessionStore]{
+			FilePathConfig: FilePathConfig{GetDefaultSessionDir(), "session", ".json"},
+			IndexDirFunc:   DefaultIndexDirFunc[*models.Session, *store.SessionStore],
+			CreateEntityFunc: func() *models.Session {
+				return &models.Session{}
+			},
+		},
+	)
+
+}

+ 5 - 0
store/session.go

@@ -0,0 +1,5 @@
+package store
+
+import "git.andreafazzi.eu/andrea/probo/models"
+
+type SessionStore = Store[*models.Session]

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini