code.gitea.io/gitea@v1.22.3/models/packages/package_cleanup_rule.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package packages 5 6 import ( 7 "context" 8 "fmt" 9 "regexp" 10 11 "code.gitea.io/gitea/models/db" 12 "code.gitea.io/gitea/modules/timeutil" 13 "code.gitea.io/gitea/modules/util" 14 15 "xorm.io/builder" 16 ) 17 18 var ErrPackageCleanupRuleNotExist = util.NewNotExistErrorf("package blob does not exist") 19 20 func init() { 21 db.RegisterModel(new(PackageCleanupRule)) 22 } 23 24 // PackageCleanupRule represents a rule which describes when to clean up package versions 25 type PackageCleanupRule struct { 26 ID int64 `xorm:"pk autoincr"` 27 Enabled bool `xorm:"INDEX NOT NULL DEFAULT false"` 28 OwnerID int64 `xorm:"UNIQUE(s) INDEX NOT NULL DEFAULT 0"` 29 Type Type `xorm:"UNIQUE(s) INDEX NOT NULL"` 30 KeepCount int `xorm:"NOT NULL DEFAULT 0"` 31 KeepPattern string `xorm:"NOT NULL DEFAULT ''"` 32 KeepPatternMatcher *regexp.Regexp `xorm:"-"` 33 RemoveDays int `xorm:"NOT NULL DEFAULT 0"` 34 RemovePattern string `xorm:"NOT NULL DEFAULT ''"` 35 RemovePatternMatcher *regexp.Regexp `xorm:"-"` 36 MatchFullName bool `xorm:"NOT NULL DEFAULT false"` 37 CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL DEFAULT 0"` 38 UpdatedUnix timeutil.TimeStamp `xorm:"updated NOT NULL DEFAULT 0"` 39 } 40 41 func (pcr *PackageCleanupRule) CompiledPattern() error { 42 if pcr.KeepPatternMatcher != nil || pcr.RemovePatternMatcher != nil { 43 return nil 44 } 45 46 if pcr.KeepPattern != "" { 47 var err error 48 pcr.KeepPatternMatcher, err = regexp.Compile(fmt.Sprintf(`(?i)\A%s\z`, pcr.KeepPattern)) 49 if err != nil { 50 return err 51 } 52 } 53 54 if pcr.RemovePattern != "" { 55 var err error 56 pcr.RemovePatternMatcher, err = regexp.Compile(fmt.Sprintf(`(?i)\A%s\z`, pcr.RemovePattern)) 57 if err != nil { 58 return err 59 } 60 } 61 62 return nil 63 } 64 65 func InsertCleanupRule(ctx context.Context, pcr *PackageCleanupRule) (*PackageCleanupRule, error) { 66 return pcr, db.Insert(ctx, pcr) 67 } 68 69 func GetCleanupRuleByID(ctx context.Context, id int64) (*PackageCleanupRule, error) { 70 pcr := &PackageCleanupRule{} 71 72 has, err := db.GetEngine(ctx).ID(id).Get(pcr) 73 if err != nil { 74 return nil, err 75 } 76 if !has { 77 return nil, ErrPackageCleanupRuleNotExist 78 } 79 return pcr, nil 80 } 81 82 func UpdateCleanupRule(ctx context.Context, pcr *PackageCleanupRule) error { 83 _, err := db.GetEngine(ctx).ID(pcr.ID).AllCols().Update(pcr) 84 return err 85 } 86 87 func GetCleanupRulesByOwner(ctx context.Context, ownerID int64) ([]*PackageCleanupRule, error) { 88 pcrs := make([]*PackageCleanupRule, 0, 10) 89 return pcrs, db.GetEngine(ctx).Where("owner_id = ?", ownerID).Find(&pcrs) 90 } 91 92 func DeleteCleanupRuleByID(ctx context.Context, ruleID int64) error { 93 _, err := db.GetEngine(ctx).ID(ruleID).Delete(&PackageCleanupRule{}) 94 return err 95 } 96 97 func HasOwnerCleanupRuleForPackageType(ctx context.Context, ownerID int64, packageType Type) (bool, error) { 98 return db.GetEngine(ctx). 99 Where("owner_id = ? AND type = ?", ownerID, packageType). 100 Exist(&PackageCleanupRule{}) 101 } 102 103 func IterateEnabledCleanupRules(ctx context.Context, callback func(context.Context, *PackageCleanupRule) error) error { 104 return db.Iterate( 105 ctx, 106 builder.Eq{"enabled": true}, 107 callback, 108 ) 109 }