/
rsschanges.go
59 lines (54 loc) · 1.62 KB
/
rsschanges.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
package main
import (
"encoding/xml"
"fmt"
"net/http"
)
const nbChanges = 50
func rssRecentChanges(w http.ResponseWriter, r *http.Request) error {
ctx := r.Context()
_, changes, err := dao.getGlobalHistoryList(ctx, nbChanges)
if err != nil {
return err
}
path := "/rss-recent-changes"
feedTitle := "Programming Idioms recent changes"
feedDescription := "All recent edit actions on all idioms"
itemsAsStrings := make([]string, len(changes))
for i, change := range changes {
title := "Change in [" + change.Idiom.Title + "]"
if change.Idiom.Version == 1 {
title = "Creation of [" + change.Idiom.Title + "]"
}
prev := change.Idiom.Version - 1 // always...?
itemLink := fmt.Sprintf("%s/idiom/%d/diff/%d/%d", env.Host, change.Idiom.Id, prev, change.Idiom.Version)
desc := "<br/>Edit: " + change.EditSummary +
"<br/>Contributor: " + change.IdiomOrImplLastEditor + "."
// TODO generate a short summary of the modified fields
changeDate := change.VersionDate.Format(rssPubDatelayout)
item := &RssItem{
Link: itemLink,
Title: markup2HTML(title),
Description: markup2HTML(desc),
PubDate: changeDate,
GUID: GUID{
Value: itemLink,
IsPermaLink: true,
},
}
buff, err := xml.MarshalIndent(item, " ", " ")
if err != nil {
return err
}
itemsAsStrings[i] = string(buff)
}
w.Header().Set("Content-Type", "application/rss+xml")
data := &RssFacade{
FeedTitle: feedTitle,
SiteLink: env.Host,
FeedDescription: feedDescription,
Items: itemsAsStrings,
FeedURL: env.Host + path,
}
return rssTemplate.ExecuteTemplate(w, "rss", data)
}