From f3e8731faea90976a979c0a58d1a8bfd763cbe5f Mon Sep 17 00:00:00 2001 From: Danny van Kooten Date: Sat, 10 Dec 2016 14:31:46 +0100 Subject: [PATCH] add /referrers endpoint and show table with referrers in period --- api/referrers.go | 58 ++++++++++++++++++++++++++++++++++++ api/screen-resolutions.go | 4 ++- assets/js/pages/dashboard.js | 2 +- commands/server.go | 1 + 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 api/referrers.go 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 {
-
+
diff --git a/commands/server.go b/commands/server.go index 6d674ad..b83ae6c 100644 --- a/commands/server.go +++ b/commands/server.go @@ -22,6 +22,7 @@ func startServer() { r.Handle("/api/pageviews/count/group/{period}", api.Authorize(api.GetPageviewsPeriodCountHandler)).Methods("GET") r.Handle("/api/pageviews", api.Authorize(api.GetPageviewsHandler)).Methods("GET") r.Handle("/api/languages", api.Authorize(api.GetLanguagesHandler)).Methods("GET") + r.Handle("/api/referrers", api.Authorize(api.GetReferrersHandler)).Methods("GET") r.Handle("/api/screen-resolutions", api.Authorize(api.GetScreenResolutionsHandler)).Methods("GET") r.Handle("/api/countries", api.Authorize(api.GetCountriesHandler)).Methods("GET") r.Handle("/api/browsers", api.Authorize(api.GetBrowsersHandler)).Methods("GET")