fathom/db/seed.go

196 lines
3.9 KiB
Go
Raw Normal View History

package db
import (
"github.com/dannyvankooten/ana/models"
"log"
"time"
"math/rand"
"fmt"
"github.com/Pallinder/go-randomdata"
)
var browserNames = []string {
2016-11-26 15:17:52 +00:00
"Chrome",
"Chrome",
"Firefox",
"Safari",
2016-11-26 15:17:52 +00:00
"Safari",
"Internet Explorer",
}
2016-12-05 16:16:14 +00:00
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",
2016-11-26 15:17:52 +00:00
"fr-FR",
"de-DE",
"es-ES",
}
var screenResolutions = []string {
"2560x1440",
"1920x1080",
2016-11-26 15:17:52 +00:00
"1920x1080",
"360x640",
}
func seedSite() models.Site {
// get first site or create one
var site models.Site
Conn.QueryRow("SELECT id, url FROM sites LIMIT 1").Scan(&site.ID, &site.Url)
if site.Url == "" {
site.Url = "http://local.wordpress.dev/"
site.Save(Conn)
}
return site
}
func seedPages(site models.Site) []models.Page {
var pages = make([]models.Page, 0)
homepage := models.Page{
SiteID: site.ID,
Path: "/",
Title: "Homepage",
}
homepage.Save(Conn)
contactPage := models.Page{
SiteID: site.ID,
Path: "/contact/",
Title: "Contact",
}
contactPage.Save(Conn)
aboutPage := models.Page{
SiteID: site.ID,
Path: "/about/",
Title: "About Me",
}
aboutPage.Save(Conn)
portfolioPage := models.Page{
SiteID: site.ID,
Path: "/portfolio/",
Title: "Portfolio",
}
portfolioPage.Save(Conn)
pages = append(pages, homepage)
pages = append(pages, homepage)
pages = append(pages, contactPage)
pages = append(pages, aboutPage)
pages = append(pages, portfolioPage)
return pages
}
func Seed(n int) {
site := seedSite()
pages := seedPages(site)
// prepare statement for inserting data
2016-12-08 08:16:43 +00:00
stmt, err := Conn.Prepare(`INSERT INTO visits(
page_id,
browser_language,
browser_name,
browser_version,
country,
ip_address,
referrer_url,
screen_resolution,
timestamp
) VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ? )`)
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
// insert X random hits
log.Printf("Inserting %d visits", n)
for i := 0; i < n; i++ {
2016-12-05 16:16:14 +00:00
// print a dot as progress indicator
fmt.Print(".")
// generate random timestamp
2016-11-26 15:17:52 +00:00
date := randomDateBeforeNow();
timestamp := fmt.Sprintf("%s %d:%d:%d", date.Format("2006-01-02"), randInt(10, 24), randInt(10, 60), randInt(10, 60))
visit := models.Visit{
IpAddress: randomdata.IpV4Address(),
BrowserName: randSliceElement(browserNames),
BrowserVersion: "54.0.2840.100",
BrowserLanguage: randSliceElement(browserLanguages),
ScreenResolution: randSliceElement(screenResolutions),
2016-11-26 15:17:52 +00:00
Country: randomdata.Country(randomdata.TwoCharCountry),
ReferrerUrl: "",
Timestamp: timestamp,
}
2016-12-05 16:16:14 +00:00
// insert between 1-4 pageviews for this visitor
for j := 0; j < randInt(1, 4); j++ {
page := pages[randInt(0, len(pages))]
visit.PageID = page.ID
2016-12-05 16:16:14 +00:00
_, err = stmt.Exec(
visit.PageID,
2016-12-05 16:16:14 +00:00
visit.BrowserLanguage,
visit.BrowserName,
visit.BrowserVersion,
visit.Country,
visit.IpAddress,
visit.ReferrerUrl,
visit.ScreenResolution,
visit.Timestamp,
)
if err != nil {
log.Fatal(err)
}
}
}
}
2016-11-26 15:17:52 +00:00
func randomDate() time.Time {
2016-12-05 16:16:14 +00:00
now := time.Now()
month := months[randInt(0, len(months))]
t := time.Date(now.Year(), month, randInt(1,31), randInt(0,23), randInt(0,59), randInt(0,59), 0, time.UTC)
return t
2016-11-26 15:17:52 +00:00
}
func randomDateBeforeNow() time.Time {
2016-12-05 16:16:14 +00:00
now := time.Now()
2016-11-26 15:17:52 +00:00
date := randomDate()
2016-12-05 16:16:14 +00:00
for( date.After(now) ) {
2016-11-26 15:17:52 +00:00
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)
}