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 }