mediocre-blog/srv/src/http/feed.go

77 lines
1.7 KiB
Go
Raw Normal View History

2022-05-20 23:24:52 +00:00
package http
import (
"fmt"
"net/http"
"path/filepath"
"github.com/gorilla/feeds"
"github.com/mediocregopher/blog.mediocregopher.com/srv/http/apiutil"
2022-05-20 23:51:41 +00:00
"github.com/mediocregopher/blog.mediocregopher.com/srv/post"
2022-05-20 23:24:52 +00:00
)
func (a *api) renderFeedHandler() http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
2022-05-20 23:51:41 +00:00
tag := r.FormValue("tag")
var (
posts []post.StoredPost
err error
)
if tag == "" {
posts, _, err = a.params.PostStore.Get(0, 20)
} else {
posts, err = a.params.PostStore.GetByTag(tag)
}
if err != nil {
apiutil.InternalServerError(rw, r, fmt.Errorf("fetching recent posts: %w", err))
return
}
2022-05-20 23:24:52 +00:00
author := &feeds.Author{
Name: "mediocregopher",
}
publicURL := a.params.PublicURL.String()
feed := feeds.Feed{
Title: "Mediocre Blog",
Link: &feeds.Link{Href: publicURL + "/"},
Description: "A mix of tech, art, travel, and who knows what else.",
Author: author,
}
2022-05-20 23:51:41 +00:00
for _, post := range posts {
2022-05-20 23:24:52 +00:00
if post.PublishedAt.After(feed.Updated) {
feed.Updated = post.PublishedAt
}
if post.LastUpdatedAt.After(feed.Updated) {
feed.Updated = post.LastUpdatedAt
}
postURL := publicURL + filepath.Join("/posts", post.ID)
feed.Items = append(feed.Items, &feeds.Item{
Title: post.Title,
Link: &feeds.Link{Href: postURL},
Author: author,
Description: post.Description,
Id: postURL,
Updated: post.LastUpdatedAt,
Created: post.PublishedAt,
})
}
if err := feed.WriteAtom(rw); err != nil {
apiutil.InternalServerError(rw, r, fmt.Errorf("writing atom feed: %w", err))
return
}
})
}