github.com/aleksi/gonuts.io@v0.0.0-20130622121132-3b0f2d1999fb/app/gonuts/controllers/nuts.go (about) 1 package controllers 2 3 import ( 4 "appengine" 5 "appengine/datastore" 6 "bytes" 7 "fmt" 8 "html/template" 9 "net/http" 10 11 "gonuts" 12 ) 13 14 func nutsHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) { 15 d := make(ContentData) 16 apiCall := r.Header.Get("Accept") == "application/json" 17 18 // TODO: no need to load all, then render all - replace with chunking 19 var nuts []gonuts.Nut 20 var err error 21 var title string 22 vendor := r.URL.Query().Get(":vendor") 23 q := r.URL.Query().Get("q") 24 if vendor != "" { 25 title = fmt.Sprintf("%s's Nuts", vendor) 26 _, err = datastore.NewQuery("Nut").Filter("Vendor=", vendor).Order("Name").GetAll(c, &nuts) 27 } else if q == "" { 28 title = "All Nuts" 29 _, err = datastore.NewQuery("Nut").Order("Vendor").Order("Name").GetAll(c, &nuts) 30 } else { 31 title = fmt.Sprintf("Search %q", q) 32 res, err := gonuts.SearchIndex(c, q) 33 gonuts.LogError(c, err) 34 keys := make([]*datastore.Key, len(res)) 35 for i, pair := range res { 36 keys[i] = gonuts.NutKey(c, pair[0], pair[1]) 37 } 38 nuts = make([]gonuts.Nut, len(keys)) 39 err = datastore.GetMulti(c, keys, nuts) 40 } 41 gonuts.LogError(c, err) 42 d["Nuts"] = nuts 43 status := http.StatusOK 44 if len(nuts) == 0 { 45 status = http.StatusNotFound 46 } 47 48 if apiCall { 49 d["Message"] = title 50 ServeJSON(w, status, d) 51 return 52 } 53 54 var content bytes.Buffer 55 gonuts.PanicIfErr(Base.ExecuteTemplate(&content, "nuts.html", d)) 56 57 bd := BaseData{ 58 Tabtitle: title, 59 Title: title, 60 Content: template.HTML(content.String()), 61 } 62 63 w.WriteHeader(status) 64 gonuts.PanicIfErr(Base.Execute(w, &bd)) 65 }