openreplay/backend/pkg/uxtesting/uxtesting.go

129 lines
3.3 KiB
Go

package uxtesting
import (
"openreplay/backend/pkg/db/postgres/pool"
)
type UXTesting interface {
GetInfo(testID string) (*UXTestInfo, error)
SetTestSignal(testSignal *TestSignal) error
SetTaskSignal(taskSignal *TaskSignal) error
}
type uxTestingImpl struct {
db pool.Pool
}
func New(db pool.Pool) UXTesting {
return &uxTestingImpl{
db: db,
}
}
type UXTestInfo struct {
ProjectID uint32 `json:"-"`
Title string `json:"title"`
Description string `json:"description"`
StartingPath string `json:"startingPath"`
Status string `json:"status"`
ReqMic bool `json:"reqMic"`
ReqCamera bool `json:"reqCamera"`
Guidelines string `json:"guidelines"`
Conclusion string `json:"conclusion"`
Tasks []interface{} `json:"tasks"`
}
func (u *uxTestingImpl) GetInfo(testID string) (*UXTestInfo, error) {
info := &UXTestInfo{}
var description, startingPath, guidelines, conclusion *string
err := u.db.QueryRow(`
SELECT
ut_tests.project_id,
ut_tests.title,
ut_tests.description,
ut_tests.starting_path,
ut_tests.status,
ut_tests.require_mic,
ut_tests.require_camera,
ut_tests.guidelines,
ut_tests.conclusion_message,
json_agg(
json_build_object(
'task_id', ut_tests_tasks.task_id,
'title', ut_tests_tasks.title,
'description', ut_tests_tasks.description,
'allow_typing', ut_tests_tasks.allow_typing
)
) AS tasks
FROM
ut_tests
JOIN
ut_tests_tasks ON ut_tests.test_id = ut_tests_tasks.test_id
WHERE ut_tests.test_id = $1
GROUP BY
ut_tests.test_id;
`, testID).Scan(&info.ProjectID, &info.Title, &description, &startingPath, &info.Status, &info.ReqMic, &info.ReqCamera,
&guidelines, &conclusion, &info.Tasks)
if err != nil {
return nil, err
}
if description != nil {
info.Description = *description
}
if startingPath != nil {
info.StartingPath = *startingPath
}
if guidelines != nil {
info.Guidelines = *guidelines
}
if conclusion != nil {
info.Conclusion = *conclusion
}
return info, nil
}
type TestSignal struct {
SessionID uint64 `json:"sessionID"`
TestID int `json:"testID"`
Status string `json:"status"`
Timestamp uint64 `json:"timestamp"`
Duration uint64 `json:"duration"`
}
func (u *uxTestingImpl) SetTestSignal(signal *TestSignal) error {
if err := u.db.Exec(`
INSERT INTO ut_tests_signals (
session_id, test_id, status, timestamp, duration
) VALUES (
$1, $2, $3, $4, $5
)`,
signal.SessionID, signal.TestID, signal.Status, signal.Timestamp, signal.Duration,
); err != nil {
return err
}
return nil
}
type TaskSignal struct {
SessionID uint64 `json:"sessionID"`
TestID int `json:"testID"`
TaskID int `json:"taskID"`
Status string `json:"status"`
Answer string `json:"answer"`
Timestamp uint64 `json:"timestamp"`
Duration uint64 `json:"duration"`
}
func (u *uxTestingImpl) SetTaskSignal(signal *TaskSignal) error {
if err := u.db.Exec(`
INSERT INTO ut_tests_signals (
session_id, test_id, task_id, status, comment, timestamp, duration
) VALUES (
$1, $2, $3, $4, $5, $6, $7
)`,
signal.SessionID, signal.TestID, signal.TaskID, signal.Status, signal.Answer, signal.Timestamp, signal.Duration,
); err != nil {
return err
}
return nil
}