aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorFelix Hanley <felix@userspace.com.au>2020-03-23 04:29:12 +0000
committerFelix Hanley <felix@userspace.com.au>2020-03-23 04:29:12 +0000
commit8eb8549b9121e3708c697361c83f39c1dfc846b5 (patch)
treee1a8c092fcd891f56a1a787ea4e176f18214248e /cmd
parentac6468f9eac688a2fb379ea332fd45490cf80cf4 (diff)
downloadsws-8eb8549b9121e3708c697361c83f39c1dfc846b5.tar.gz
sws-8eb8549b9121e3708c697361c83f39c1dfc846b5.tar.bz2
Create CSS using SASS and add subfilters
Diffstat (limited to 'cmd')
-rw-r--r--cmd/server/country.go68
-rw-r--r--cmd/server/flash.go4
-rw-r--r--cmd/server/handlers.go26
-rw-r--r--cmd/server/helpers.go31
-rw-r--r--cmd/server/pages.go75
-rw-r--r--cmd/server/routes.go8
-rw-r--r--cmd/server/sites.go32
7 files changed, 205 insertions, 39 deletions
diff --git a/cmd/server/country.go b/cmd/server/country.go
new file mode 100644
index 0000000..bb4b22e
--- /dev/null
+++ b/cmd/server/country.go
@@ -0,0 +1,68 @@
+package main
+
+import (
+ "net/http"
+
+ "src.userspace.com.au/sws"
+)
+
+func handleCountries(db sws.SiteStore, rndr Renderer) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ ctx := r.Context()
+ site, ok := ctx.Value("site").(*sws.Site)
+ if !ok {
+ httpError(w, http.StatusBadRequest, "no site in context")
+ return
+ }
+
+ payload := newTemplateData(r)
+ payload.Site = site
+
+ begin, end := extractTimeRange(r)
+ if begin == nil || end == nil {
+ httpError(w, http.StatusBadRequest, "invalid time range")
+ return
+ }
+ payload.Begin = *begin
+ payload.End = *end
+ debug("begin", *begin)
+ debug("end", *end)
+
+ filter := map[string]interface{}{
+ "begin": *begin,
+ "end": *end,
+ }
+
+ q := r.URL.Query()
+
+ cc := q.Get("country")
+ if cc != "" {
+ filter["countryCode"] = cc
+ }
+
+ hits, err := db.GetHits(*site, filter)
+ hitSet, err := sws.NewHitSet(sws.FromHits(hits))
+ if err != nil {
+ httpError(w, http.StatusInternalServerError, err.Error())
+ return
+ }
+ hitSet.Fill(begin, end)
+ hitSet.SortByDate()
+ if err := expandPayload(hitSet, payload); err != nil {
+ httpError(w, http.StatusInternalServerError, err.Error())
+ return
+ }
+
+ // Single or multiple paths
+ if cc == "" {
+ countrySet := sws.NewCountrySet(hitSet)
+ countrySet.SortByHits()
+ payload.CountrySet = countrySet
+ }
+
+ if err := rndr.Render(w, "site", payload); err != nil {
+ httpError(w, http.StatusInternalServerError, err.Error())
+ return
+ }
+ }
+}
diff --git a/cmd/server/flash.go b/cmd/server/flash.go
index 230a64d..8fe0cb3 100644
--- a/cmd/server/flash.go
+++ b/cmd/server/flash.go
@@ -14,8 +14,8 @@ type flashCtxKey string
const (
flashInfo flashLvl = "info"
- flashError flashLvl = "error"
- flashWarn flashLvl = "warn"
+ flashError flashLvl = "danger"
+ flashWarn flashLvl = "warning"
flashSuccess flashLvl = "success"
flashQueryKey = "_flash"
diff --git a/cmd/server/handlers.go b/cmd/server/handlers.go
index ffe1b7b..985955a 100644
--- a/cmd/server/handlers.go
+++ b/cmd/server/handlers.go
@@ -10,23 +10,27 @@ import (
)
type templateData struct {
- Payload string
- Endpoint string
- User *sws.User
- Flash template.HTML
- Begin time.Time
- End time.Time
+ Domain string
+ Payload string
+ Endpoint string
+ User *sws.User
+ Flash template.HTML
+ Begin time.Time
+ End time.Time
+
Site *sws.Site
Sites []*sws.Site
- PageSet sws.PageSet
- Browsers sws.BrowserSet
- ReferrerSet sws.ReferrerSet
- CountrySet sws.CountrySet
+ PageSet *sws.PageSet
+ Page *sws.Page
+ Browsers *sws.BrowserSet
+ ReferrerSet *sws.ReferrerSet
+ CountrySet *sws.CountrySet
Hits *sws.HitSet
}
func newTemplateData(r *http.Request) *templateData {
out := &templateData{
+ Domain: domain,
Payload: "//" + domain + "/sws.js",
Endpoint: "//" + domain + "/sws.gif",
}
@@ -34,7 +38,7 @@ func newTemplateData(r *http.Request) *templateData {
flashes := flashGet(r)
var flash strings.Builder
for _, f := range flashes {
- flash.WriteString(`<span class="`)
+ flash.WriteString(`<span class="notification is-`)
flash.WriteString(string(f.Level))
flash.WriteString(`">`)
flash.WriteString(f.Message)
diff --git a/cmd/server/helpers.go b/cmd/server/helpers.go
index 17e519f..ff7fd5c 100644
--- a/cmd/server/helpers.go
+++ b/cmd/server/helpers.go
@@ -7,6 +7,8 @@ import (
"net/http"
"strconv"
"time"
+
+ "src.userspace.com.au/sws"
)
var funcMap = template.FuncMap{
@@ -23,6 +25,12 @@ var funcMap = template.FuncMap{
// TODO error
return t.In(tz)
},
+ "countryName": func(code string) string {
+ if n, ok := sws.CountryCodes[code]; ok {
+ return n
+ }
+ return "Unknown"
+ },
/*
"seq": func(start, stop, step int) []int {
count := (stop - start) / step
@@ -92,6 +100,29 @@ func extractTimeRange(r *http.Request) (*time.Time, *time.Time) {
return begin, end
}
+func expandPayload(hs *sws.HitSet, pl *templateData) error {
+ pl.Hits = hs
+
+ pageSet, err := sws.NewPageSet(hs)
+ if err != nil {
+ return err
+ }
+
+ if pageSet != nil {
+ pageSet.SortByHits()
+ pl.PageSet = pageSet
+ }
+ pl.Browsers = sws.NewBrowserSet(hs)
+ pl.CountrySet = sws.NewCountrySet(hs)
+
+ refSet := sws.NewReferrerSet(hs)
+ if refSet != nil {
+ refSet.SortByHits()
+ pl.ReferrerSet = refSet
+ }
+ return nil
+}
+
func stringPtr(s string) *string {
return &s
}
diff --git a/cmd/server/pages.go b/cmd/server/pages.go
new file mode 100644
index 0000000..702194e
--- /dev/null
+++ b/cmd/server/pages.go
@@ -0,0 +1,75 @@
+package main
+
+import (
+ "net/http"
+
+ "src.userspace.com.au/sws"
+)
+
+func handlePages(db sws.SiteStore, rndr Renderer) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ ctx := r.Context()
+ site, ok := ctx.Value("site").(*sws.Site)
+ if !ok {
+ httpError(w, http.StatusBadRequest, "no site in context")
+ return
+ }
+
+ payload := newTemplateData(r)
+ payload.Site = site
+
+ begin, end := extractTimeRange(r)
+ if begin == nil || end == nil {
+ httpError(w, http.StatusBadRequest, "invalid time range")
+ return
+ }
+ payload.Begin = *begin
+ payload.End = *end
+ debug("begin", *begin)
+ debug("end", *end)
+
+ filter := map[string]interface{}{
+ "begin": *begin,
+ "end": *end,
+ }
+
+ q := r.URL.Query()
+
+ path := q.Get("path")
+ if path != "" {
+ filter["path"] = path
+ }
+
+ hits, err := db.GetHits(*site, filter)
+ hitSet, err := sws.NewHitSet(sws.FromHits(hits))
+ if err != nil {
+ httpError(w, http.StatusInternalServerError, err.Error())
+ return
+ }
+ hitSet.Fill(begin, end)
+ hitSet.SortByDate()
+
+ payload.Page = sws.NewPage(hitSet)
+ payload.Hits = hitSet
+ payload.Browsers = sws.NewBrowserSet(hitSet)
+ payload.CountrySet = sws.NewCountrySet(hitSet)
+ payload.ReferrerSet = sws.NewReferrerSet(hitSet)
+
+ // Single or multiple paths
+ if path == "" {
+ pageSet, err := sws.NewPageSet(hitSet)
+ if err != nil {
+ httpError(w, http.StatusInternalServerError, err.Error())
+ return
+ }
+
+ pageSet.SortByHits()
+ payload.PageSet = pageSet
+ }
+
+ if err := rndr.Render(w, "pages", payload); err != nil {
+ httpError(w, http.StatusInternalServerError, err.Error())
+ return
+ }
+ }
+}
diff --git a/cmd/server/routes.go b/cmd/server/routes.go
index b9979fe..0e6462b 100644
--- a/cmd/server/routes.go
+++ b/cmd/server/routes.go
@@ -26,7 +26,9 @@ func init() {
func createRouter(db sws.Store, mmdbPath string) (chi.Router, error) {
tmplsCommon := []string{"flash.tmpl", "navbar.tmpl"}
- tmplsAuthed := append(tmplsCommon, []string{"layout.tmpl", "charts.tmpl", "timerange.tmpl"}...)
+ tmplsAuthed := append(tmplsCommon, []string{
+ "layout.tmpl", "charts.tmpl", "timerange.tmpl", "hitView.tmpl",
+ }...)
tmplsPublic := append(tmplsCommon, "layout.tmpl")
if override != "" {
@@ -39,6 +41,7 @@ func createRouter(db sws.Store, mmdbPath string) (chi.Router, error) {
tmpls, err := loadHTMLTemplateMap(map[string][]string{
"sites": append([]string{"sites.tmpl"}, tmplsAuthed...),
"site": append([]string{"site.tmpl", "worldMap.tmpl"}, tmplsAuthed...),
+ "pages": append([]string{"pages.tmpl", "worldMap.tmpl"}, tmplsAuthed...),
"home": append([]string{"home.tmpl"}, tmplsPublic...),
"login": append([]string{"login.tmpl"}, tmplsPublic...),
"user": append([]string{"user.tmpl"}, tmplsAuthed...),
@@ -136,6 +139,7 @@ func createRouter(db sws.Store, mmdbPath string) (chi.Router, error) {
r.Use(getSiteCtx(db))
r.Get("/", siteHandler)
r.Post("/", siteHandler)
+ r.Get("/pages", handlePages(db, rndr))
r.Get("/edit", handleSiteEdit(db, rndr))
r.Route("/charts", func(r chi.Router) {
@@ -174,7 +178,7 @@ func getUserCtx(db sws.UserStore) func(http.Handler) http.Handler {
_, claims, err := jwtauth.FromContext(r.Context())
if err != nil {
- log("failed to extract user from context", err)
+ //log("failed to extract user from context", err)
return
}
diff --git a/cmd/server/sites.go b/cmd/server/sites.go
index 21e26fb..61857a3 100644
--- a/cmd/server/sites.go
+++ b/cmd/server/sites.go
@@ -19,7 +19,7 @@ func handleSites(db sws.SiteStore, rndr Renderer) http.HandlerFunc {
log("invalid site:", errs)
r = flashSet(r, flashError, strings.Join(errs, "<br>"))
} else if err := db.SaveSite(site); err != nil {
- httpError(w, 500, err.Error())
+ httpError(w, http.StatusInternalServerError, err.Error())
return
}
r = flashSet(r, flashSuccess, "site created")
@@ -27,7 +27,7 @@ func handleSites(db sws.SiteStore, rndr Renderer) http.HandlerFunc {
sites, err := db.GetSites()
if err != nil {
- httpError(w, 500, err.Error())
+ httpError(w, http.StatusInternalServerError, err.Error())
return
}
@@ -35,7 +35,7 @@ func handleSites(db sws.SiteStore, rndr Renderer) http.HandlerFunc {
payload.Sites = sites
if err := rndr.Render(w, "sites", payload); err != nil {
- httpError(w, 500, err.Error())
+ httpError(w, http.StatusInternalServerError, err.Error())
return
}
}
@@ -55,7 +55,7 @@ func handleSite(db sws.SiteStore, rndr Renderer) http.HandlerFunc {
begin, end := extractTimeRange(r)
if begin == nil || end == nil {
- httpError(w, 406, "invalid time range")
+ httpError(w, http.StatusBadRequest, "invalid time range")
return
}
payload.Begin = *begin
@@ -68,38 +68,22 @@ func handleSite(db sws.SiteStore, rndr Renderer) http.HandlerFunc {
"end": *end,
})
if err != nil {
- httpError(w, 500, err.Error())
+ httpError(w, http.StatusInternalServerError, err.Error())
return
}
hitSet, err := sws.NewHitSet(sws.FromHits(hits))
if err != nil {
- httpError(w, 406, err.Error())
+ httpError(w, http.StatusInternalServerError, err.Error())
return
}
if hitSet != nil {
hitSet.Fill(begin, end)
hitSet.SortByDate()
- payload.Hits = hitSet
-
- pageSet, err := sws.NewPageSet(hitSet)
- if err != nil {
- httpError(w, 406, err.Error())
+ if err := expandPayload(hitSet, payload); err != nil {
+ httpError(w, http.StatusInternalServerError, err.Error())
return
}
-
- if pageSet != nil {
- pageSet.SortByHits()
- payload.PageSet = pageSet
- }
- payload.Browsers = sws.NewBrowserSet(hitSet)
- payload.CountrySet = sws.NewCountrySet(hitSet)
-
- refSet := sws.NewReferrerSet(hitSet)
- if refSet != nil {
- refSet.SortByHits()
- payload.ReferrerSet = refSet
- }
}
if err := rndr.Render(w, "site", payload); err != nil {