// HandleShow displays a single story func HandleShow(context router.Context) error { // Find the story story, err := stories.Find(context.ParamInt("id")) if err != nil { return router.InternalError(err) } // Find the comments for this story // Fetch the comments q := comments.Where("story_id=?", story.Id).Order(comments.RankOrder) rootComments, err := comments.FindAll(q) if err != nil { return router.InternalError(err) } // Render the template view := view.New(context) view.AddKey("story", story) view.AddKey("meta_title", story.Name) view.AddKey("meta_desc", story.Summary) view.AddKey("meta_keywords", story.Name) view.AddKey("comments", rootComments) view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) return view.Render() }
// HandleHome displays a list of stories using gravity to order them // used for the home page for gravity rank see votes.go func HandleHome(context router.Context) error { // 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 stories results, err := stories.FindAll(q) if err != nil { return router.InternalError(err) } // Render the template view := view.New(context) view.AddKey("stories", results) view.AddKey("meta_title", "Golang News") view.AddKey("meta_desc", "News for Go Hackers, in the style of Hacker News. A curated selection of the latest links about the Go programming language.") view.AddKey("meta_keywords", "golang news, blog, links, go developers, go web apps, web applications, fragmenta") view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) view.Template("stories/views/index.html.got") return view.Render() }
// HandleCreateShow handles GET users/create func HandleCreateShow(context router.Context) error { // No auth as anyone can create users in this app // Setup view := view.New(context) user := users.New() view.AddKey("user", user) view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) // Serve return view.Render() }
// HandleShow displays a single comment func HandleShow(context router.Context) error { // Find the comment comment, err := comments.Find(context.ParamInt("id")) if err != nil { return router.InternalError(err) } // No auth as all are public - if we restricted by status we might need to authorise here // Render the template view := view.New(context) view.AddKey("comment", comment) view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) return view.Render() }
// HandleCreateShow serves the create form via GET for stories func HandleCreateShow(context router.Context) error { // Authorise err := authorise.Path(context) if err != nil { return router.NotAuthorizedError(err) } // Render the template view := view.New(context) story := stories.New() view.AddKey("story", story) view.AddKey("meta_title", "Go Hacker News Submit") view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) return view.Render() }
// HandleCreateShow serves the create form via GET for comments func HandleCreateShow(context router.Context) error { // Authorise err := authorise.Path(context) if err != nil { return router.NotAuthorizedError(err) } // Render the template view := view.New(context) comment := comments.New() view.AddKey("comment", comment) // TODO: May have to validate parent_id or story_id view.AddKey("story_id", context.ParamInt("story_id")) view.AddKey("parent_id", context.ParamInt("parent_id")) view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) return view.Render() }
// HandleUpdateShow renders the form to update a story func HandleUpdateShow(context router.Context) error { // Find the story story, err := stories.Find(context.ParamInt("id")) if err != nil { return router.NotFoundError(err) } // Authorise update story err = authorise.Resource(context, story) if err != nil { return router.NotAuthorizedError(err) } // Render the template view := view.New(context) view.AddKey("story", story) view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) return view.Render() }
// HandleUpdateShow serves a get request at /users/1/update (show form to update) func HandleUpdateShow(context router.Context) error { // Setup context for template view := view.New(context) user, err := users.Find(context.ParamInt("id")) if err != nil { context.Logf("#error Error finding user %s", err) return router.NotFoundError(err) } // Authorise err = authorise.Resource(context, user) if err != nil { return router.NotAuthorizedError(err) } view.AddKey("user", user) view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) return view.Render() }
// HandleIndex displays a list of stories at /stories func HandleIndex(context router.Context) error { // Build a query q := stories.Query().Limit(listLimit) // Order by date by default q.Where("points > -6").Order("created_at desc") // Filter if necessary - this assumes name and summary cols filter := context.Param("filter") if len(filter) > 0 { context.Logf("FILTER %s", filter) // Replace special characters with escaped sequence filter = strings.Replace(filter, "_", "\\_", -1) filter = strings.Replace(filter, "%", "\\%", -1) // initially very simple, do ilike query for filter with wildcards q.Where("stories.name ILIKE ?", "%"+filter+"%") // If filtering, order by rank, not by date q.Order("rank desc, points desc, id desc") } // Fetch the stories results, err := stories.FindAll(q) if err != nil { return router.InternalError(err) } // Render the template view := view.New(context) view.AddKey("filter", filter) view.AddKey("stories", results) view.AddKey("meta_title", "Go Hacker News Links") view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) return view.Render() }
// HandleIndex displays a list of comments func HandleIndex(context router.Context) error { // No auth this is public // Build a query to fetch latest 100 comments q := comments.Query().Limit(100).Order("created_at desc") // Filter on user id - we only show the actual user's comments // so not a nested view as in HN userID := context.ParamInt("u") if userID > 0 { q.Where("user_id=?", userID) } // Filter if necessary - this assumes name and summary cols filter := context.Param("filter") if len(filter) > 0 { filter = strings.Replace(filter, "&", "", -1) filter = strings.Replace(filter, " ", "", -1) filter = strings.Replace(filter, " ", " & ", -1) q.Where("(to_tsvector(text) @@ to_tsquery(?) )", filter) } // Fetch the comments results, err := comments.FindAll(q) if err != nil { return router.InternalError(err) } // Render the template view := view.New(context) view.AddKey("filter", filter) view.AddKey("comments", results) view.AddKey("meta_title", "Comments") view.AddKey("authenticity_token", authorise.CreateAuthenticityToken(context)) return view.Render() }