rss.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package server
  2. import (
  3. "net/http"
  4. "strconv"
  5. "time"
  6. "github.com/gorilla/feeds"
  7. "github.com/labstack/echo/v4"
  8. "github.com/usememos/memos/api"
  9. )
  10. func (s *Server) registerRSSRoutes(g *echo.Group) {
  11. g.GET("/u/:id/rss.xml", func(c echo.Context) error {
  12. ctx := c.Request().Context()
  13. id, err := strconv.Atoi(c.Param("id"))
  14. if err != nil {
  15. return echo.NewHTTPError(http.StatusBadRequest, "User id is not a number").SetInternal(err)
  16. }
  17. normalStatus := api.Normal
  18. memoFind := api.MemoFind{
  19. CreatorID: &id,
  20. RowStatus: &normalStatus,
  21. VisibilityList: []api.Visibility{
  22. api.Public,
  23. },
  24. }
  25. memoList, err := s.Store.FindMemoList(ctx, &memoFind)
  26. if err != nil {
  27. return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find memo list").SetInternal(err)
  28. }
  29. userFind := api.UserFind{
  30. ID: &id,
  31. }
  32. user, err := s.Store.FindUser(ctx, &userFind)
  33. if err != nil {
  34. return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find user").SetInternal(err)
  35. }
  36. baseURL := c.Scheme() + "://" + c.Request().Host
  37. feed := &feeds.Feed{
  38. Title: "Memos",
  39. Link: &feeds.Link{Href: baseURL},
  40. Description: "Memos",
  41. Author: &feeds.Author{Name: user.Username},
  42. Created: time.Now(),
  43. }
  44. feed.Items = make([]*feeds.Item, len(memoList))
  45. for i, memo := range memoList {
  46. feed.Items[i] = &feeds.Item{
  47. Title: user.Username + "-memos-" + strconv.Itoa(memo.ID),
  48. Link: &feeds.Link{Href: baseURL + "/m/" + strconv.Itoa(memo.ID)},
  49. Description: memo.Content,
  50. Created: time.Unix(memo.CreatedTs, 0),
  51. }
  52. }
  53. rss, err := feed.ToRss()
  54. if err != nil {
  55. return echo.NewHTTPError(http.StatusInternalServerError, "Failed to generate rss").SetInternal(err)
  56. }
  57. rssPrefix := `<?xml version="1.0" encoding="UTF-8"?>`
  58. return c.XMLBlob(http.StatusOK, []byte(rss[len(rssPrefix):]))
  59. })
  60. }