code.gitea.io/gitea@v1.21.7/models/actions/schedule_spec_list.go (about)

     1  // Copyright 2023 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  	repo_model "code.gitea.io/gitea/models/repo"
    11  	"code.gitea.io/gitea/modules/container"
    12  
    13  	"xorm.io/builder"
    14  )
    15  
    16  type SpecList []*ActionScheduleSpec
    17  
    18  func (specs SpecList) GetScheduleIDs() []int64 {
    19  	ids := make(container.Set[int64], len(specs))
    20  	for _, spec := range specs {
    21  		ids.Add(spec.ScheduleID)
    22  	}
    23  	return ids.Values()
    24  }
    25  
    26  func (specs SpecList) LoadSchedules(ctx context.Context) error {
    27  	scheduleIDs := specs.GetScheduleIDs()
    28  	schedules, err := GetSchedulesMapByIDs(ctx, scheduleIDs)
    29  	if err != nil {
    30  		return err
    31  	}
    32  	for _, spec := range specs {
    33  		spec.Schedule = schedules[spec.ScheduleID]
    34  	}
    35  
    36  	repoIDs := specs.GetRepoIDs()
    37  	repos, err := GetReposMapByIDs(ctx, repoIDs)
    38  	if err != nil {
    39  		return err
    40  	}
    41  	for _, spec := range specs {
    42  		spec.Repo = repos[spec.RepoID]
    43  	}
    44  
    45  	return nil
    46  }
    47  
    48  func (specs SpecList) GetRepoIDs() []int64 {
    49  	ids := make(container.Set[int64], len(specs))
    50  	for _, spec := range specs {
    51  		ids.Add(spec.RepoID)
    52  	}
    53  	return ids.Values()
    54  }
    55  
    56  func (specs SpecList) LoadRepos() error {
    57  	repoIDs := specs.GetRepoIDs()
    58  	repos, err := repo_model.GetRepositoriesMapByIDs(repoIDs)
    59  	if err != nil {
    60  		return err
    61  	}
    62  	for _, spec := range specs {
    63  		spec.Repo = repos[spec.RepoID]
    64  	}
    65  	return nil
    66  }
    67  
    68  type FindSpecOptions struct {
    69  	db.ListOptions
    70  	RepoID int64
    71  	Next   int64
    72  }
    73  
    74  func (opts FindSpecOptions) toConds() builder.Cond {
    75  	cond := builder.NewCond()
    76  	if opts.RepoID > 0 {
    77  		cond = cond.And(builder.Eq{"repo_id": opts.RepoID})
    78  	}
    79  
    80  	if opts.Next > 0 {
    81  		cond = cond.And(builder.Lte{"next": opts.Next})
    82  	}
    83  
    84  	return cond
    85  }
    86  
    87  func FindSpecs(ctx context.Context, opts FindSpecOptions) (SpecList, int64, error) {
    88  	e := db.GetEngine(ctx).Where(opts.toConds())
    89  	if opts.PageSize > 0 && opts.Page >= 1 {
    90  		e.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize)
    91  	}
    92  	var specs SpecList
    93  	total, err := e.Desc("id").FindAndCount(&specs)
    94  	if err != nil {
    95  		return nil, 0, err
    96  	}
    97  
    98  	if err := specs.LoadSchedules(ctx); err != nil {
    99  		return nil, 0, err
   100  	}
   101  	return specs, total, nil
   102  }
   103  
   104  func CountSpecs(ctx context.Context, opts FindSpecOptions) (int64, error) {
   105  	return db.GetEngine(ctx).Where(opts.toConds()).Count(new(ActionScheduleSpec))
   106  }