Showcase xml feed
This commit is contained in:
parent
ae12ef0e8c
commit
2df9390993
|
@ -43,6 +43,28 @@
|
|||
{{ end }}
|
||||
{{ else if .Snippets }}
|
||||
{{ range .Snippets }}
|
||||
<entry>
|
||||
<title>New showcase item by {{ .OwnerName }}</title>
|
||||
<link rel="alternative" type="text/html" href="{{ .Url }}" />
|
||||
<id>{{ .UUID }}</id>
|
||||
<published>{{ rfc3339 .Date }}</published>
|
||||
<author>
|
||||
<name>{{ .OwnerName }}</name>
|
||||
<uri>{{ .OwnerUrl }}</uri>
|
||||
</author>
|
||||
<content type="xhtml">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml">
|
||||
{{ .Description }}
|
||||
{{ if snippetimage . }}
|
||||
<img src="{{ .AssetUrl }}"/>
|
||||
{{ else if snippetvideo . }}
|
||||
<video src="{{ .AssetUrl }}" controls="true"/>
|
||||
{{ else if snippetaudio . }}
|
||||
<audio src="{{ .AssetUrl }}" controls="true"/>
|
||||
{{ end }}
|
||||
</div>
|
||||
</content>
|
||||
</entry>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</feed>
|
||||
|
|
|
@ -234,6 +234,7 @@ type TimelineItem struct {
|
|||
Class string
|
||||
Date time.Time
|
||||
Url string
|
||||
UUID string
|
||||
|
||||
OwnerAvatarUrl string
|
||||
OwnerName string
|
||||
|
|
|
@ -140,7 +140,7 @@ type AtomFeedData struct {
|
|||
FeedType FeedType
|
||||
Posts []templates.PostListItem
|
||||
Projects []templates.Project
|
||||
Snippets []int // TODO(asaf): Actually do this
|
||||
Snippets []templates.TimelineItem
|
||||
}
|
||||
|
||||
func AtomFeed(c *RequestContext) ResponseData {
|
||||
|
@ -248,8 +248,55 @@ func AtomFeed(c *RequestContext) ResponseData {
|
|||
templateProject.Owners = append(templateProject.Owners, templates.UserToTemplate(&owner.User, ""))
|
||||
}
|
||||
c.Perf.EndBlock()
|
||||
updated := time.Now()
|
||||
if len(feedData.Projects) > 0 {
|
||||
updated = feedData.Projects[0].DateApproved
|
||||
}
|
||||
feedData.Updated = updated
|
||||
case "showcase":
|
||||
// TODO(asaf): Implement this
|
||||
feedData.Title = "Showcase | Site-wide | Handmade.Network"
|
||||
feedData.Subtitle = feedData.Title
|
||||
feedData.FeedType = FeedTypeShowcase
|
||||
feedData.FeedID = FeedIDShowcase
|
||||
feedData.AtomFeedUrl = hmnurl.BuildAtomFeedForShowcase()
|
||||
feedData.FeedUrl = hmnurl.BuildShowcase()
|
||||
|
||||
c.Perf.StartBlock("SQL", "Fetch showcase snippets")
|
||||
type snippetQuery struct {
|
||||
Owner models.User `db:"owner"`
|
||||
Snippet models.Snippet `db:"snippet"`
|
||||
Asset *models.Asset `db:"asset"`
|
||||
DiscordMessage *models.DiscordMessage `db:"discord_message"`
|
||||
}
|
||||
snippetQueryResult, err := db.Query(c.Context(), c.Conn, snippetQuery{},
|
||||
`
|
||||
SELECT $columns
|
||||
FROM
|
||||
handmade_snippet AS snippet
|
||||
INNER JOIN auth_user AS owner ON owner.id = snippet.owner_id
|
||||
LEFT JOIN handmade_asset AS asset ON asset.id = snippet.asset_id
|
||||
LEFT JOIN handmade_discordmessage AS discord_message ON discord_message.id = snippet.discord_message_id
|
||||
ORDER BY snippet.when DESC
|
||||
LIMIT $1
|
||||
`,
|
||||
itemsPerFeed,
|
||||
)
|
||||
if err != nil {
|
||||
return ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch snippets"))
|
||||
}
|
||||
snippetQuerySlice := snippetQueryResult.ToSlice()
|
||||
for _, s := range snippetQuerySlice {
|
||||
row := s.(*snippetQuery)
|
||||
timelineItem := SnippetToTimelineItem(&row.Snippet, row.Asset, row.DiscordMessage, &row.Owner, c.Theme)
|
||||
timelineItem.UUID = uuid.NewSHA1(uuid.NameSpaceURL, []byte(timelineItem.Url)).URN()
|
||||
feedData.Snippets = append(feedData.Snippets, timelineItem)
|
||||
}
|
||||
c.Perf.EndBlock()
|
||||
updated := time.Now()
|
||||
if len(feedData.Snippets) > 0 {
|
||||
updated = feedData.Snippets[0].Date
|
||||
}
|
||||
feedData.Updated = updated
|
||||
default:
|
||||
return FourOhFour(c)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue