GoBlog/feeds.go

66 lines
1.5 KiB
Go
Raw Normal View History

2020-09-02 15:48:37 +00:00
package main
import (
"net/http"
"strings"
2020-09-02 15:48:37 +00:00
"time"
2020-10-06 17:07:48 +00:00
"github.com/gorilla/feeds"
2020-09-02 15:48:37 +00:00
)
type feedType string
const (
2020-10-06 17:07:48 +00:00
noFeed feedType = ""
rssFeed feedType = "rss"
atomFeed feedType = "atom"
jsonFeed feedType = "json"
2020-09-02 15:48:37 +00:00
)
2020-10-15 15:32:46 +00:00
func generateFeed(blog string, f feedType, w http.ResponseWriter, r *http.Request, posts []*post, title string, description string) {
2020-09-02 15:48:37 +00:00
now := time.Now()
if title == "" {
2020-10-06 17:07:48 +00:00
title = appConfig.Blogs[blog].Title
}
if description == "" {
2020-10-06 17:07:48 +00:00
description = appConfig.Blogs[blog].Description
}
2020-09-02 15:48:37 +00:00
feed := &feeds.Feed{
Title: title,
Description: description,
Link: &feeds.Link{Href: appConfig.Server.PublicAddress + strings.TrimSuffix(r.URL.Path, "."+string(f))},
2020-09-02 15:48:37 +00:00
Created: now,
}
2020-10-15 15:32:46 +00:00
for _, p := range posts {
2020-09-02 15:48:37 +00:00
feed.Add(&feeds.Item{
2020-10-15 15:32:46 +00:00
Title: p.title(),
Link: &feeds.Link{Href: appConfig.Server.PublicAddress + p.Path},
Description: p.summary(),
Id: p.Path,
2020-10-18 09:54:29 +00:00
Content: string(p.html()),
2020-09-02 15:48:37 +00:00
})
}
var feedStr string
var err error
switch f {
2020-10-06 17:07:48 +00:00
case rssFeed:
2020-10-13 11:40:16 +00:00
w.Header().Add(contentType, "application/rss+xml; charset=utf-8")
2020-09-02 15:48:37 +00:00
feedStr, err = feed.ToRss()
2020-10-06 17:07:48 +00:00
case atomFeed:
2020-10-13 11:40:16 +00:00
w.Header().Add(contentType, "application/atom+xml; charset=utf-8")
2020-09-02 15:48:37 +00:00
feedStr, err = feed.ToAtom()
2020-10-06 17:07:48 +00:00
case jsonFeed:
2020-10-13 11:40:16 +00:00
w.Header().Add(contentType, "application/feed+json; charset=utf-8")
2020-09-02 15:48:37 +00:00
feedStr, err = feed.ToJSON()
default:
return
2020-09-02 15:48:37 +00:00
}
if err != nil {
2020-10-13 11:40:16 +00:00
w.Header().Del(contentType)
2020-09-02 15:48:37 +00:00
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte(feedStr))
}