diff options
author | 6543 <6543@obermui.de> | 2022-03-13 17:40:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-13 17:40:47 +0100 |
commit | bc0d2c8ada14eae81542f30a81552ed5cef8bd5d (patch) | |
tree | 5242a9e288f53cfc04e56df495a048d02a902d91 /models | |
parent | 780cf76f6e930b5e92fd12ae1e729c5702e70afa (diff) | |
download | gitea-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 'models')
-rw-r--r-- | models/action.go | 7 | ||||
-rw-r--r-- | models/action_list.go | 63 | ||||
-rw-r--r-- | models/action_test.go | 50 | ||||
-rw-r--r-- | models/fixtures/action.yml | 14 | ||||
-rw-r--r-- | models/user_heatmap_test.go | 3 |
5 files changed, 94 insertions, 43 deletions
diff --git a/models/action.go b/models/action.go index f2723a2014..e9f5138b40 100644 --- a/models/action.go +++ b/models/action.go @@ -328,7 +328,7 @@ type GetFeedsOptions struct { } // GetFeeds returns actions according to the provided options -func GetFeeds(opts GetFeedsOptions) ([]*Action, error) { +func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, error) { if opts.RequestedUser == nil && opts.RequestedTeam == nil && opts.RequestedRepo == nil { return nil, fmt.Errorf("need at least one of these filters: RequestedUser, RequestedTeam, RequestedRepo") } @@ -338,7 +338,8 @@ func GetFeeds(opts GetFeedsOptions) ([]*Action, error) { return nil, err } - sess := db.GetEngine(db.DefaultContext).Where(cond) + e := db.GetEngine(ctx) + sess := e.Where(cond) opts.SetDefaultValues() sess = db.SetSessionPagination(sess, &opts) @@ -349,7 +350,7 @@ func GetFeeds(opts GetFeedsOptions) ([]*Action, error) { return nil, fmt.Errorf("Find: %v", err) } - if err := ActionList(actions).LoadAttributes(); err != nil { + if err := ActionList(actions).loadAttributes(e); err != nil { return nil, fmt.Errorf("LoadAttributes: %v", err) } diff --git a/models/action_list.go b/models/action_list.go index 3f52d3cd5e..ce621753a4 100644 --- a/models/action_list.go +++ b/models/action_list.go @@ -25,7 +25,7 @@ func (actions ActionList) getUserIDs() []int64 { return keysInt64(userIDs) } -func (actions ActionList) loadUsers(e db.Engine) ([]*user_model.User, error) { +func (actions ActionList) loadUsers(e db.Engine) (map[int64]*user_model.User, error) { if len(actions) == 0 { return nil, nil } @@ -42,12 +42,7 @@ func (actions ActionList) loadUsers(e db.Engine) ([]*user_model.User, error) { for _, action := range actions { action.ActUser = userMaps[action.ActUserID] } - return valuesUser(userMaps), nil -} - -// LoadUsers loads actions' all users -func (actions ActionList) LoadUsers() ([]*user_model.User, error) { - return actions.loadUsers(db.GetEngine(db.DefaultContext)) + return userMaps, nil } func (actions ActionList) getRepoIDs() []int64 { @@ -60,45 +55,57 @@ func (actions ActionList) getRepoIDs() []int64 { return keysInt64(repoIDs) } -func (actions ActionList) loadRepositories(e db.Engine) ([]*repo_model.Repository, error) { +func (actions ActionList) loadRepositories(e db.Engine) error { if len(actions) == 0 { - return nil, nil + return nil } repoIDs := actions.getRepoIDs() repoMaps := make(map[int64]*repo_model.Repository, len(repoIDs)) - err := e. - In("id", repoIDs). - Find(&repoMaps) + err := e.In("id", repoIDs).Find(&repoMaps) if err != nil { - return nil, fmt.Errorf("find repository: %v", err) + return fmt.Errorf("find repository: %v", err) } for _, action := range actions { action.Repo = repoMaps[action.RepoID] } - return valuesRepository(repoMaps), nil -} - -// LoadRepositories loads actions' all repositories -func (actions ActionList) LoadRepositories() ([]*repo_model.Repository, error) { - return actions.loadRepositories(db.GetEngine(db.DefaultContext)) + return nil } -// loadAttributes loads all attributes -func (actions ActionList) loadAttributes(e db.Engine) (err error) { - if _, err = actions.loadUsers(e); err != nil { - return +func (actions ActionList) loadRepoOwner(e db.Engine, userMap map[int64]*user_model.User) (err error) { + if userMap == nil { + userMap = make(map[int64]*user_model.User) } - if _, err = actions.loadRepositories(e); err != nil { - return + for _, action := range actions { + repoOwner, ok := userMap[action.Repo.OwnerID] + if !ok { + repoOwner, err = user_model.GetUserByID(action.Repo.OwnerID) + if err != nil { + if user_model.IsErrUserNotExist(err) { + continue + } + return err + } + userMap[repoOwner.ID] = repoOwner + } + action.Repo.Owner = repoOwner } return nil } -// LoadAttributes loads attributes of the actions -func (actions ActionList) LoadAttributes() error { - return actions.loadAttributes(db.GetEngine(db.DefaultContext)) +// loadAttributes loads all attributes +func (actions ActionList) loadAttributes(e db.Engine) error { + userMap, err := actions.loadUsers(e) + if err != nil { + return err + } + + if err := actions.loadRepositories(e); err != nil { + return err + } + + return actions.loadRepoOwner(e, userMap) } diff --git a/models/action_test.go b/models/action_test.go index 0ce9183b96..e247a5ec29 100644 --- a/models/action_test.go +++ b/models/action_test.go @@ -8,6 +8,7 @@ import ( "path" "testing" + "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" @@ -39,7 +40,7 @@ func TestGetFeeds(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) - actions, err := GetFeeds(GetFeedsOptions{ + actions, err := GetFeeds(db.DefaultContext, GetFeedsOptions{ RequestedUser: user, Actor: user, IncludePrivate: true, @@ -52,7 +53,7 @@ func TestGetFeeds(t *testing.T) { assert.EqualValues(t, user.ID, actions[0].UserID) } - actions, err = GetFeeds(GetFeedsOptions{ + actions, err = GetFeeds(db.DefaultContext, GetFeedsOptions{ RequestedUser: user, Actor: user, IncludePrivate: false, @@ -62,13 +63,54 @@ func TestGetFeeds(t *testing.T) { assert.Len(t, actions, 0) } +func TestGetFeedsForRepos(t *testing.T) { + assert.NoError(t, unittest.PrepareTestDatabase()) + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) + privRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository) + pubRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 8}).(*repo_model.Repository) + + // private repo & no login + actions, err := GetFeeds(db.DefaultContext, GetFeedsOptions{ + RequestedRepo: privRepo, + IncludePrivate: true, + }) + assert.NoError(t, err) + assert.Len(t, actions, 0) + + // public repo & no login + actions, err = GetFeeds(db.DefaultContext, GetFeedsOptions{ + RequestedRepo: pubRepo, + IncludePrivate: true, + }) + assert.NoError(t, err) + assert.Len(t, actions, 1) + + // private repo and login + actions, err = GetFeeds(db.DefaultContext, GetFeedsOptions{ + RequestedRepo: privRepo, + IncludePrivate: true, + Actor: user, + }) + assert.NoError(t, err) + assert.Len(t, actions, 1) + + // public repo & login + actions, err = GetFeeds(db.DefaultContext, GetFeedsOptions{ + RequestedRepo: pubRepo, + IncludePrivate: true, + Actor: user, + }) + assert.NoError(t, err) + assert.Len(t, actions, 1) +} + func TestGetFeeds2(t *testing.T) { // test with an organization user assert.NoError(t, unittest.PrepareTestDatabase()) org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User) user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) - actions, err := GetFeeds(GetFeedsOptions{ + actions, err := GetFeeds(db.DefaultContext, GetFeedsOptions{ RequestedUser: org, Actor: user, IncludePrivate: true, @@ -82,7 +124,7 @@ func TestGetFeeds2(t *testing.T) { assert.EqualValues(t, org.ID, actions[0].UserID) } - actions, err = GetFeeds(GetFeedsOptions{ + actions, err = GetFeeds(db.DefaultContext, GetFeedsOptions{ RequestedUser: org, Actor: user, IncludePrivate: false, diff --git a/models/fixtures/action.yml b/models/fixtures/action.yml index e3f3d2a971..e283b01db2 100644 --- a/models/fixtures/action.yml +++ b/models/fixtures/action.yml @@ -3,7 +3,7 @@ user_id: 2 op_type: 12 # close issue act_user_id: 2 - repo_id: 2 + repo_id: 2 # private is_private: true created_unix: 1603228283 @@ -12,7 +12,7 @@ user_id: 3 op_type: 2 # rename repo act_user_id: 2 - repo_id: 3 + repo_id: 3 # private is_private: true content: oldRepoName @@ -21,7 +21,7 @@ user_id: 11 op_type: 1 # create repo act_user_id: 11 - repo_id: 9 + repo_id: 9 # public is_private: false - @@ -29,7 +29,7 @@ user_id: 16 op_type: 12 # close issue act_user_id: 16 - repo_id: 22 + repo_id: 22 # private is_private: true created_unix: 1603267920 @@ -37,7 +37,7 @@ user_id: 10 op_type: 1 # create repo act_user_id: 10 - repo_id: 6 + repo_id: 6 # private is_private: true created_unix: 1603010100 @@ -45,7 +45,7 @@ user_id: 10 op_type: 1 # create repo act_user_id: 10 - repo_id: 7 + repo_id: 7 # private is_private: true created_unix: 1603011300 @@ -53,6 +53,6 @@ user_id: 10 op_type: 1 # create repo act_user_id: 10 - repo_id: 8 + repo_id: 8 # public is_private: false created_unix: 1603011540 # grouped with id:7 diff --git a/models/user_heatmap_test.go b/models/user_heatmap_test.go index 7915363d95..9361cb3452 100644 --- a/models/user_heatmap_test.go +++ b/models/user_heatmap_test.go @@ -9,6 +9,7 @@ import ( "testing" "time" + "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/json" @@ -72,7 +73,7 @@ func TestGetUserHeatmapDataByUser(t *testing.T) { } // get the action for comparison - actions, err := GetFeeds(GetFeedsOptions{ + actions, err := GetFeeds(db.DefaultContext, GetFeedsOptions{ RequestedUser: user, Actor: doer, IncludePrivate: true, |