summaryrefslogtreecommitdiff
path: root/src/hub/src/spreadspace.org/sfive/s5typesStore.go
blob: f757f4288d2f60bb64504837678f280f749cc2e0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package sfive

import (
	"time"
)

// compared to JSON DTOs, DB types are flattened, and use key-relations instead of collections
// this is very much not normalized at all, because I'm too lazy to type

// table names
const (
	tagsTn              = "Tags"
	sourceTagsTn        = "StreamToTagMap"
	sourcesTn           = "Sources"
	clientdataUpdatesTn = "ClientDataUpdates"
	dataUpdatesTn       = "DataUpdates"
	hubInfoTn           = "HubInfo"
)

type hubInfoDb struct {
	Name  string
	Value string
}

// stored in tagsTn
type tagDb struct {
	Id   int
	Name string
}

// stored in sourceTagsTn
// Stream m:n Tag
type sourceTagsDb struct {
	TagId    int // foreign key to tagsTn
	SourceId int // foreign key to sourcesTn
}

// stored in sourcesTn
type sourceDb struct {
	Id int
	StreamId
	SourceId
}

// stored in clientdataUpdatesTn
// ClientData n:1 DataUpdate
type clientDataDb struct {
	Id            int
	DataUpdatesId int // foreign key to dataUpdatesTn
	ClientData
}

// stored in dataUpdatesTn
// in DB, StatisticsData/DataUpdate is flattened compared to JSON DTOs
type dataUpdateDb struct {
	Id                    int
	SourceId              int // foreign key to sourcesTn
	SourceHubUuid         *string
	SourceHubDataUpdateId *int
	StartTime             int64 // time.Time
	Duration              int64 // time.Duration
	ClientCount           uint
	BytesReceived         uint
	BytesSent             uint
}

func (self *SourceId) CopyFromSourceDb(value sourceDb) {
	self.Version = value.Version
	self.Hostname = value.Hostname
	self.StreamId.ContentId = value.ContentId
	self.StreamId.Format = value.Format
	self.StreamId.Quality = value.Quality
}

func (self *SourceId) CopyFromTagsDb(values []tagDb) {
	tags := make([]string, len(values))
	for i := range values {
		tags[i] = values[i].Name
	}
	self.Tags = tags
}

func (self *StatisticsData) CopyFromDataUpdateDb(value dataUpdateDb, hubId string) {
	if value.SourceHubUuid == nil {
		self.SourceHubUuid = &hubId
	} else {
		self.SourceHubUuid = value.SourceHubUuid
	}
	if value.SourceHubDataUpdateId == nil {
		self.SourceHubDataUpdateId = &value.Id
	} else {
		self.SourceHubDataUpdateId = value.SourceHubDataUpdateId
	}

	self.StartTime = time.Unix(value.StartTime, 0)
	self.Duration = time.Duration(value.Duration) * time.Second
	self.Data.ClientCount = value.ClientCount
	self.Data.BytesReceived = value.BytesReceived
	self.Data.BytesSent = value.BytesSent
}

func (self *StatisticsData) CopyFromClientDataDb(values []clientDataDb) {
	clients := make([]ClientData, len(values))
	for i := range values {
		clients[i].Ip = values[i].Ip
		clients[i].UserAgent = values[i].UserAgent
		clients[i].BytesSent = values[i].BytesSent
	}
	self.Data.Clients = clients
}

func cvtToApiStatisticsData(
	hubId string, source sourceDb, update dataUpdateDb, clients []clientDataDb, tags []tagDb) StatisticsData {
	res := StatisticsData{}
	res.CopyFromSourceDb(source)
	res.CopyFromDataUpdateDb(update, hubId)
	res.CopyFromClientDataDb(clients)
	res.CopyFromTagsDb(tags)
	return res
}