mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 04:44:37 +03:00
Fix handling of files to delete during delete Gallery operation (#5213)
* Only remove file in zip from image if deleting from zip file * Only remove file in folder from image if deleting from folder
This commit is contained in:
@@ -2,6 +2,7 @@ package image
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/stashapp/stash/pkg/file"
|
||||
"github.com/stashapp/stash/pkg/fsutil"
|
||||
@@ -43,8 +44,9 @@ func (s *Service) Destroy(ctx context.Context, i *models.Image, fileDeleter *Fil
|
||||
// Returns a slice of images that were destroyed.
|
||||
func (s *Service) DestroyZipImages(ctx context.Context, zipFile models.File, fileDeleter *FileDeleter, deleteGenerated bool) ([]*models.Image, error) {
|
||||
var imgsDestroyed []*models.Image
|
||||
zipFileID := zipFile.Base().ID
|
||||
|
||||
imgs, err := s.Repository.FindByZipFileID(ctx, zipFile.Base().ID)
|
||||
imgs, err := s.Repository.FindByZipFileID(ctx, zipFileID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -54,6 +56,23 @@ func (s *Service) DestroyZipImages(ctx context.Context, zipFile models.File, fil
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// #5048 - if the image has multiple files, we just want to remove the file in the zip file,
|
||||
// not delete the image entirely
|
||||
if len(img.Files.List()) > 1 {
|
||||
for _, f := range img.Files.List() {
|
||||
if f.Base().ZipFileID == nil || *f.Base().ZipFileID != zipFileID {
|
||||
continue
|
||||
}
|
||||
|
||||
if err := s.Repository.RemoveFileID(ctx, img.ID, f.Base().ID); err != nil {
|
||||
return nil, fmt.Errorf("failed to remove file from image: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// don't delete the image
|
||||
continue
|
||||
}
|
||||
|
||||
const deleteFileInZip = false
|
||||
if err := s.destroyImage(ctx, img, fileDeleter, deleteGenerated, deleteFileInZip); err != nil {
|
||||
return nil, err
|
||||
@@ -65,6 +84,66 @@ func (s *Service) DestroyZipImages(ctx context.Context, zipFile models.File, fil
|
||||
return imgsDestroyed, nil
|
||||
}
|
||||
|
||||
// DestroyFolderImages destroys all images in a folder, optionally marking the files and generated files for deletion.
|
||||
// It will not delete images that are attached to more than one gallery.
|
||||
// Returns a slice of images that were destroyed.
|
||||
func (s *Service) DestroyFolderImages(ctx context.Context, folderID models.FolderID, fileDeleter *FileDeleter, deleteGenerated, deleteFile bool) ([]*models.Image, error) {
|
||||
var imgsDestroyed []*models.Image
|
||||
|
||||
// find images in this folder
|
||||
imgs, err := s.Repository.FindByFolderID(ctx, folderID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, img := range imgs {
|
||||
if err := img.LoadFiles(ctx, s.Repository); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// #5048 - if the image has multiple files, we just want to remove the file
|
||||
// in the folder
|
||||
if len(img.Files.List()) > 1 {
|
||||
for _, f := range img.Files.List() {
|
||||
if f.Base().ParentFolderID != folderID {
|
||||
continue
|
||||
}
|
||||
|
||||
if err := s.Repository.RemoveFileID(ctx, img.ID, f.Base().ID); err != nil {
|
||||
return nil, fmt.Errorf("failed to remove file from image: %w", err)
|
||||
}
|
||||
|
||||
// we still want to delete the file from the folder, if applicable
|
||||
if deleteFile {
|
||||
if err := file.Destroy(ctx, s.File, f, fileDeleter.Deleter, deleteFile); err != nil {
|
||||
return nil, fmt.Errorf("failed to delete image file: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// don't delete the image
|
||||
continue
|
||||
}
|
||||
|
||||
if err := img.LoadGalleryIDs(ctx, s.Repository); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// only destroy images that are not attached to other galleries
|
||||
if len(img.GalleryIDs.List()) > 1 {
|
||||
continue
|
||||
}
|
||||
|
||||
if err := s.Destroy(ctx, img, fileDeleter, deleteGenerated, deleteFile); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
imgsDestroyed = append(imgsDestroyed, img)
|
||||
}
|
||||
|
||||
return imgsDestroyed, nil
|
||||
}
|
||||
|
||||
// Destroy destroys an image, optionally marking the file and generated files for deletion.
|
||||
func (s *Service) destroyImage(ctx context.Context, i *models.Image, fileDeleter *FileDeleter, deleteGenerated, deleteFile bool) error {
|
||||
if deleteFile {
|
||||
|
||||
Reference in New Issue
Block a user