2024-03-09 10:25:20 +01:00
|
|
|
package control
|
2024-02-18 12:41:49 +01:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2024-03-28 12:51:33 +01:00
|
|
|
"io"
|
|
|
|
"os"
|
2024-03-09 10:12:46 +01:00
|
|
|
"time"
|
2024-02-18 12:41:49 +01:00
|
|
|
|
2024-03-05 17:13:59 +01:00
|
|
|
"git.streifling.com/jason/rss"
|
2024-03-09 10:27:55 +01:00
|
|
|
"streifling.com/jason/cpolis/cmd/model"
|
2024-02-18 12:41:49 +01:00
|
|
|
)
|
|
|
|
|
2024-03-10 15:03:46 +01:00
|
|
|
func GetChannel(db *model.DB, title, link, description string) (*rss.Channel, error) {
|
2024-03-09 10:12:46 +01:00
|
|
|
channel := &rss.Channel{
|
2024-03-02 00:28:42 +01:00
|
|
|
Title: title,
|
2024-03-05 17:13:59 +01:00
|
|
|
Link: link,
|
2024-03-10 15:03:46 +01:00
|
|
|
Description: description,
|
2024-03-09 10:12:46 +01:00
|
|
|
Items: make([]*rss.Item, 0),
|
2024-02-18 12:41:49 +01:00
|
|
|
}
|
2024-03-02 00:28:42 +01:00
|
|
|
|
2024-03-10 15:03:46 +01:00
|
|
|
articles, err := db.GetCertainArticles(true, false)
|
2024-02-18 14:01:06 +01:00
|
|
|
if err != nil {
|
2024-03-09 10:12:46 +01:00
|
|
|
return nil, fmt.Errorf("error fetching published articles: %v", err)
|
2024-02-18 14:31:28 +01:00
|
|
|
}
|
2024-02-18 14:01:06 +01:00
|
|
|
|
2024-03-09 10:12:46 +01:00
|
|
|
for _, article := range articles {
|
|
|
|
tags, err := db.GetArticleTags(article.ID)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error fetching tags for article %v: %v", article.Title, err)
|
|
|
|
}
|
|
|
|
tagNames := make([]string, 0)
|
|
|
|
for _, tag := range tags {
|
|
|
|
tagNames = append(tagNames, tag.Name)
|
|
|
|
}
|
2024-02-18 14:01:06 +01:00
|
|
|
|
2024-03-09 10:12:46 +01:00
|
|
|
user, err := db.GetUser(article.AuthorID)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error finding user %v: %v", article.AuthorID, err)
|
|
|
|
}
|
2024-02-18 12:41:49 +01:00
|
|
|
|
2024-03-09 10:12:46 +01:00
|
|
|
channel.Items = append(channel.Items, &rss.Item{
|
|
|
|
Title: article.Title,
|
|
|
|
Author: user.FirstName + user.LastName,
|
|
|
|
PubDate: article.Created.Format(time.RFC1123Z),
|
2024-03-10 15:03:46 +01:00
|
|
|
Description: article.Description,
|
2024-03-09 10:12:46 +01:00
|
|
|
Content: &rss.Content{Value: article.Content},
|
|
|
|
Categories: tagNames,
|
|
|
|
})
|
2024-02-18 12:41:49 +01:00
|
|
|
}
|
|
|
|
|
2024-03-09 10:12:46 +01:00
|
|
|
return channel, nil
|
2024-03-01 21:01:38 +01:00
|
|
|
}
|
2024-03-28 12:51:33 +01:00
|
|
|
|
|
|
|
func GenerateRSS(db *model.DB, title, link, desc string) (*string, error) {
|
|
|
|
channel := &rss.Channel{
|
|
|
|
Title: title,
|
|
|
|
Link: link,
|
|
|
|
Description: desc,
|
|
|
|
Items: make([]*rss.Item, 0),
|
|
|
|
}
|
|
|
|
|
|
|
|
articles, err := db.GetCertainArticles(true, false)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error getting published articles for RSS feed: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, article := range articles {
|
|
|
|
tags, err := db.GetArticleTags(article.ID)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error getting tags for articles for RSS feed: %v", err)
|
|
|
|
}
|
|
|
|
tagNames := make([]string, 0)
|
|
|
|
for _, tag := range tags {
|
|
|
|
tagNames = append(tagNames, tag.Name)
|
|
|
|
}
|
|
|
|
tagNames = append(tagNames, fmt.Sprint("Orient Express ", article.IssueID))
|
|
|
|
|
|
|
|
user, err := db.GetUser(article.AuthorID)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error getting user user info for RSS feed: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
articleTitle, err := ConvertToPlain(article.Title)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error converting title to plain text for RSS feed: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
articleDescription, err := ConvertToPlain(article.Description)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error converting description to plain text for RSS feed: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
articleContent, err := ConvertToHTML(article.Content)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error converting content to HTML for RSS feed: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
channel.Items = append(channel.Items, &rss.Item{
|
|
|
|
Title: articleTitle,
|
|
|
|
Author: user.FirstName + user.LastName,
|
|
|
|
PubDate: article.Created.Format(time.RFC1123Z),
|
|
|
|
Description: articleDescription,
|
|
|
|
Content: &rss.Content{Value: articleContent},
|
|
|
|
Categories: tagNames,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
feed := rss.NewFeed()
|
|
|
|
feed.Channels = append(feed.Channels, channel)
|
|
|
|
rss, err := feed.ToXML()
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("error converting RSS feed to XML: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return &rss, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func SaveRSS(filename string, feed *string) error {
|
|
|
|
file, err := os.Create(filename)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("error creating file for RSS feed: %v", err)
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
file.Chmod(0644)
|
|
|
|
|
|
|
|
if _, err = io.WriteString(file, *feed); err != nil {
|
|
|
|
return fmt.Errorf("error writing to RSS file: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|