2018-05-06 09:53:19 +00:00
|
|
|
package models
|
|
|
|
|
|
|
|
import (
|
2018-08-01 12:03:44 +00:00
|
|
|
"fmt"
|
2018-05-06 09:53:19 +00:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type SiteStats struct {
|
2018-10-05 12:19:11 +00:00
|
|
|
New bool `db:"-" json:"-" `
|
2018-09-25 13:03:07 +00:00
|
|
|
SiteID int64 `db:"site_id"`
|
2018-05-28 13:31:40 +00:00
|
|
|
Visitors int64 `db:"visitors"`
|
|
|
|
Pageviews int64 `db:"pageviews"`
|
|
|
|
Sessions int64 `db:"sessions"`
|
|
|
|
BounceRate float64 `db:"bounce_rate"`
|
|
|
|
AvgDuration float64 `db:"avg_duration"`
|
2018-06-04 10:53:17 +00:00
|
|
|
KnownDurations int64 `db:"known_durations" json:",omitempty"`
|
2018-05-28 13:31:40 +00:00
|
|
|
Date time.Time `db:"date" json:",omitempty"`
|
2018-05-06 09:53:19 +00:00
|
|
|
}
|
2018-08-01 12:03:44 +00:00
|
|
|
|
|
|
|
func (s *SiteStats) FormattedDuration() string {
|
|
|
|
return fmt.Sprintf("%d:%d", int(s.AvgDuration/60.00), (int(s.AvgDuration) % 60))
|
|
|
|
}
|
2018-08-09 12:43:42 +00:00
|
|
|
|
|
|
|
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))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|