aboutsummaryrefslogtreecommitdiffstats
path: root/models/activities/action_list.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/activities/action_list.go')
-rw-r--r--models/activities/action_list.go52
1 files changed, 52 insertions, 0 deletions
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
+}