-
Notifications
You must be signed in to change notification settings - Fork 3
/
sessions.go
56 lines (46 loc) · 1.32 KB
/
sessions.go
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
package pulse
import (
"time"
"github.com/creativecreature/pulse/truncate"
)
// Sessions is a slice of several Session structs.
type Sessions []Session
func (s Sessions) Len() int {
return len(s)
}
func (s Sessions) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s Sessions) Less(i, j int) bool {
return s[i].StartedAt < s[j].StartedAt
}
// groupByDay groups a slice of sessions by day.
func groupByDay(session []Session) map[int64][]Session {
buckets := make(map[int64][]Session)
for _, s := range session {
d := truncate.Day(s.StartedAt)
buckets[d] = append(buckets[d], s)
}
return buckets
}
// Aggregate takes a list of locally stored sessions and aggregates them by day.
func (s Sessions) Aggregate() []AggregatedSession {
sessionsPerDay := groupByDay(s)
aggregatedSessions := make([]AggregatedSession, 0)
for date, tempSessions := range sessionsPerDay {
dateString := time.Unix(0, date*int64(time.Millisecond)).Format("2006-01-02")
var totalTime int64
for _, tempSession := range tempSessions {
totalTime += tempSession.DurationMs
}
session := AggregatedSession{
Period: Day,
Date: date,
DateString: dateString,
TotalTimeMs: totalTime,
Repositories: repositories(tempSessions),
}
aggregatedSessions = append(aggregatedSessions, session)
}
return aggregatedSessions
}