You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

profile.go 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package feed
  4. import (
  5. "time"
  6. activities_model "code.gitea.io/gitea/models/activities"
  7. "code.gitea.io/gitea/modules/context"
  8. "code.gitea.io/gitea/modules/markup"
  9. "code.gitea.io/gitea/modules/markup/markdown"
  10. "github.com/gorilla/feeds"
  11. )
  12. // ShowUserFeedRSS show user activity as RSS feed
  13. func ShowUserFeedRSS(ctx *context.Context) {
  14. showUserFeed(ctx, "rss")
  15. }
  16. // ShowUserFeedAtom show user activity as Atom feed
  17. func ShowUserFeedAtom(ctx *context.Context) {
  18. showUserFeed(ctx, "atom")
  19. }
  20. // showUserFeed show user activity as RSS / Atom feed
  21. func showUserFeed(ctx *context.Context, formatType string) {
  22. includePrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
  23. actions, _, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
  24. RequestedUser: ctx.ContextUser,
  25. Actor: ctx.Doer,
  26. IncludePrivate: includePrivate,
  27. OnlyPerformedBy: !ctx.ContextUser.IsOrganization(),
  28. IncludeDeleted: false,
  29. Date: ctx.FormString("date"),
  30. })
  31. if err != nil {
  32. ctx.ServerError("GetFeeds", err)
  33. return
  34. }
  35. ctxUserDescription, err := markdown.RenderString(&markup.RenderContext{
  36. Ctx: ctx,
  37. URLPrefix: ctx.ContextUser.HTMLURL(),
  38. Metas: map[string]string{
  39. "user": ctx.ContextUser.GetDisplayName(),
  40. },
  41. }, ctx.ContextUser.Description)
  42. if err != nil {
  43. ctx.ServerError("RenderString", err)
  44. return
  45. }
  46. feed := &feeds.Feed{
  47. Title: ctx.Tr("home.feed_of", ctx.ContextUser.DisplayName()),
  48. Link: &feeds.Link{Href: ctx.ContextUser.HTMLURL()},
  49. Description: ctxUserDescription,
  50. Created: time.Now(),
  51. }
  52. feed.Items, err = feedActionsToFeedItems(ctx, actions)
  53. if err != nil {
  54. ctx.ServerError("convert feed", err)
  55. return
  56. }
  57. writeFeed(ctx, feed, formatType)
  58. }
  59. // writeFeed write a feeds.Feed as atom or rss to ctx.Resp
  60. func writeFeed(ctx *context.Context, feed *feeds.Feed, formatType string) {
  61. if formatType == "atom" {
  62. ctx.Resp.Header().Set("Content-Type", "application/atom+xml;charset=utf-8")
  63. if err := feed.WriteAtom(ctx.Resp); err != nil {
  64. ctx.ServerError("Render Atom failed", err)
  65. }
  66. } else {
  67. ctx.Resp.Header().Set("Content-Type", "application/rss+xml;charset=utf-8")
  68. if err := feed.WriteRss(ctx.Resp); err != nil {
  69. ctx.ServerError("Render RSS failed", err)
  70. }
  71. }
  72. }