* fix(backend): removed issue with beta versions of tracker * feat(backend): added filter for getUxTest request
137 lines
3.5 KiB
Go
137 lines
3.5 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 AND ut_tests.status IN ('preview', 'in-progress')
|
|
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,
|
|
CASE
|
|
WHEN $5 <= 0 THEN NULL
|
|
ELSE $5
|
|
END
|
|
)`,
|
|
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, NULLIF($5, ''), $6,
|
|
CASE
|
|
WHEN $7 <= 0 THEN NULL
|
|
ELSE $7
|
|
END
|
|
)`,
|
|
signal.SessionID, signal.TestID, signal.TaskID, signal.Status, signal.Answer, signal.Timestamp, signal.Duration,
|
|
); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|