forked from kennygrant/gohackernews
/
home.go
69 lines (57 loc) · 1.88 KB
/
home.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package storyactions
import (
"fmt"
"net/http"
"strings"
"github.com/fragmenta/mux"
"github.com/fragmenta/server"
"github.com/fragmenta/server/config"
"github.com/fragmenta/view"
"github.com/kennygrant/gohackernews/src/lib/session"
"github.com/kennygrant/gohackernews/src/lib/stats"
"github.com/kennygrant/gohackernews/src/stories"
)
// HandleHome displays a list of stories using gravity to order them
// used for the home page for gravity rank see votes.go
// responds to GET /
func HandleHome(w http.ResponseWriter, r *http.Request) error {
stats.RegisterHit(r)
// Build a query
q := stories.Query().Limit(listLimit)
// Select only above 0 points, Order by rank, then points, then name
q.Where("points > 0").Order("rank desc, points desc, id desc")
// Fetch the params
params, err := mux.Params(r)
if err != nil {
return server.InternalError(err)
}
// Set the offset in pages if we have one
page := int(params.GetInt("page"))
if page > 0 {
q.Offset(listLimit * page)
}
// Fetch the stories
results, err := stories.FindAll(q)
if err != nil {
return server.InternalError(err)
}
// Render the template
view := view.NewRenderer(w, r)
view.AddKey("page", page)
view.AddKey("stories", results)
view.Template("stories/views/index.html.got")
view.AddKey("pubdate", storiesModTime(results))
view.AddKey("meta_title", fmt.Sprintf("%s - %s", config.Get("meta_title"), config.Get("meta_desc")))
view.AddKey("meta_desc", config.Get("meta_desc"))
view.AddKey("meta_keywords", config.Get("meta_keywords"))
view.AddKey("meta_foot", config.Get("meta_desc"))
view.AddKey("meta_rss", storiesXMLPath(w, r))
view.AddKey("userCount", stats.UserCount())
view.AddKey("currentUser", session.CurrentUser(w, r))
// For rss feeds use xml templates
if strings.HasSuffix(r.URL.Path, ".xml") {
view.Layout("")
view.Template("stories/views/index.xml.got")
}
return view.Render()
}