diff --git a/api/referrers.go b/api/referrers.go new file mode 100644 index 0000000..9f20a0e --- /dev/null +++ b/api/referrers.go @@ -0,0 +1,58 @@ +package api + +import ( + "net/http" + "github.com/dannyvankooten/ana/db" + "encoding/json" + "strings" +) + +// URL: /api/referrers +var GetReferrersHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + before, after := getRequestedPeriods(r) + + // get total + stmt, err := db.Conn.Prepare(` + SELECT + COUNT(DISTINCT(pv.visitor_id)) + FROM pageviews pv + WHERE UNIX_TIMESTAMP(pv.timestamp) <= ? AND UNIX_TIMESTAMP(pv.timestamp) >= ?`) + checkError(err) + defer stmt.Close() + var total float32 + stmt.QueryRow(before, after).Scan(&total) + + // get rows + stmt, err = db.Conn.Prepare(` + SELECT + pv.referrer_url, + COUNT(DISTINCT(pv.visitor_id)) AS count + FROM pageviews pv + WHERE UNIX_TIMESTAMP(pv.timestamp) <= ? AND UNIX_TIMESTAMP(pv.timestamp) >= ? + AND pv.referrer_url IS NOT NULL + AND pv.referrer_url != "" + GROUP BY pv.referrer_url + ORDER BY count DESC + LIMIT ?`) + checkError(err) + defer stmt.Close() + rows, err := stmt.Query(before, after, getRequestedLimit(r)) + checkError(err) + defer rows.Close() + + results := make([]Datapoint, 0) + for rows.Next() { + var d Datapoint + err = rows.Scan(&d.Label, &d.Count); + d.Label = strings.Replace(d.Label, "http://", "", 1) + d.Label = strings.Replace(d.Label, "https://", "", 1) + d.Label = strings.TrimRight(d.Label, "/") + checkError(err) + + d.Percentage = float32(d.Count) / total * 100 + results = append(results, d) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(results) +}) diff --git a/api/screen-resolutions.go b/api/screen-resolutions.go index c117b34..e4e5f4a 100644 --- a/api/screen-resolutions.go +++ b/api/screen-resolutions.go @@ -29,12 +29,14 @@ var GetScreenResolutionsHandler = http.HandlerFunc(func(w http.ResponseWriter, r FROM pageviews pv LEFT JOIN visitors v ON v.id = pv.visitor_id WHERE UNIX_TIMESTAMP(pv.timestamp) <= ? AND UNIX_TIMESTAMP(pv.timestamp) >= ? + AND v.screen_resolution IS NOT NULL + AND v.screen_resolution != "" GROUP BY v.screen_resolution ORDER BY count DESC LIMIT ?`) checkError(err) defer stmt.Close() - rows, err := stmt.Query(before, after, defaultLimit) + rows, err := stmt.Query(before, after, getRequestedLimit(r)) checkError(err) defer rows.Close() diff --git a/assets/js/pages/dashboard.js b/assets/js/pages/dashboard.js index 466580f..cc52257 100644 --- a/assets/js/pages/dashboard.js +++ b/assets/js/pages/dashboard.js @@ -64,7 +64,7 @@ class Dashboard extends Component {