mirror of
https://github.com/status-im/fathom.git
synced 2025-02-28 19:10:36 +00:00
179 lines
3.7 KiB
Go
179 lines
3.7 KiB
Go
package datastore
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"math/rand"
|
|
"time"
|
|
|
|
randomdata "github.com/Pallinder/go-randomdata"
|
|
"github.com/dannyvankooten/ana/models"
|
|
)
|
|
|
|
var browserNames = []string{
|
|
"Chrome",
|
|
"Chrome",
|
|
"Firefox",
|
|
"Safari",
|
|
"Safari",
|
|
"Internet Explorer",
|
|
}
|
|
|
|
var months = []time.Month{
|
|
time.January,
|
|
time.February,
|
|
time.March,
|
|
time.April,
|
|
time.May,
|
|
time.June,
|
|
time.July,
|
|
time.August,
|
|
time.September,
|
|
time.October,
|
|
time.November,
|
|
time.December,
|
|
}
|
|
|
|
var browserLanguages = []string{
|
|
"en-US",
|
|
"en-US",
|
|
"nl-NL",
|
|
"fr-FR",
|
|
"de-DE",
|
|
"es-ES",
|
|
}
|
|
|
|
var screenResolutions = []string{
|
|
"2560x1440",
|
|
"1920x1080",
|
|
"1920x1080",
|
|
"360x640",
|
|
}
|
|
|
|
func seedPages() []models.Page {
|
|
var pages = make([]models.Page, 0)
|
|
|
|
homepage := models.Page{
|
|
Hostname: "wordpress.dev",
|
|
Path: "/",
|
|
Title: "Homepage",
|
|
}
|
|
SavePage(&homepage)
|
|
|
|
contactPage := models.Page{
|
|
Hostname: "wordpress.dev",
|
|
Path: "/contact/",
|
|
Title: "Contact",
|
|
}
|
|
SavePage(&contactPage)
|
|
|
|
aboutPage := models.Page{
|
|
Hostname: "wordpress.dev",
|
|
Path: "/about/",
|
|
Title: "About Me",
|
|
}
|
|
SavePage(&aboutPage)
|
|
|
|
portfolioPage := models.Page{
|
|
Hostname: "wordpress.dev",
|
|
Path: "/portfolio/",
|
|
Title: "Portfolio",
|
|
}
|
|
SavePage(&portfolioPage)
|
|
|
|
pages = append(pages, homepage)
|
|
pages = append(pages, homepage)
|
|
pages = append(pages, contactPage)
|
|
pages = append(pages, aboutPage)
|
|
pages = append(pages, portfolioPage)
|
|
return pages
|
|
}
|
|
|
|
// Seed inserts n random pageviews in the database.
|
|
func Seed(n int) {
|
|
pages := seedPages()
|
|
|
|
// insert X random hits
|
|
for i := 0; i < n; i++ {
|
|
|
|
// print a dot as progress indicator
|
|
fmt.Print(".")
|
|
date := randomDateBeforeNow()
|
|
ipAddress := randomdata.IpV4Address()
|
|
browserName := randSliceElement(browserNames)
|
|
browserVersion := "54.0"
|
|
deviceOS := "Linux"
|
|
|
|
dummyUserAgent := browserName + browserVersion + deviceOS
|
|
visitorKey := generateVisitorKey(date.Format("2006-01-02"), ipAddress, dummyUserAgent)
|
|
visitor, err := GetVisitorByKey(visitorKey)
|
|
|
|
if err != nil {
|
|
// create or find visitor
|
|
visitor := models.Visitor{
|
|
IpAddress: ipAddress,
|
|
DeviceOS: deviceOS,
|
|
BrowserName: browserName,
|
|
BrowserVersion: browserVersion,
|
|
BrowserLanguage: randSliceElement(browserLanguages),
|
|
ScreenResolution: randSliceElement(screenResolutions),
|
|
Country: randomdata.Country(randomdata.TwoCharCountry),
|
|
}
|
|
err = SaveVisitor(&visitor)
|
|
}
|
|
|
|
// generate random timestamp
|
|
timestamp := fmt.Sprintf("%s %d:%d:%d", date.Format("2006-01-02"), randInt(10, 24), randInt(10, 60), randInt(10, 60))
|
|
|
|
pv := models.Pageview{
|
|
VisitorID: visitor.ID,
|
|
ReferrerUrl: "",
|
|
ReferrerKeyword: "",
|
|
Timestamp: timestamp,
|
|
}
|
|
|
|
DB.Exec("START TRANSACTION")
|
|
|
|
// insert between 1-6 pageviews for this visitor
|
|
for j := 0; j <= randInt(1, 6); j++ {
|
|
page := pages[randInt(0, len(pages))]
|
|
pv.PageID = page.ID
|
|
SavePageview(&pv)
|
|
}
|
|
|
|
DB.Exec("COMMIT")
|
|
}
|
|
}
|
|
|
|
func randomDate() time.Time {
|
|
now := time.Now()
|
|
month := months[randInt(0, len(months))]
|
|
t := time.Date(randInt(now.Year()-1, now.Year()), month, randInt(1, 31), randInt(0, 23), randInt(0, 59), randInt(0, 59), 0, time.UTC)
|
|
return t
|
|
}
|
|
|
|
func randomDateBeforeNow() time.Time {
|
|
now := time.Now()
|
|
date := randomDate()
|
|
for date.After(now) {
|
|
date = randomDate()
|
|
}
|
|
|
|
return date
|
|
}
|
|
|
|
func randSliceElement(slice []string) string {
|
|
return slice[randInt(0, len(slice))]
|
|
}
|
|
|
|
func randInt(min int, max int) int {
|
|
return min + rand.Intn(max-min)
|
|
}
|
|
|
|
// generateVisitorKey generates the "unique" visitor key from date, user agent + screen resolution
|
|
func generateVisitorKey(date string, ipAddress string, userAgent string) string {
|
|
byteKey := md5.Sum([]byte(date + ipAddress + userAgent))
|
|
return hex.EncodeToString(byteKey[:])
|
|
}
|