// mainHandler tracks how many times each user has visited this page. func mainHandler(w http.ResponseWriter, r *http.Request) *appError { if r.URL.Path != "/" { http.NotFound(w, r) return nil } ctx := appengine.NewContext(r) u := user.Current(ctx) if u == nil { login, err := user.LoginURL(ctx, r.URL.String()) if err != nil { return &appError{err, "Error finding login URL", http.StatusInternalServerError} } http.Redirect(w, r, login, http.StatusFound) return nil } logoutURL, err := user.LogoutURL(ctx, "/") if err != nil { return &appError{err, "Error finding logout URL", http.StatusInternalServerError} } // Display hello page. tbl := client.Open(tableName) rmw := bigtable.NewReadModifyWrite() rmw.Increment(familyName, u.Email, 1) row, err := tbl.ApplyReadModifyWrite(ctx, u.Email, rmw) if err != nil { return &appError{err, "Error applying ReadModifyWrite to row: " + u.Email, http.StatusInternalServerError} } data := struct { Username, Logout string Visits uint64 }{ Username: u.Email, // Retrieve the most recently edited column. Visits: binary.BigEndian.Uint64(row[familyName][0].Value), Logout: logoutURL, } var buf bytes.Buffer if err := tmpl.Execute(&buf, data); err != nil { return &appError{err, "Error writing template", http.StatusInternalServerError} } buf.WriteTo(w) return nil }
func handleMainPage(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { http.Error(w, "GET requests only", http.StatusMethodNotAllowed) return } if r.URL.Path != "/" { http.NotFound(w, r) return } ctx := appengine.NewContext(r) tic := time.Now() q := datastore.NewQuery("Greeting").Ancestor(guestbookKey(ctx)).Order("-Date").Limit(10) var gg []*Greeting if _, err := q.GetAll(ctx, &gg); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) log.Errorf(ctx, "GetAll: %v", err) return } log.Infof(ctx, "Datastore lookup took %s", time.Since(tic).String()) log.Infof(ctx, "Rendering %d greetings", len(gg)) var email, logout, login string if u := user.Current(ctx); u != nil { logout, _ = user.LogoutURL(ctx, "/") email = u.Email } else { login, _ = user.LoginURL(ctx, "/") } data := struct { Greetings []*Greeting Login, Logout, Email string }{ Greetings: gg, Login: login, Logout: logout, Email: email, } w.Header().Set("Content-Type", "text/html; charset=utf-8") if err := tpl.ExecuteTemplate(w, "guestbook.html", data); err != nil { log.Errorf(ctx, "%v", err) } }