mirror of
https://github.com/writefreely/writefreely
synced 2024-11-24 17:43:05 +00:00
f31e4d650d
This re-uses the HTMLContent feed for the full HTML content in the RSS feed, instead of again generating HTML from Markdown. This keeps things more consistent throughout the application and reduces work when rendering the feed.
121 lines
2.8 KiB
Go
121 lines
2.8 KiB
Go
/*
|
|
* Copyright © 2018-2020 A Bunch Tell LLC.
|
|
*
|
|
* This file is part of WriteFreely.
|
|
*
|
|
* WriteFreely is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License, included
|
|
* in the LICENSE file in this source code package.
|
|
*/
|
|
|
|
package writefreely
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
. "github.com/gorilla/feeds"
|
|
"github.com/gorilla/mux"
|
|
stripmd "github.com/writeas/go-strip-markdown"
|
|
"github.com/writeas/web-core/log"
|
|
)
|
|
|
|
func ViewFeed(app *App, w http.ResponseWriter, req *http.Request) error {
|
|
alias := collectionAliasFromReq(req)
|
|
|
|
// Display collection if this is a collection
|
|
var c *Collection
|
|
var err error
|
|
if app.cfg.App.SingleUser {
|
|
c, err = app.db.GetCollectionByID(1)
|
|
} else {
|
|
c, err = app.db.GetCollection(alias)
|
|
}
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
silenced, err := app.db.IsUserSilenced(c.OwnerID)
|
|
if err != nil {
|
|
log.Error("view feed: get user: %v", err)
|
|
return ErrInternalGeneral
|
|
}
|
|
if silenced {
|
|
return ErrCollectionNotFound
|
|
}
|
|
c.hostName = app.cfg.App.Host
|
|
|
|
if c.IsPrivate() || c.IsProtected() {
|
|
return ErrCollectionNotFound
|
|
}
|
|
|
|
// Fetch extra data about the Collection
|
|
// TODO: refactor out this logic, shared in collection.go:fetchCollection()
|
|
coll := &DisplayCollection{CollectionObj: &CollectionObj{Collection: *c}}
|
|
if c.PublicOwner {
|
|
u, err := app.db.GetUserByID(coll.OwnerID)
|
|
if err != nil {
|
|
// Log the error and just continue
|
|
log.Error("Error getting user for collection: %v", err)
|
|
} else {
|
|
coll.Owner = u
|
|
}
|
|
}
|
|
|
|
tag := mux.Vars(req)["tag"]
|
|
if tag != "" {
|
|
coll.Posts, _ = app.db.GetPostsTagged(app.cfg, c, tag, 1, false)
|
|
} else {
|
|
coll.Posts, _ = app.db.GetPosts(app.cfg, c, 1, false, true, false)
|
|
}
|
|
|
|
author := ""
|
|
if coll.Owner != nil {
|
|
author = coll.Owner.Username
|
|
}
|
|
|
|
collectionTitle := coll.DisplayTitle()
|
|
if tag != "" {
|
|
collectionTitle = tag + " — " + collectionTitle
|
|
}
|
|
|
|
baseUrl := coll.CanonicalURL()
|
|
basePermalinkUrl := baseUrl
|
|
siteURL := baseUrl
|
|
if tag != "" {
|
|
siteURL += "tag:" + tag
|
|
}
|
|
|
|
feed := &Feed{
|
|
Title: collectionTitle,
|
|
Link: &Link{Href: siteURL},
|
|
Description: coll.Description,
|
|
Author: &Author{author, ""},
|
|
Created: time.Now(),
|
|
}
|
|
|
|
var title, permalink string
|
|
for _, p := range *coll.Posts {
|
|
title = p.PlainDisplayTitle()
|
|
permalink = fmt.Sprintf("%s%s", baseUrl, p.Slug.String)
|
|
feed.Items = append(feed.Items, &Item{
|
|
Id: fmt.Sprintf("%s%s", basePermalinkUrl, p.Slug.String),
|
|
Title: title,
|
|
Link: &Link{Href: permalink},
|
|
Description: "<![CDATA[" + stripmd.Strip(p.Content) + "]]>",
|
|
Content: string(p.HTMLContent),
|
|
Author: &Author{author, ""},
|
|
Created: p.Created,
|
|
Updated: p.Updated,
|
|
})
|
|
}
|
|
|
|
rss, err := feed.ToRss()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Fprint(w, rss)
|
|
return nil
|
|
}
|