fathom/pkg/datastore/pageviews.go

56 lines
1.8 KiB
Go
Raw Normal View History

package datastore
import (
2018-05-04 10:20:37 +00:00
"database/sql"
"github.com/usefathom/fathom/pkg/models"
"time"
)
const sqlInsertPageview = `INSERT INTO raw_pageviews(session_id, pathname, is_new_visitor, is_unique, is_bounce, referrer, duration, timestamp) VALUES(?, ?, ?, ?, ?, ?, ?, ?)`
const sqlUpdatePageview = `UPDATE raw_pageviews SET is_bounce = ?, duration = ? WHERE id = ?`
const sqlSelectProcessablePageviews = `SELECT * FROM raw_pageviews WHERE ( duration > 0 OR timestamp < ? ) AND timestamp < ? LIMIT 500`
const sqlSelectMostRecentPageviewBySessionID = `SELECT * FROM raw_pageviews WHERE session_id = ? ORDER BY id DESC LIMIT 1`
// SavePageview inserts a single pageview model into the connected database
func SavePageview(p *models.Pageview) error {
query := dbx.Rebind(sqlInsertPageview)
result, err := dbx.Exec(query, p.SessionID, p.Pathname, p.IsNewVisitor, p.IsUnique, p.IsBounce, p.Referrer, p.Duration, p.Timestamp)
if err != nil {
return err
}
p.ID, _ = result.LastInsertId()
return nil
}
2018-05-04 10:20:37 +00:00
func UpdatePageview(p *models.Pageview) error {
query := dbx.Rebind(sqlUpdatePageview)
_, err := dbx.Exec(query, p.IsBounce, p.Duration, p.ID)
2018-05-04 10:20:37 +00:00
return err
}
func GetMostRecentPageviewBySessionID(sessionID string) (*models.Pageview, error) {
result := &models.Pageview{}
query := dbx.Rebind(sqlSelectMostRecentPageviewBySessionID)
err := dbx.Get(result, query, sessionID)
2018-05-04 10:20:37 +00:00
if err != nil {
if err == sql.ErrNoRows {
return nil, ErrNoResults
}
return nil, err
}
return result, nil
2018-05-04 10:20:37 +00:00
}
func GetProcessablePageviews() ([]*models.Pageview, error) {
var results []*models.Pageview
thirtyMinsAgo := time.Now().Add(-30 * time.Minute)
fiveMinsAgo := time.Now().Add(-5 * time.Minute)
query := dbx.Rebind(sqlSelectProcessablePageviews)
err := dbx.Select(&results, query, thirtyMinsAgo, fiveMinsAgo)
return results, err
}