2022-11-20 17:08:38 +03:00
// Copyright 2022 The Gitea Authors. All rights reserved.
2022-12-02 17:14:57 +03:00
// SPDX-License-Identifier: MIT
2022-11-20 17:08:38 +03:00
package packages
import (
"context"
"fmt"
"regexp"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/timeutil"
2022-12-31 14:49:37 +03:00
"code.gitea.io/gitea/modules/util"
2022-11-20 17:08:38 +03:00
"xorm.io/builder"
)
2022-12-31 14:49:37 +03:00
var ErrPackageCleanupRuleNotExist = util . NewNotExistErrorf ( "package blob does not exist" )
2022-11-20 17:08:38 +03:00
func init ( ) {
db . RegisterModel ( new ( PackageCleanupRule ) )
}
// PackageCleanupRule represents a rule which describes when to clean up package versions
type PackageCleanupRule struct {
ID int64 ` xorm:"pk autoincr" `
Enabled bool ` xorm:"INDEX NOT NULL DEFAULT false" `
OwnerID int64 ` xorm:"UNIQUE(s) INDEX NOT NULL DEFAULT 0" `
Type Type ` xorm:"UNIQUE(s) INDEX NOT NULL" `
KeepCount int ` xorm:"NOT NULL DEFAULT 0" `
KeepPattern string ` xorm:"NOT NULL DEFAULT ''" `
KeepPatternMatcher * regexp . Regexp ` xorm:"-" `
RemoveDays int ` xorm:"NOT NULL DEFAULT 0" `
RemovePattern string ` xorm:"NOT NULL DEFAULT ''" `
RemovePatternMatcher * regexp . Regexp ` xorm:"-" `
MatchFullName bool ` xorm:"NOT NULL DEFAULT false" `
CreatedUnix timeutil . TimeStamp ` xorm:"created NOT NULL DEFAULT 0" `
UpdatedUnix timeutil . TimeStamp ` xorm:"updated NOT NULL DEFAULT 0" `
}
func ( pcr * PackageCleanupRule ) CompiledPattern ( ) error {
if pcr . KeepPatternMatcher != nil || pcr . RemovePatternMatcher != nil {
return nil
}
if pcr . KeepPattern != "" {
var err error
pcr . KeepPatternMatcher , err = regexp . Compile ( fmt . Sprintf ( ` (?i)\A%s\z ` , pcr . KeepPattern ) )
if err != nil {
return err
}
}
if pcr . RemovePattern != "" {
var err error
pcr . RemovePatternMatcher , err = regexp . Compile ( fmt . Sprintf ( ` (?i)\A%s\z ` , pcr . RemovePattern ) )
if err != nil {
return err
}
}
return nil
}
func InsertCleanupRule ( ctx context . Context , pcr * PackageCleanupRule ) ( * PackageCleanupRule , error ) {
return pcr , db . Insert ( ctx , pcr )
}
func GetCleanupRuleByID ( ctx context . Context , id int64 ) ( * PackageCleanupRule , error ) {
pcr := & PackageCleanupRule { }
has , err := db . GetEngine ( ctx ) . ID ( id ) . Get ( pcr )
if err != nil {
return nil , err
}
if ! has {
return nil , ErrPackageCleanupRuleNotExist
}
return pcr , nil
}
func UpdateCleanupRule ( ctx context . Context , pcr * PackageCleanupRule ) error {
_ , err := db . GetEngine ( ctx ) . ID ( pcr . ID ) . AllCols ( ) . Update ( pcr )
return err
}
func GetCleanupRulesByOwner ( ctx context . Context , ownerID int64 ) ( [ ] * PackageCleanupRule , error ) {
pcrs := make ( [ ] * PackageCleanupRule , 0 , 10 )
return pcrs , db . GetEngine ( ctx ) . Where ( "owner_id = ?" , ownerID ) . Find ( & pcrs )
}
func DeleteCleanupRuleByID ( ctx context . Context , ruleID int64 ) error {
_ , err := db . GetEngine ( ctx ) . ID ( ruleID ) . Delete ( & PackageCleanupRule { } )
return err
}
func HasOwnerCleanupRuleForPackageType ( ctx context . Context , ownerID int64 , packageType Type ) ( bool , error ) {
return db . GetEngine ( ctx ) .
Where ( "owner_id = ? AND type = ?" , ownerID , packageType ) .
Exist ( & PackageCleanupRule { } )
}
func IterateEnabledCleanupRules ( ctx context . Context , callback func ( context . Context , * PackageCleanupRule ) error ) error {
return db . Iterate (
ctx ,
builder . Eq { "enabled" : true } ,
callback ,
)
}