// Copyright 2022 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package actions import ( "context" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/timeutil" "xorm.io/builder" ) type TaskList []*ActionTask func (tasks TaskList) GetJobIDs() []int64 { ids := make(container.Set[int64], len(tasks)) for _, t := range tasks { if t.JobID == 0 { continue } ids.Add(t.JobID) } return ids.Values() } func (tasks TaskList) LoadJobs(ctx context.Context) error { jobIDs := tasks.GetJobIDs() jobs := make(map[int64]*ActionRunJob, len(jobIDs)) if err := db.GetEngine(ctx).In("id", jobIDs).Find(&jobs); err != nil { return err } for _, t := range tasks { if t.JobID > 0 && t.Job == nil { t.Job = jobs[t.JobID] } } // TODO: Replace with "ActionJobList(maps.Values(jobs))" once available var jobsList ActionJobList = make([]*ActionRunJob, 0, len(jobs)) for _, j := range jobs { jobsList = append(jobsList, j) } return jobsList.LoadAttributes(ctx, true) } func (tasks TaskList) LoadAttributes(ctx context.Context) error { return tasks.LoadJobs(ctx) } type FindTaskOptions struct { db.ListOptions RepoID int64 OwnerID int64 CommitSHA string Status Status UpdatedBefore timeutil.TimeStamp StartedBefore timeutil.TimeStamp RunnerID int64 IDOrderDesc bool } func (opts FindTaskOptions) toConds() builder.Cond { cond := builder.NewCond() if opts.RepoID > 0 { cond = cond.And(builder.Eq{"repo_id": opts.RepoID}) } if opts.OwnerID > 0 { cond = cond.And(builder.Eq{"owner_id": opts.OwnerID}) } if opts.CommitSHA != "" { cond = cond.And(builder.Eq{"commit_sha": opts.CommitSHA}) } if opts.Status > StatusUnknown { cond = cond.And(builder.Eq{"status": opts.Status}) } if opts.UpdatedBefore > 0 { cond = cond.And(builder.Lt{"updated": opts.UpdatedBefore}) } if opts.StartedBefore > 0 { cond = cond.And(builder.Lt{"started": opts.StartedBefore}) } if opts.RunnerID > 0 { cond = cond.And(builder.Eq{"runner_id": opts.RunnerID}) } return cond } func FindTasks(ctx context.Context, opts FindTaskOptions) (TaskList, error) { e := db.GetEngine(ctx).Where(opts.toConds()) if opts.PageSize > 0 && opts.Page >= 1 { e.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) } if opts.IDOrderDesc { e.OrderBy("id DESC") } var tasks TaskList return tasks, e.Find(&tasks) } func CountTasks(ctx context.Context, opts FindTaskOptions) (int64, error) { return db.GetEngine(ctx).Where(opts.toConds()).Count(new(ActionTask)) }