novelty.go

Single word (yes/no) site for app engine in go
git clone https://wehaveforgeathome.hates.computer/novelty.go.git
Log | Files | Refs | LICENSE

novelty.go (1431B)


      1 package main
      2 
      3 import (
      4 	"google.golang.org/appengine"
      5 	"google.golang.org/appengine/datastore"
      6 	"html/template"
      7 	"net/http"
      8 	"os"
      9 )
     10 
     11 type Answer struct {
     12 	Value string
     13 }
     14 
     15 type Password struct {
     16 	Value string
     17 }
     18 
     19 func main() {
     20 	http.HandleFunc("/", getAnswer)
     21 	http.HandleFunc("/yes", setAnswer("yes"))
     22 	http.HandleFunc("/no", setAnswer("no"))
     23 	appengine.Main()
     24 }
     25 
     26 func getAnswer(w http.ResponseWriter, r *http.Request) {
     27 	c := appengine.NewContext(r)
     28 	k := datastore.NewKey(c, "Answer", "answer", 0, nil)
     29 	a := new(Answer)
     30 	if err := datastore.Get(c, k, a); err != nil {
     31 		http.Error(w, err.Error(), http.StatusInternalServerError)
     32 		return
     33 	}
     34 	t := template.Must(template.ParseFiles("index.template"))
     35 	if err := t.Execute(w, a); err != nil {
     36 		http.Error(w, err.Error(), http.StatusInternalServerError)
     37 	}
     38 }
     39 
     40 func setAnswer(answer string) func(w http.ResponseWriter, r *http.Request) {
     41 	return func(w http.ResponseWriter, r *http.Request) {
     42 		if _, p, ok := r.BasicAuth(); !ok || p != os.Getenv("PASSWORD") {
     43 			w.Header().Set("WWW-Authenticate", "Basic")
     44 			http.Error(w, "Unauthorized", http.StatusUnauthorized)
     45 			return
     46 		}
     47 		c := appengine.NewContext(r)
     48 		k := datastore.NewKey(c, "Answer", "answer", 0, nil)
     49 		a := Answer{
     50 			Value: answer,
     51 		}
     52 		if _, err := datastore.Put(c, k, &a); err != nil {
     53 			http.Error(w, err.Error(), http.StatusInternalServerError)
     54 			return
     55 		}
     56 		http.Redirect(w, r, "/", http.StatusFound)
     57 	}
     58 }