code.gitea.io/gitea@v1.21.7/models/actions/task_list.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package actions 5 6 import ( 7 "context" 8 9 "code.gitea.io/gitea/models/db" 10 "code.gitea.io/gitea/modules/container" 11 "code.gitea.io/gitea/modules/timeutil" 12 13 "xorm.io/builder" 14 ) 15 16 type TaskList []*ActionTask 17 18 func (tasks TaskList) GetJobIDs() []int64 { 19 ids := make(container.Set[int64], len(tasks)) 20 for _, t := range tasks { 21 if t.JobID == 0 { 22 continue 23 } 24 ids.Add(t.JobID) 25 } 26 return ids.Values() 27 } 28 29 func (tasks TaskList) LoadJobs(ctx context.Context) error { 30 jobIDs := tasks.GetJobIDs() 31 jobs := make(map[int64]*ActionRunJob, len(jobIDs)) 32 if err := db.GetEngine(ctx).In("id", jobIDs).Find(&jobs); err != nil { 33 return err 34 } 35 for _, t := range tasks { 36 if t.JobID > 0 && t.Job == nil { 37 t.Job = jobs[t.JobID] 38 } 39 } 40 41 // TODO: Replace with "ActionJobList(maps.Values(jobs))" once available 42 var jobsList ActionJobList = make([]*ActionRunJob, 0, len(jobs)) 43 for _, j := range jobs { 44 jobsList = append(jobsList, j) 45 } 46 return jobsList.LoadAttributes(ctx, true) 47 } 48 49 func (tasks TaskList) LoadAttributes(ctx context.Context) error { 50 return tasks.LoadJobs(ctx) 51 } 52 53 type FindTaskOptions struct { 54 db.ListOptions 55 RepoID int64 56 OwnerID int64 57 CommitSHA string 58 Status Status 59 UpdatedBefore timeutil.TimeStamp 60 StartedBefore timeutil.TimeStamp 61 RunnerID int64 62 IDOrderDesc bool 63 } 64 65 func (opts FindTaskOptions) toConds() builder.Cond { 66 cond := builder.NewCond() 67 if opts.RepoID > 0 { 68 cond = cond.And(builder.Eq{"repo_id": opts.RepoID}) 69 } 70 if opts.OwnerID > 0 { 71 cond = cond.And(builder.Eq{"owner_id": opts.OwnerID}) 72 } 73 if opts.CommitSHA != "" { 74 cond = cond.And(builder.Eq{"commit_sha": opts.CommitSHA}) 75 } 76 if opts.Status > StatusUnknown { 77 cond = cond.And(builder.Eq{"status": opts.Status}) 78 } 79 if opts.UpdatedBefore > 0 { 80 cond = cond.And(builder.Lt{"updated": opts.UpdatedBefore}) 81 } 82 if opts.StartedBefore > 0 { 83 cond = cond.And(builder.Lt{"started": opts.StartedBefore}) 84 } 85 if opts.RunnerID > 0 { 86 cond = cond.And(builder.Eq{"runner_id": opts.RunnerID}) 87 } 88 return cond 89 } 90 91 func FindTasks(ctx context.Context, opts FindTaskOptions) (TaskList, error) { 92 e := db.GetEngine(ctx).Where(opts.toConds()) 93 if opts.PageSize > 0 && opts.Page >= 1 { 94 e.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) 95 } 96 if opts.IDOrderDesc { 97 e.OrderBy("id DESC") 98 } 99 var tasks TaskList 100 return tasks, e.Find(&tasks) 101 } 102 103 func CountTasks(ctx context.Context, opts FindTaskOptions) (int64, error) { 104 return db.GetEngine(ctx).Where(opts.toConds()).Count(new(ActionTask)) 105 }