diff options
| author | Felix Hanley <felix@userspace.com.au> | 2020-03-23 04:29:12 +0000 |
|---|---|---|
| committer | Felix Hanley <felix@userspace.com.au> | 2020-03-23 04:29:12 +0000 |
| commit | 8eb8549b9121e3708c697361c83f39c1dfc846b5 (patch) | |
| tree | e1a8c092fcd891f56a1a787ea4e176f18214248e /cmd | |
| parent | ac6468f9eac688a2fb379ea332fd45490cf80cf4 (diff) | |
| download | sws-8eb8549b9121e3708c697361c83f39c1dfc846b5.tar.gz sws-8eb8549b9121e3708c697361c83f39c1dfc846b5.tar.bz2 | |
Create CSS using SASS and add subfilters
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/server/country.go | 68 | ||||
| -rw-r--r-- | cmd/server/flash.go | 4 | ||||
| -rw-r--r-- | cmd/server/handlers.go | 26 | ||||
| -rw-r--r-- | cmd/server/helpers.go | 31 | ||||
| -rw-r--r-- | cmd/server/pages.go | 75 | ||||
| -rw-r--r-- | cmd/server/routes.go | 8 | ||||
| -rw-r--r-- | cmd/server/sites.go | 32 |
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 { |
