/
site_stats.go
45 lines (37 loc) · 1.13 KB
/
site_stats.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
package models
import (
"fmt"
"time"
)
type SiteStats struct {
New bool `db:"-" json:"-" `
SiteID int64 `db:"site_id" json:"-"`
Visitors int64 `db:"visitors"`
Pageviews int64 `db:"pageviews"`
Sessions int64 `db:"sessions"`
BounceRate float64 `db:"bounce_rate"`
AvgDuration float64 `db:"avg_duration"`
KnownDurations int64 `db:"known_durations" json:",omitempty"`
Date time.Time `db:"ts" json:",omitempty"`
}
func (s *SiteStats) FormattedDuration() string {
return fmt.Sprintf("%d:%d", int(s.AvgDuration/60.00), (int(s.AvgDuration) % 60))
}
func (s *SiteStats) HandlePageview(p *Pageview) {
s.Pageviews += 1
if p.Duration > 0.00 {
s.KnownDurations += 1
s.AvgDuration = s.AvgDuration + ((float64(p.Duration) - s.AvgDuration) * 1 / float64(s.KnownDurations))
}
if p.IsNewVisitor {
s.Visitors += 1
}
if p.IsNewSession {
s.Sessions += 1
if p.IsBounce {
s.BounceRate = ((float64(s.Sessions-1) * s.BounceRate) + 1) / (float64(s.Sessions))
} else {
s.BounceRate = ((float64(s.Sessions-1) * s.BounceRate) + 0) / (float64(s.Sessions))
}
}
}