From 8406cd6fd6d5f1c9e62b97e67ffb3703c14cb89b Mon Sep 17 00:00:00 2001 From: Peter Stuifzand Date: Sat, 29 Sep 2018 22:08:14 +0200 Subject: [PATCH] Move handler to own type and add logout --- indieauth.go | 46 ++++++++++--- main.go | 185 +++++++++++++++++++++++++++++---------------------- 2 files changed, 143 insertions(+), 88 deletions(-) diff --git a/indieauth.go b/indieauth.go index 731879a..b5610c8 100644 --- a/indieauth.go +++ b/indieauth.go @@ -32,16 +32,37 @@ func (h *IndieAuthHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodGet { if r.URL.Path == "" { - fmt.Fprint(w, ` - + fmt.Fprint(w, ` -
-
-
- + + Login - Track Me + + + + + + +
+
+ +

Login in with your own website

+
+ +
+ +
+
+
+
+ +
+
+ +
-
- + `) return @@ -66,6 +87,15 @@ func (h *IndieAuthHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } return + } else if r.URL.Path == "logout" { + sess.LoggedIn = false + sess.State = "" + sess.Me = "" + sess.AuthorizationEndpoint = "" + sess.NextURI = "" + sess.RedirectURI = "" + http.Redirect(w, r, "/", 302) + return } } else if r.Method == http.MethodPost { r.ParseForm() diff --git a/main.go b/main.go index 5ce5241..157d877 100644 --- a/main.go +++ b/main.go @@ -23,13 +23,14 @@ var indexPageTemplate = ` content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> Add moments of your day -
+

Logged in as: {{ .Me }} | Logout

+

Remember moments: N minutes since your last memo

@@ -121,6 +122,105 @@ type Moment struct { Memo string } +type indexHandler struct { + DB *bolt.DB +} + +func (h *indexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + sess, err := NewSession(w, r) + if err != nil { + log.Printf("Error loading session: %s", err) + return + } + defer sess.Flush() + + if !sess.LoggedIn { + http.Redirect(w, r, "/auth/", 302) + return + } + + moments, err := loadMoments(h.DB, time.Now().Format("2006-01-02")) + if err != nil { + log.Println(err) + } + + type indexPageInfo struct { + Moments []Moment + LastMomentSeconds int64 + Me string + } + + indexPage := indexPageInfo{Moments: moments} + indexPage.Me = sess.Me + + if len(moments) > 0 { + a := moments + for i := len(a)/2 - 1; i >= 0; i-- { + opp := len(a) - 1 - i + a[i], a[opp] = a[opp], a[i] + } + lastMoment := moments[0] + indexPage.LastMomentSeconds = lastMoment.Time.Unix() + } + + t, err := template.New("index").Parse(indexPageTemplate) + if err != nil { + log.Println(err) + return + } + + err = t.Execute(w, indexPage) + if err != nil { + log.Println(err) + return + } +} + +type momentHandler struct { + DB *bolt.DB +} + +func (mh *momentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + defer r.Body.Close() + sess, err := NewSession(w, r) + if err != nil { + log.Println(err) + return + } + defer sess.Flush() + + if r.Method == http.MethodGet { + moments, err := loadMoments(mh.DB, "") + if err != nil { + log.Println(err) + } + + w.Header().Add("Content-Type", "application/json; charset=utf8") + + err = json.NewEncoder(w).Encode(&moments) + if err != nil { + log.Println(err) + } + } else if r.Method == http.MethodPost { + // save input values + err := r.ParseForm() + if err != nil { + log.Println(err) + return + } + memo := r.FormValue("memo") + timestamp := time.Now() + err = saveMemo(mh.DB, timestamp, memo) + if err != nil { + log.Println(err) + } + http.Redirect(w, r, "/", http.StatusFound) + } else { + http.Error(w, "Method Not Allowed", 405) + return + } +} + // main is the main function func main() { fmt.Println("Starting tracking backend server") @@ -136,86 +236,11 @@ func main() { indieAuthHandler := &IndieAuthHandler{} http.Handle("/auth/", http.StripPrefix("/auth/", indieAuthHandler)) - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - sess, err := NewSession(w, r) - if err != nil { - log.Printf("Error loading session: %s", err) - return - } - defer sess.Flush() + ih := &indexHandler{DB: db} + http.Handle("/", ih) - moments, err := loadMoments(db, time.Now().Format("2006-01-02")) - if err != nil { - log.Println(err) - } - - type indexPageInfo struct { - Moments []Moment - LastMomentSeconds int64 - } - - indexPage := indexPageInfo{Moments: moments} - - if len(moments) > 0 { - a := moments - for i := len(a)/2 - 1; i >= 0; i-- { - opp := len(a) - 1 - i - a[i], a[opp] = a[opp], a[i] - } - lastMoment := moments[0] - indexPage.LastMomentSeconds = lastMoment.Time.Unix() - } - - t, err := template.New("index").Parse(indexPageTemplate) - if err != nil { - log.Println(err) - return - } - - err = t.Execute(w, indexPage) - if err != nil { - log.Println(err) - return - } - }) - http.HandleFunc("/moment", func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - sess, err := NewSession(w, r) - if err != nil{ - log.Println(err) - return - } - defer sess.Flush() - - if r.Method == http.MethodGet { - moments, err := loadMoments(db, "") - if err != nil { - log.Println(err) - } - - err = json.NewEncoder(w).Encode(&moments) - if err != nil { - log.Println(err) - } - } else if r.Method == http.MethodPost { - // save input values - err := r.ParseForm() - if err != nil { - log.Println(err) - return - } - memo := r.FormValue("memo") - timestamp := time.Now() - err = saveMemo(db, timestamp, memo) - if err != nil { - log.Println(err) - } - http.Redirect(w, r, "/", http.StatusFound) - } else { - http.Error(w, "Method Not Allowed", 405) - return - } - }) + mh := &momentHandler{DB: db} + http.Handle("/moment", mh) log.Fatal(http.ListenAndServe(":8096", nil)) }