diff --git a/pkg/api/resolver_mutation_gallery.go b/pkg/api/resolver_mutation_gallery.go
index 16cbec30d..77b48d09d 100644
--- a/pkg/api/resolver_mutation_gallery.go
+++ b/pkg/api/resolver_mutation_gallery.go
@@ -411,10 +411,13 @@ func adjustGalleryTagIDs(tx *sqlx.Tx, galleryID int, ids models.BulkUpdateIds) (
func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.GalleryDestroyInput) (bool, error) {
qb := models.NewGalleryQueryBuilder()
+ iqb := models.NewImageQueryBuilder()
tx := database.DB.MustBeginTx(ctx, nil)
var galleries []*models.Gallery
var imgsToPostProcess []*models.Image
+ var imgsToDelete []*models.Image
+
for _, id := range input.Ids {
galleryID, _ := strconv.Atoi(id)
@@ -430,8 +433,7 @@ func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.Gall
}
// if this is a zip-based gallery, delete the images as well
- if gallery.Path.Valid {
- iqb := models.NewImageQueryBuilder()
+ if gallery.Zip {
imgs, err := iqb.FindByGalleryID(galleryID)
if err != nil {
tx.Rollback()
@@ -439,7 +441,7 @@ func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.Gall
}
for _, img := range imgs {
- err = qb.Destroy(img.ID, tx)
+ err = iqb.Destroy(img.ID, tx)
if err != nil {
tx.Rollback()
return false, err
@@ -447,6 +449,32 @@ func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.Gall
imgsToPostProcess = append(imgsToPostProcess, img)
}
+ } else if input.DeleteFile != nil && *input.DeleteFile {
+ // Delete image if it is only attached to this gallery
+ imgs, err := iqb.FindByGalleryID(galleryID)
+ if err != nil {
+ tx.Rollback()
+ return false, err
+ }
+
+ for _, img := range imgs {
+ imgGalleries, err := qb.FindByImageID(img.ID, tx)
+ if err != nil {
+ tx.Rollback()
+ return false, err
+ }
+
+ if len(imgGalleries) == 0 {
+ err = iqb.Destroy(img.ID, tx)
+ if err != nil {
+ tx.Rollback()
+ return false, err
+ }
+
+ imgsToDelete = append(imgsToDelete, img)
+ imgsToPostProcess = append(imgsToPostProcess, img)
+ }
+ }
}
}
@@ -460,6 +488,10 @@ func (r *mutationResolver) GalleryDestroy(ctx context.Context, input models.Gall
for _, gallery := range galleries {
manager.DeleteGalleryFile(gallery)
}
+
+ for _, img := range imgsToDelete {
+ manager.DeleteImageFile(img)
+ }
}
// if delete generated is true, then delete the generated files
diff --git a/pkg/models/querybuilder_gallery.go b/pkg/models/querybuilder_gallery.go
index ffe3e54a6..8cc247126 100644
--- a/pkg/models/querybuilder_gallery.go
+++ b/pkg/models/querybuilder_gallery.go
@@ -181,6 +181,8 @@ func (qb *GalleryQueryBuilder) Query(galleryFilter *GalleryFilterType, findFilte
left join performers_galleries as performers_join on performers_join.gallery_id = galleries.id
left join studios as studio on studio.id = galleries.studio_id
left join galleries_tags as tags_join on tags_join.gallery_id = galleries.id
+ left join galleries_images as images_join on images_join.gallery_id = galleries.id
+ left join images on images_join.image_id = images.id
`
if q := findFilter.Q; q != nil && *q != "" {
diff --git a/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx b/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx
index 5496ac48a..3f84649cc 100644
--- a/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx
+++ b/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx
@@ -76,11 +76,13 @@ export const DeleteGalleriesDialog: React.FC