// Count returns the number of results for the query. func (g *Goon) Count(q *datastore.Query) (int, error) { return q.Count(g.Context) }
func handler(w http.ResponseWriter, r *http.Request) { c := appengine.NewContext(r) u := user.Current(c) log.Infof(c, "Got a visitor to the front page!") //keep log in the imports //Check if the request is before or after to create the right query //The GET requests for the stories will be based around the SubmitDateTime //Using "after" will return stories after a certain date from newest to oldest //Using "before" will return stories before a certain date from oldest to newest //Default is to use the latest 3 submissions afterDate := r.FormValue("after") beforeDate := r.FormValue("before") returnLimit := 3 showPrevLink := false var q *datastore.Query if afterDate != "" { showPrevLink = true //Get the results in descending order for newest to oldest afterDate = strings.Replace(afterDate, "%20", " ", -1) //replace all %20 with " " ttime, err := time.Parse(DateTimeDatastoreFormat, afterDate) if err != nil { serveError(c, w, err) return } q = datastore.NewQuery(WebSubmissionEntityName). Filter("SubmitDateTime <", ttime). Order("-SubmitDateTime"). Limit(returnLimit) } else if beforeDate != "" { showPrevLink = true //Get the results is ascending order from oldest to newest beforeDate = strings.Replace(beforeDate, "%20", " ", -1) //replace all %20 with " " ttime, err := time.Parse(DateTimeDatastoreFormat, beforeDate) if err != nil { serveError(c, w, err) return } q = datastore.NewQuery(WebSubmissionEntityName). Filter("SubmitDateTime >", ttime). Order("SubmitDateTime"). Limit(returnLimit) //limit check at the beginning if less than the returnLimit redo from the beginning length, cerr := q.Count(c) if cerr != nil { serveError(c, w, cerr) } //TODO refactor to not duplicate the default query below if length < returnLimit { showPrevLink = false q = datastore.NewQuery(WebSubmissionEntityName). Order("-SubmitDateTime"). Limit(returnLimit) } } else { q = datastore.NewQuery(WebSubmissionEntityName). Order("-SubmitDateTime"). Limit(returnLimit) } //Populate the results struct and store the keys var pageCon PageContainer for t := q.Run(c); ; { var x WebSubmission key, err := t.Next(&x) if err == datastore.Done { break } if err != nil { // serveError(c,w,err) fmt.Fprintf(w, "nope %v", err.Error()) return } if u == nil { pageCon.Stories = append(pageCon.Stories, StoryListData{x, key, false}) } else { pageCon.Stories = append(pageCon.Stories, StoryListData{x, key, u.String() == x.SubmitBy}) } } //if we filled up the page with results there are probably more, build the //next page link length, cerr := q.Count(c) if cerr != nil { serveError(c, w, cerr) } if length == returnLimit { //get the submit datetime of the last story pageCon.AfterLink = pageCon.Stories[returnLimit-1].Story.SubmitDateTime.Format(DateTimeDatastoreFormat) } //If it was a prev page press reverse the result array to get it back into chronological order if length >= 1 && beforeDate != "" { for i, j := 0, len(pageCon.Stories)-1; i < j; i, j = i+1, j-1 { pageCon.Stories[i], pageCon.Stories[j] = pageCon.Stories[j], pageCon.Stories[i] } } //prev page link //check the length because going forward you can have null data if showPrevLink && length >= 1 { pageCon.BeforeLink = pageCon.Stories[0].Story.SubmitDateTime.Format(DateTimeDatastoreFormat) } //build and show the page page := template.Must(template.ParseFiles( "public/templates/_base.html", "public/templates/storylist.html", )) if err := page.Execute(w, pageCon); err != nil { serveError(c, w, err) fmt.Fprintf(w, "\n%v\n%v", err.Error(), pageCon) return } }