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  }