package control import ( "fmt" "io" "os" "time" "git.streifling.com/jason/rss" "streifling.com/jason/cpolis/cmd/model" ) func GetChannel(db *model.DB, title, link, description string) (*rss.Channel, error) { channel := &rss.Channel{ Title: title, Link: link, Description: description, Items: make([]*rss.Item, 0), } articles, err := db.GetCertainArticles(true, false) if err != nil { return nil, fmt.Errorf("error fetching published articles: %v", err) } 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) } user, err := db.GetUser(article.AuthorID) if err != nil { return nil, fmt.Errorf("error finding user %v: %v", article.AuthorID, err) } channel.Items = append(channel.Items, &rss.Item{ Title: article.Title, Author: user.FirstName + user.LastName, PubDate: article.Created.Format(time.RFC1123Z), Description: article.Description, Content: &rss.Content{Value: article.Content}, Categories: tagNames, }) } return channel, nil } 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("UTF-8") 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 }