stash/pkg/gallery/delete.go
WithoutPants 5495d72849 File storage rewrite (#2676)
* Restructure data layer part 2 (#2599)
* Refactor and separate image model
* Refactor image query builder
* Handle relationships in image query builder
* Remove relationship management methods
* Refactor gallery model/query builder
* Add scenes to gallery model
* Convert scene model
* Refactor scene models
* Remove unused methods
* Add unit tests for gallery
* Add image tests
* Add scene tests
* Convert unnecessary scene value pointers to values
* Convert unnecessary pointer values to values
* Refactor scene partial
* Add scene partial tests
* Refactor ImagePartial
* Add image partial tests
* Refactor gallery partial update
* Add partial gallery update tests
* Use zero/null package for null values
* Add files and scan system
* Add sqlite implementation for files/folders
* Add unit tests for files/folders
* Image refactors
* Update image data layer
* Refactor gallery model and creation
* Refactor scene model
* Refactor scenes
* Don't set title from filename
* Allow galleries to freely add/remove images
* Add multiple scene file support to graphql and UI
* Add multiple file support for images in graphql/UI
* Add multiple file for galleries in graphql/UI
* Remove use of some deprecated fields
* Remove scene path usage
* Remove gallery path usage
* Remove path from image
* Move funscript to video file
* Refactor caption detection
* Migrate existing data
* Add post commit/rollback hook system
* Lint. Comment out import/export tests
* Add WithDatabase read only wrapper
* Prepend tasks to list
* Add 32 pre-migration
* Add warnings in release and migration notes
2022-09-06 07:03:42 +00:00

111 lines
3 KiB
Go

package gallery
import (
"context"
"github.com/stashapp/stash/pkg/image"
"github.com/stashapp/stash/pkg/models"
)
func (s *Service) Destroy(ctx context.Context, i *models.Gallery, fileDeleter *image.FileDeleter, deleteGenerated, deleteFile bool) ([]*models.Image, error) {
var imgsDestroyed []*models.Image
// TODO - we currently destroy associated files so that they will be rescanned.
// A better way would be to keep the file entries in the database, and recreate
// associated objects during the scan process if there are none already.
// if this is a zip-based gallery, delete the images as well first
zipImgsDestroyed, err := s.destroyZipImages(ctx, i, fileDeleter, deleteGenerated, deleteFile)
if err != nil {
return nil, err
}
imgsDestroyed = zipImgsDestroyed
// only delete folder based gallery images if we're deleting the folder
if deleteFile {
folderImgsDestroyed, err := s.destroyFolderImages(ctx, i, fileDeleter, deleteGenerated, deleteFile)
if err != nil {
return nil, err
}
imgsDestroyed = append(imgsDestroyed, folderImgsDestroyed...)
}
// we only want to delete a folder-based gallery if it is empty.
// this has to be done post-transaction
if err := s.Repository.Destroy(ctx, i.ID); err != nil {
return nil, err
}
return imgsDestroyed, nil
}
func (s *Service) destroyZipImages(ctx context.Context, i *models.Gallery, fileDeleter *image.FileDeleter, deleteGenerated, deleteFile bool) ([]*models.Image, error) {
var imgsDestroyed []*models.Image
// for zip-based galleries, delete the images as well first
for _, f := range i.Files {
// only do this where there are no other galleries related to the file
otherGalleries, err := s.Repository.FindByFileID(ctx, f.Base().ID)
if err != nil {
return nil, err
}
if len(otherGalleries) > 1 {
// other gallery associated, don't remove
continue
}
imgs, err := s.ImageFinder.FindByZipFileID(ctx, f.Base().ID)
if err != nil {
return nil, err
}
for _, img := range imgs {
if err := s.ImageService.Destroy(ctx, img, fileDeleter, deleteGenerated, false); err != nil {
return nil, err
}
imgsDestroyed = append(imgsDestroyed, img)
}
if deleteFile {
if err := fileDeleter.Files([]string{f.Base().Path}); err != nil {
return nil, err
}
}
}
return imgsDestroyed, nil
}
func (s *Service) destroyFolderImages(ctx context.Context, i *models.Gallery, fileDeleter *image.FileDeleter, deleteGenerated, deleteFile bool) ([]*models.Image, error) {
if i.FolderID == nil {
return nil, nil
}
var imgsDestroyed []*models.Image
// find images in this folder
imgs, err := s.ImageFinder.FindByFolderID(ctx, *i.FolderID)
if err != nil {
return nil, err
}
for _, img := range imgs {
// only destroy images that are not attached to other galleries
if len(img.GalleryIDs) > 1 {
continue
}
if err := s.ImageService.Destroy(ctx, img, fileDeleter, deleteGenerated, deleteFile); err != nil {
return nil, err
}
imgsDestroyed = append(imgsDestroyed, img)
}
return imgsDestroyed, nil
}