diff --git a/models/packages/descriptor.go b/models/packages/descriptor.go index be20465da0..a5e647981e 100644 --- a/models/packages/descriptor.go +++ b/models/packages/descriptor.go @@ -9,6 +9,7 @@ import ( "fmt" "net/url" + "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/cache" @@ -272,6 +273,15 @@ func GetPackageDescriptors(ctx context.Context, pvs []*PackageVersion) ([]*Packa return getPackageDescriptors(ctx, pvs, cache.NewEphemeralCache()) } +// GetAllPackageDescriptors gets all package descriptors for a package +func GetAllPackageDescriptors(ctx context.Context, p *Package) ([]*PackageDescriptor, error) { + pvs := make([]*PackageVersion, 0, 10) + if err := db.GetEngine(ctx).Where("package_id = ?", p.ID).Find(&pvs); err != nil { + return nil, err + } + return getPackageDescriptors(ctx, pvs, cache.NewEphemeralCache()) +} + func getPackageDescriptors(ctx context.Context, pvs []*PackageVersion, c *cache.EphemeralCache) ([]*PackageDescriptor, error) { pds := make([]*PackageDescriptor, 0, len(pvs)) for _, pv := range pvs { diff --git a/models/packages/package_property.go b/models/packages/package_property.go index e61967c85d..c297fd8901 100644 --- a/models/packages/package_property.go +++ b/models/packages/package_property.go @@ -5,6 +5,7 @@ package packages import ( "context" + "errors" "code.gitea.io/gitea/models/db" @@ -111,6 +112,8 @@ func DeletePropertiesByPackageID(ctx context.Context, refType PropertyType, pack deleteStmt = builder.Delete( builder.Eq{"ref_type": PropertyTypePackage}, builder.Eq{"ref_id": packageID}). From("package_property") + default: + return errors.New("invalid ref type") } _, err := db.GetEngine(ctx).Exec(deleteStmt) diff --git a/routers/web/user/package.go b/routers/web/user/package.go index 5eeb989899..da206a4105 100644 --- a/routers/web/user/package.go +++ b/routers/web/user/package.go @@ -493,7 +493,7 @@ func packageSettingsPostActionLink(ctx *context.Context, form *forms.PackageSett func packageSettingsPostActionDelete(ctx *context.Context) { pd := ctx.Package.Descriptor - if err := packages_service.RemovePackage(ctx, pd.Package); err != nil { + if err := packages_service.RemovePackage(ctx, ctx.Doer, pd.Package); err != nil { log.Error("Error deleting package: %v", err) ctx.Flash.Error(ctx.Tr("packages.settings.delete.error")) } else { diff --git a/services/packages/packages.go b/services/packages/packages.go index 16ec7a3598..7f244d26d3 100644 --- a/services/packages/packages.go +++ b/services/packages/packages.go @@ -625,8 +625,12 @@ func OpenBlobForDownload(ctx context.Context, pf *packages_model.PackageFile, pb } // RemovePackage deletes the package and all its versions -func RemovePackage(ctx context.Context, p *packages_model.Package) error { - return db.WithTx(ctx, func(ctx context.Context) error { +func RemovePackage(ctx context.Context, doer *user_model.User, p *packages_model.Package) error { + pds, err := packages_model.GetAllPackageDescriptors(ctx, p) + if err != nil { + return err + } + err = db.WithTx(ctx, func(ctx context.Context) error { err := packages_model.DeletePropertiesByPackageID(ctx, packages_model.PropertyTypePackage, p.ID) if err != nil { return err @@ -650,6 +654,13 @@ func RemovePackage(ctx context.Context, p *packages_model.Package) error { return packages_model.DeletePackageByID(ctx, p.ID) }) + if err != nil { + return err + } + for _, pd := range pds { + notify_service.PackageDelete(ctx, doer, pd) + } + return nil } // RemoveAllPackages for User