mirror of https://github.com/status-im/fathom.git
63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package datastore
|
|
|
|
import (
|
|
"database/sql"
|
|
|
|
"github.com/usefathom/fathom/pkg/models"
|
|
)
|
|
|
|
// GetVisitorByKey ...
|
|
func GetVisitorByKey(key string) (*models.Visitor, error) {
|
|
v := &models.Visitor{}
|
|
query := dbx.Rebind(`SELECT v.id FROM visitors v WHERE v.visitor_key = ? LIMIT 1`)
|
|
err := dbx.Get(v, query, key)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, ErrNoResults
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
return v, nil
|
|
}
|
|
|
|
// SaveVisitor inserts a single visitor model into the connected database
|
|
func SaveVisitor(v *models.Visitor) error {
|
|
query := dbx.Rebind(`INSERT INTO visitors(visitor_key, device_os, browser_name, browser_version, browser_language, screen_resolution, country) VALUES( ?, ?, ?, ?, ?, ?, ? )`)
|
|
result, err := dbx.Exec(query, v.Key, v.DeviceOS, v.BrowserName, v.BrowserVersion, v.BrowserLanguage, v.ScreenResolution, v.Country)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
v.ID, _ = result.LastInsertId()
|
|
return nil
|
|
}
|
|
|
|
// RealtimeVisitors returns the total number of visitors in the last 3 minutes
|
|
// TODO: Query visitors table instead, using a last_seen column.
|
|
func RealtimeVisitors() (int, error) {
|
|
var result int
|
|
query := dbx.Rebind(`
|
|
SELECT COUNT(DISTINCT(pv.visitor_id))
|
|
FROM pageviews pv
|
|
WHERE pv.timestamp >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 HOUR_MINUTE) AND pv.timestamp <= CURRENT_TIMESTAMP`)
|
|
err := dbx.Get(&result, query)
|
|
return result, err
|
|
}
|
|
|
|
func VisitorCountPerDay(before string, after string) ([]*models.Total, error) {
|
|
var results []*models.Total
|
|
|
|
query := dbx.Rebind(`
|
|
SELECT
|
|
COUNT(DISTINCT(pv.visitor_id)) AS count,
|
|
DATE_FORMAT(pv.timestamp, '%Y-%m-%d') AS date_group
|
|
FROM pageviews pv
|
|
WHERE pv.timestamp < ? AND pv.timestamp > ?
|
|
GROUP BY date_group`)
|
|
|
|
err := dbx.Select(&results, query, before, after)
|
|
return results, err
|
|
}
|