aboutsummaryrefslogtreecommitdiffstats
path: root/models/activities
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2024-11-29 09:53:49 -0800
committerGitHub <noreply@github.com>2024-11-29 17:53:49 +0000
commit1ed5f379b9f3e38b64cc9de9f418c164ce400be1 (patch)
treedee6e19dd5c3ae6e96df2c926f199bb3c1c1299b /models/activities
parent93640993e3cca9d0e0261591ba38b84b0b99ab12 (diff)
downloadgitea-1ed5f379b9f3e38b64cc9de9f418c164ce400be1.tar.gz
gitea-1ed5f379b9f3e38b64cc9de9f418c164ce400be1.zip
Move GetFeeds to service layer (#32526)
Move GetFeeds from models to service layer, no code change.
Diffstat (limited to 'models/activities')
-rw-r--r--models/activities/action.go54
-rw-r--r--models/activities/action_list.go52
-rw-r--r--models/activities/action_test.go149
-rw-r--r--models/activities/user_heatmap.go2
4 files changed, 54 insertions, 203 deletions
diff --git a/models/activities/action.go b/models/activities/action.go
index 546d4340ae..65d95fbe66 100644
--- a/models/activities/action.go
+++ b/models/activities/action.go
@@ -448,65 +448,13 @@ type GetFeedsOptions struct {
Date string // the day we want activity for: YYYY-MM-DD
}
-// GetFeeds returns actions according to the provided options
-func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, int64, error) {
- if opts.RequestedUser == nil && opts.RequestedTeam == nil && opts.RequestedRepo == nil {
- return nil, 0, fmt.Errorf("need at least one of these filters: RequestedUser, RequestedTeam, RequestedRepo")
- }
-
- cond, err := activityQueryCondition(ctx, opts)
- if err != nil {
- return nil, 0, err
- }
-
- actions := make([]*Action, 0, opts.PageSize)
- var count int64
- opts.SetDefaultValues()
-
- if opts.Page < 10 { // TODO: why it's 10 but other values? It's an experience value.
- sess := db.GetEngine(ctx).Where(cond)
- sess = db.SetSessionPagination(sess, &opts)
-
- count, err = sess.Desc("`action`.created_unix").FindAndCount(&actions)
- if err != nil {
- return nil, 0, fmt.Errorf("FindAndCount: %w", err)
- }
- } else {
- // First, only query which IDs are necessary, and only then query all actions to speed up the overall query
- sess := db.GetEngine(ctx).Where(cond).Select("`action`.id")
- sess = db.SetSessionPagination(sess, &opts)
-
- actionIDs := make([]int64, 0, opts.PageSize)
- if err := sess.Table("action").Desc("`action`.created_unix").Find(&actionIDs); err != nil {
- return nil, 0, fmt.Errorf("Find(actionsIDs): %w", err)
- }
-
- count, err = db.GetEngine(ctx).Where(cond).
- Table("action").
- Cols("`action`.id").Count()
- if err != nil {
- return nil, 0, fmt.Errorf("Count: %w", err)
- }
-
- if err := db.GetEngine(ctx).In("`action`.id", actionIDs).Desc("`action`.created_unix").Find(&actions); err != nil {
- return nil, 0, fmt.Errorf("Find: %w", err)
- }
- }
-
- if err := ActionList(actions).LoadAttributes(ctx); err != nil {
- return nil, 0, fmt.Errorf("LoadAttributes: %w", err)
- }
-
- return actions, count, nil
-}
-
// ActivityReadable return whether doer can read activities of user
func ActivityReadable(user, doer *user_model.User) bool {
return !user.KeepActivityPrivate ||
doer != nil && (doer.IsAdmin || user.ID == doer.ID)
}
-func activityQueryCondition(ctx context.Context, opts GetFeedsOptions) (builder.Cond, error) {
+func ActivityQueryCondition(ctx context.Context, opts GetFeedsOptions) (builder.Cond, error) {
cond := builder.NewCond()
if opts.RequestedTeam != nil && opts.RequestedUser == nil {
diff --git a/models/activities/action_list.go b/models/activities/action_list.go
index aafb7f8a26..5f9acb8f2a 100644
--- a/models/activities/action_list.go
+++ b/models/activities/action_list.go
@@ -201,3 +201,55 @@ func (actions ActionList) LoadIssues(ctx context.Context) error {
}
return nil
}
+
+// GetFeeds returns actions according to the provided options
+func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, int64, error) {
+ if opts.RequestedUser == nil && opts.RequestedTeam == nil && opts.RequestedRepo == nil {
+ return nil, 0, fmt.Errorf("need at least one of these filters: RequestedUser, RequestedTeam, RequestedRepo")
+ }
+
+ cond, err := ActivityQueryCondition(ctx, opts)
+ if err != nil {
+ return nil, 0, err
+ }
+
+ actions := make([]*Action, 0, opts.PageSize)
+ var count int64
+ opts.SetDefaultValues()
+
+ if opts.Page < 10 { // TODO: why it's 10 but other values? It's an experience value.
+ sess := db.GetEngine(ctx).Where(cond)
+ sess = db.SetSessionPagination(sess, &opts)
+
+ count, err = sess.Desc("`action`.created_unix").FindAndCount(&actions)
+ if err != nil {
+ return nil, 0, fmt.Errorf("FindAndCount: %w", err)
+ }
+ } else {
+ // First, only query which IDs are necessary, and only then query all actions to speed up the overall query
+ sess := db.GetEngine(ctx).Where(cond).Select("`action`.id")
+ sess = db.SetSessionPagination(sess, &opts)
+
+ actionIDs := make([]int64, 0, opts.PageSize)
+ if err := sess.Table("action").Desc("`action`.created_unix").Find(&actionIDs); err != nil {
+ return nil, 0, fmt.Errorf("Find(actionsIDs): %w", err)
+ }
+
+ count, err = db.GetEngine(ctx).Where(cond).
+ Table("action").
+ Cols("`action`.id").Count()
+ if err != nil {
+ return nil, 0, fmt.Errorf("Count: %w", err)
+ }
+
+ if err := db.GetEngine(ctx).In("`action`.id", actionIDs).Desc("`action`.created_unix").Find(&actions); err != nil {
+ return nil, 0, fmt.Errorf("Find: %w", err)
+ }
+ }
+
+ if err := ActionList(actions).LoadAttributes(ctx); err != nil {
+ return nil, 0, fmt.Errorf("LoadAttributes: %w", err)
+ }
+
+ return actions, count, nil
+}
diff --git a/models/activities/action_test.go b/models/activities/action_test.go
index 64330ebbb3..9cfe981656 100644
--- a/models/activities/action_test.go
+++ b/models/activities/action_test.go
@@ -42,114 +42,6 @@ func TestAction_GetRepoLink(t *testing.T) {
assert.Equal(t, comment.HTMLURL(db.DefaultContext), action.GetCommentHTMLURL(db.DefaultContext))
}
-func TestGetFeeds(t *testing.T) {
- // test with an individual user
- assert.NoError(t, unittest.PrepareTestDatabase())
- user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
-
- actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedUser: user,
- Actor: user,
- IncludePrivate: true,
- OnlyPerformedBy: false,
- IncludeDeleted: true,
- })
- assert.NoError(t, err)
- if assert.Len(t, actions, 1) {
- assert.EqualValues(t, 1, actions[0].ID)
- assert.EqualValues(t, user.ID, actions[0].UserID)
- }
- assert.Equal(t, int64(1), count)
-
- actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedUser: user,
- Actor: user,
- IncludePrivate: false,
- OnlyPerformedBy: false,
- })
- assert.NoError(t, err)
- assert.Len(t, actions, 0)
- assert.Equal(t, int64(0), count)
-}
-
-func TestGetFeedsForRepos(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
- user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
- privRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
- pubRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 8})
-
- // private repo & no login
- actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedRepo: privRepo,
- IncludePrivate: true,
- })
- assert.NoError(t, err)
- assert.Len(t, actions, 0)
- assert.Equal(t, int64(0), count)
-
- // public repo & no login
- actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedRepo: pubRepo,
- IncludePrivate: true,
- })
- assert.NoError(t, err)
- assert.Len(t, actions, 1)
- assert.Equal(t, int64(1), count)
-
- // private repo and login
- actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedRepo: privRepo,
- IncludePrivate: true,
- Actor: user,
- })
- assert.NoError(t, err)
- assert.Len(t, actions, 1)
- assert.Equal(t, int64(1), count)
-
- // public repo & login
- actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedRepo: pubRepo,
- IncludePrivate: true,
- Actor: user,
- })
- assert.NoError(t, err)
- assert.Len(t, actions, 1)
- assert.Equal(t, int64(1), count)
-}
-
-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 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
-
- actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedUser: org,
- Actor: user,
- IncludePrivate: true,
- OnlyPerformedBy: false,
- IncludeDeleted: true,
- })
- assert.NoError(t, err)
- assert.Len(t, actions, 1)
- if assert.Len(t, actions, 1) {
- assert.EqualValues(t, 2, actions[0].ID)
- assert.EqualValues(t, org.ID, actions[0].UserID)
- }
- assert.Equal(t, int64(1), count)
-
- actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedUser: org,
- Actor: user,
- IncludePrivate: false,
- OnlyPerformedBy: false,
- IncludeDeleted: true,
- })
- assert.NoError(t, err)
- assert.Len(t, actions, 0)
- assert.Equal(t, int64(0), count)
-}
-
func TestActivityReadable(t *testing.T) {
tt := []struct {
desc string
@@ -227,26 +119,6 @@ func TestNotifyWatchers(t *testing.T) {
})
}
-func TestGetFeedsCorrupted(t *testing.T) {
- // Now we will not check for corrupted data in the feeds
- // users should run doctor to fix their data
- assert.NoError(t, unittest.PrepareTestDatabase())
- user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
- unittest.AssertExistsAndLoadBean(t, &activities_model.Action{
- ID: 8,
- RepoID: 1700,
- })
-
- actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedUser: user,
- Actor: user,
- IncludePrivate: true,
- })
- assert.NoError(t, err)
- assert.Len(t, actions, 1)
- assert.Equal(t, int64(1), count)
-}
-
func TestConsistencyUpdateAction(t *testing.T) {
if !setting.Database.Type.IsSQLite3() {
t.Skip("Test is only for SQLite database.")
@@ -322,24 +194,3 @@ func TestDeleteIssueActions(t *testing.T) {
assert.NoError(t, activities_model.DeleteIssueActions(db.DefaultContext, issue.RepoID, issue.ID, issue.Index))
unittest.AssertCount(t, &activities_model.Action{}, 0)
}
-
-func TestRepoActions(t *testing.T) {
- assert.NoError(t, unittest.PrepareTestDatabase())
- repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
- _ = db.TruncateBeans(db.DefaultContext, &activities_model.Action{})
- for i := 0; i < 3; i++ {
- _ = db.Insert(db.DefaultContext, &activities_model.Action{
- UserID: 2 + int64(i),
- ActUserID: 2,
- RepoID: repo.ID,
- OpType: activities_model.ActionCommentIssue,
- })
- }
- count, _ := db.Count[activities_model.Action](db.DefaultContext, &db.ListOptions{})
- assert.EqualValues(t, 3, count)
- actions, _, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedRepo: repo,
- })
- assert.NoError(t, err)
- assert.Len(t, actions, 1)
-}
diff --git a/models/activities/user_heatmap.go b/models/activities/user_heatmap.go
index 78fcd76d43..1f8f0f590e 100644
--- a/models/activities/user_heatmap.go
+++ b/models/activities/user_heatmap.go
@@ -47,7 +47,7 @@ func getUserHeatmapData(ctx context.Context, user *user_model.User, team *organi
groupByName = groupBy
}
- cond, err := activityQueryCondition(ctx, GetFeedsOptions{
+ cond, err := ActivityQueryCondition(ctx, GetFeedsOptions{
RequestedUser: user,
RequestedTeam: team,
Actor: doer,