From 1c0726b55f61fb8e6fc35e0a2fea340aee1984d9 Mon Sep 17 00:00:00 2001 From: stz184 Date: Sat, 23 Jan 2021 15:42:48 +0200 Subject: [PATCH 1/3] * Fixes photoview/photoview#168 Fixed issue deleting existing users. --- api/graphql/resolvers/user.go | 43 +++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/api/graphql/resolvers/user.go b/api/graphql/resolvers/user.go index d7ed5914..60493731 100644 --- a/api/graphql/resolvers/user.go +++ b/api/graphql/resolvers/user.go @@ -211,17 +211,50 @@ func (r *mutationResolver) CreateUser(ctx context.Context, username string, pass } func (r *mutationResolver) DeleteUser(ctx context.Context, id int) (*models.User, error) { - var user models.User + deletedAlbumIDs := make([]int, 0) - if err := r.Database.First(&user, id).Error; err != nil { + err := r.Database.Transaction(func(tx *gorm.DB) error { + if err := r.Database.First(&user, id).Error; err != nil { + return err + } + + if err := user.FillAlbums(r.Database); err != nil { + return err + } + + for _, album := range user.Albums { + var associatedUsers = r.Database.Model(album).Association("Owners").Count() + if err := r.Database.Model(&user).Association("Albums").Delete(album); err != nil { + return err + } + + if associatedUsers == 1 { + deletedAlbumIDs = append(deletedAlbumIDs, album.ID) + if dbc := r.Database.Delete(album); dbc.Error != nil { + return dbc.Error + } + } + } + + if err := r.Database.Delete(&user).Error; err != nil { + return err + } + + return nil + }) + + if err != nil { return nil, err } - if err := r.Database.Delete(&user).Error; err != nil { - return nil, err + // If there is only one associated user, clean up the cache folder and delete the album row + for _, deletedAlbumID := range deletedAlbumIDs { + cachePath := path.Join(scanner.MediaCachePath(), strconv.Itoa(int(deletedAlbumID))) + if err := os.RemoveAll(cachePath); err != nil { + return &user, err + } } - return &user, nil } From b176694d2b9b0000ebf95cb79fa7e9ad4ba0e04c Mon Sep 17 00:00:00 2001 From: stz184 Date: Sat, 23 Jan 2021 15:42:48 +0200 Subject: [PATCH 2/3] * Fixes photoview/photoview#168 Fixed issue deleting existing users. --- api/graphql/resolvers/user.go | 43 +++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/api/graphql/resolvers/user.go b/api/graphql/resolvers/user.go index d7ed5914..60493731 100644 --- a/api/graphql/resolvers/user.go +++ b/api/graphql/resolvers/user.go @@ -211,17 +211,50 @@ func (r *mutationResolver) CreateUser(ctx context.Context, username string, pass } func (r *mutationResolver) DeleteUser(ctx context.Context, id int) (*models.User, error) { - var user models.User + deletedAlbumIDs := make([]int, 0) - if err := r.Database.First(&user, id).Error; err != nil { + err := r.Database.Transaction(func(tx *gorm.DB) error { + if err := r.Database.First(&user, id).Error; err != nil { + return err + } + + if err := user.FillAlbums(r.Database); err != nil { + return err + } + + for _, album := range user.Albums { + var associatedUsers = r.Database.Model(album).Association("Owners").Count() + if err := r.Database.Model(&user).Association("Albums").Delete(album); err != nil { + return err + } + + if associatedUsers == 1 { + deletedAlbumIDs = append(deletedAlbumIDs, album.ID) + if dbc := r.Database.Delete(album); dbc.Error != nil { + return dbc.Error + } + } + } + + if err := r.Database.Delete(&user).Error; err != nil { + return err + } + + return nil + }) + + if err != nil { return nil, err } - if err := r.Database.Delete(&user).Error; err != nil { - return nil, err + // If there is only one associated user, clean up the cache folder and delete the album row + for _, deletedAlbumID := range deletedAlbumIDs { + cachePath := path.Join(scanner.MediaCachePath(), strconv.Itoa(int(deletedAlbumID))) + if err := os.RemoveAll(cachePath); err != nil { + return &user, err + } } - return &user, nil } From 2d54847fed3555af104c2c25795313de7c84bb13 Mon Sep 17 00:00:00 2001 From: viktorstrate Date: Sun, 24 Jan 2021 17:25:43 +0100 Subject: [PATCH 3/3] Refactor DeleteUser resolver - Use tx inside transaction - Use .Clear() to delete all albums at once, to prevent unnecessary database hits. --- api/graphql/resolvers/user.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/api/graphql/resolvers/user.go b/api/graphql/resolvers/user.go index 60493731..bf23d936 100644 --- a/api/graphql/resolvers/user.go +++ b/api/graphql/resolvers/user.go @@ -215,29 +215,31 @@ func (r *mutationResolver) DeleteUser(ctx context.Context, id int) (*models.User deletedAlbumIDs := make([]int, 0) err := r.Database.Transaction(func(tx *gorm.DB) error { - if err := r.Database.First(&user, id).Error; err != nil { + if err := tx.First(&user, id).Error; err != nil { return err } - if err := user.FillAlbums(r.Database); err != nil { + userAlbums := user.Albums + if err := tx.Model(&user).Association("Albums").Find(&userAlbums); err != nil { return err } - for _, album := range user.Albums { - var associatedUsers = r.Database.Model(album).Association("Owners").Count() - if err := r.Database.Model(&user).Association("Albums").Delete(album); err != nil { - return err - } + if err := tx.Model(&user).Association("Albums").Clear(); err != nil { + return err + } - if associatedUsers == 1 { + for _, album := range userAlbums { + var associatedUsers = tx.Model(album).Association("Owners").Count() + + if associatedUsers == 0 { deletedAlbumIDs = append(deletedAlbumIDs, album.ID) - if dbc := r.Database.Delete(album); dbc.Error != nil { - return dbc.Error + if err := tx.Delete(album).Error; err != nil { + return err } } } - if err := r.Database.Delete(&user).Error; err != nil { + if err := tx.Delete(&user).Error; err != nil { return err }