summaryrefslogtreecommitdiffstats
path: root/routers/web/feed
diff options
context:
space:
mode:
author6543 <6543@obermui.de>2022-03-13 17:40:47 +0100
committerGitHub <noreply@github.com>2022-03-13 17:40:47 +0100
commitbc0d2c8ada14eae81542f30a81552ed5cef8bd5d (patch)
tree5242a9e288f53cfc04e56df495a048d02a902d91 /routers/web/feed
parent780cf76f6e930b5e92fd12ae1e729c5702e70afa (diff)
downloadgitea-bc0d2c8ada14eae81542f30a81552ed5cef8bd5d.tar.gz
gitea-bc0d2c8ada14eae81542f30a81552ed5cef8bd5d.zip
RSS/Atom support for Repos (#19055)
* support for repos * refactor * advertise the feeds via meta tags * allow feed suffix and feed header * optimize performance
Diffstat (limited to 'routers/web/feed')
-rw-r--r--routers/web/feed/convert.go18
-rw-r--r--routers/web/feed/profile.go45
-rw-r--r--routers/web/feed/repo.go44
3 files changed, 64 insertions, 43 deletions
diff --git a/routers/web/feed/convert.go b/routers/web/feed/convert.go
index 51df014f1d..64801a6078 100644
--- a/routers/web/feed/convert.go
+++ b/routers/web/feed/convert.go
@@ -7,6 +7,7 @@ package feed
import (
"fmt"
"html"
+ "net/http"
"net/url"
"strconv"
"strings"
@@ -66,7 +67,7 @@ func renderMarkdown(ctx *context.Context, act *models.Action, content string) st
}
// feedActionsToFeedItems convert gitea's Action feed to feeds Item
-func feedActionsToFeedItems(ctx *context.Context, actions []*models.Action) (items []*feeds.Item, err error) {
+func feedActionsToFeedItems(ctx *context.Context, actions models.ActionList) (items []*feeds.Item, err error) {
for _, act := range actions {
act.LoadActUser()
@@ -247,3 +248,18 @@ func feedActionsToFeedItems(ctx *context.Context, actions []*models.Action) (ite
}
return
}
+
+// GetFeedType return if it is a feed request and altered name and feed type.
+func GetFeedType(name string, req *http.Request) (bool, string, string) {
+ if strings.HasSuffix(name, ".rss") ||
+ strings.Contains(req.Header.Get("Accept"), "application/rss+xml") {
+ return true, strings.TrimSuffix(name, ".rss"), "rss"
+ }
+
+ if strings.HasSuffix(name, ".atom") ||
+ strings.Contains(req.Header.Get("Accept"), "application/atom+xml") {
+ return true, strings.TrimSuffix(name, ".atom"), "atom"
+ }
+
+ return false, name, ""
+}
diff --git a/routers/web/feed/profile.go b/routers/web/feed/profile.go
index 4c1eff04a9..a7b8efcdbe 100644
--- a/routers/web/feed/profile.go
+++ b/routers/web/feed/profile.go
@@ -15,48 +15,9 @@ import (
"github.com/gorilla/feeds"
)
-// RetrieveFeeds loads feeds for the specified user
-func RetrieveFeeds(ctx *context.Context, options models.GetFeedsOptions) []*models.Action {
- actions, err := models.GetFeeds(options)
- if err != nil {
- ctx.ServerError("GetFeeds", err)
- return nil
- }
-
- // TODO: move load repoOwner of act.Repo into models.GetFeeds->loadAttributes()
- {
- userCache := map[int64]*user_model.User{options.RequestedUser.ID: options.RequestedUser}
- if ctx.User != nil {
- userCache[ctx.User.ID] = ctx.User
- }
- for _, act := range actions {
- if act.ActUser != nil {
- userCache[act.ActUserID] = act.ActUser
- }
- }
- for _, act := range actions {
- repoOwner, ok := userCache[act.Repo.OwnerID]
- if !ok {
- repoOwner, err = user_model.GetUserByID(act.Repo.OwnerID)
- if err != nil {
- if user_model.IsErrUserNotExist(err) {
- continue
- }
- ctx.ServerError("GetUserByID", err)
- return nil
- }
- userCache[repoOwner.ID] = repoOwner
- }
- act.Repo.Owner = repoOwner
- }
- }
-
- return actions
-}
-
// ShowUserFeed show user activity as RSS / Atom feed
func ShowUserFeed(ctx *context.Context, ctxUser *user_model.User, formatType string) {
- actions := RetrieveFeeds(ctx, models.GetFeedsOptions{
+ actions, err := models.GetFeeds(ctx, models.GetFeedsOptions{
RequestedUser: ctxUser,
Actor: ctx.User,
IncludePrivate: false,
@@ -64,7 +25,8 @@ func ShowUserFeed(ctx *context.Context, ctxUser *user_model.User, formatType str
IncludeDeleted: false,
Date: ctx.FormString("date"),
})
- if ctx.Written() {
+ if err != nil {
+ ctx.ServerError("GetFeeds", err)
return
}
@@ -75,7 +37,6 @@ func ShowUserFeed(ctx *context.Context, ctxUser *user_model.User, formatType str
Created: time.Now(),
}
- var err error
feed.Items, err = feedActionsToFeedItems(ctx, actions)
if err != nil {
ctx.ServerError("convert feed", err)
diff --git a/routers/web/feed/repo.go b/routers/web/feed/repo.go
new file mode 100644
index 0000000000..53fb8148e0
--- /dev/null
+++ b/routers/web/feed/repo.go
@@ -0,0 +1,44 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package feed
+
+import (
+ "time"
+
+ "code.gitea.io/gitea/models"
+ repo_model "code.gitea.io/gitea/models/repo"
+ "code.gitea.io/gitea/modules/context"
+
+ "github.com/gorilla/feeds"
+)
+
+// ShowRepoFeed shows user activity on the repo as RSS / Atom feed
+func ShowRepoFeed(ctx *context.Context, repo *repo_model.Repository, formatType string) {
+ actions, err := models.GetFeeds(ctx, models.GetFeedsOptions{
+ RequestedRepo: repo,
+ Actor: ctx.User,
+ IncludePrivate: true,
+ Date: ctx.FormString("date"),
+ })
+ if err != nil {
+ ctx.ServerError("GetFeeds", err)
+ return
+ }
+
+ feed := &feeds.Feed{
+ Title: ctx.Tr("home.feed_of", repo.FullName()),
+ Link: &feeds.Link{Href: repo.HTMLURL()},
+ Description: repo.Description,
+ Created: time.Now(),
+ }
+
+ feed.Items, err = feedActionsToFeedItems(ctx, actions)
+ if err != nil {
+ ctx.ServerError("convert feed", err)
+ return
+ }
+
+ writeFeed(ctx, feed, formatType)
+}