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  }