code.gitea.io/gitea@v1.22.3/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  	return container.FilterSlice(specs, func(spec *ActionScheduleSpec) (int64, bool) {
    20  		return spec.ScheduleID, true
    21  	})
    22  }
    23  
    24  func (specs SpecList) LoadSchedules(ctx context.Context) error {
    25  	scheduleIDs := specs.GetScheduleIDs()
    26  	schedules, err := GetSchedulesMapByIDs(ctx, scheduleIDs)
    27  	if err != nil {
    28  		return err
    29  	}
    30  	for _, spec := range specs {
    31  		spec.Schedule = schedules[spec.ScheduleID]
    32  	}
    33  
    34  	repoIDs := specs.GetRepoIDs()
    35  	repos, err := GetReposMapByIDs(ctx, repoIDs)
    36  	if err != nil {
    37  		return err
    38  	}
    39  	for _, spec := range specs {
    40  		spec.Repo = repos[spec.RepoID]
    41  	}
    42  
    43  	return nil
    44  }
    45  
    46  func (specs SpecList) GetRepoIDs() []int64 {
    47  	return container.FilterSlice(specs, func(spec *ActionScheduleSpec) (int64, bool) {
    48  		return spec.RepoID, true
    49  	})
    50  }
    51  
    52  func (specs SpecList) LoadRepos(ctx context.Context) error {
    53  	repoIDs := specs.GetRepoIDs()
    54  	repos, err := repo_model.GetRepositoriesMapByIDs(ctx, repoIDs)
    55  	if err != nil {
    56  		return err
    57  	}
    58  	for _, spec := range specs {
    59  		spec.Repo = repos[spec.RepoID]
    60  	}
    61  	return nil
    62  }
    63  
    64  type FindSpecOptions struct {
    65  	db.ListOptions
    66  	RepoID int64
    67  	Next   int64
    68  }
    69  
    70  func (opts FindSpecOptions) ToConds() builder.Cond {
    71  	cond := builder.NewCond()
    72  	if opts.RepoID > 0 {
    73  		cond = cond.And(builder.Eq{"repo_id": opts.RepoID})
    74  	}
    75  
    76  	if opts.Next > 0 {
    77  		cond = cond.And(builder.Lte{"next": opts.Next})
    78  	}
    79  
    80  	return cond
    81  }
    82  
    83  func (opts FindSpecOptions) ToOrders() string {
    84  	return "`id` DESC"
    85  }
    86  
    87  func FindSpecs(ctx context.Context, opts FindSpecOptions) (SpecList, int64, error) {
    88  	specs, total, err := db.FindAndCount[ActionScheduleSpec](ctx, opts)
    89  	if err != nil {
    90  		return nil, 0, err
    91  	}
    92  
    93  	if err := SpecList(specs).LoadSchedules(ctx); err != nil {
    94  		return nil, 0, err
    95  	}
    96  	return specs, total, nil
    97  }