diff --git a/api/scanner/cleanup_media.go b/api/scanner/cleanup_media.go index 83b8c054..53f5f9d4 100644 --- a/api/scanner/cleanup_media.go +++ b/api/scanner/cleanup_media.go @@ -2,12 +2,13 @@ package scanner import ( "database/sql" - "github.com/pkg/errors" - "github.com/viktorstrate/photoview/api/graphql/models" "os" "path" "strconv" "strings" + + "github.com/pkg/errors" + "github.com/viktorstrate/photoview/api/graphql/models" ) func CleanupMedia(db *sql.DB, albumId int, albumPhotos []*models.Media) []error { @@ -64,3 +65,55 @@ func CleanupMedia(db *sql.DB, albumId int, albumPhotos []*models.Media) []error return deleteErrors } + +func deleteOldUserAlbums(db *sql.DB, scannedAlbums []*models.Album, user *models.User) []error { + if len(scannedAlbums) == 0 { + return nil + } + + albumPaths := make([]interface{}, len(scannedAlbums)) + for i, album := range scannedAlbums { + albumPaths[i] = album.Path + } + + // Delete old albums + album_args := make([]interface{}, 0) + album_args = append(album_args, user.UserID) + album_args = append(album_args, albumPaths...) + + albums_questions := strings.Repeat("MD5(?),", len(albumPaths))[:len(albumPaths)*7-1] + rows, err := db.Query("SELECT album_id FROM album WHERE album.owner_id = ? AND path_hash NOT IN ("+albums_questions+")", album_args...) + if err != nil { + return []error{errors.Wrap(err, "get albums to be deleted from database")} + } + defer rows.Close() + + deleteErrors := make([]error, 0) + + deleted_album_ids := make([]interface{}, 0) + for rows.Next() { + var album_id int + if err := rows.Scan(&album_id); err != nil { + deleteErrors = append(deleteErrors, errors.Wrapf(err, "parse album to be removed (album_id %d)", album_id)) + continue + } + + deleted_album_ids = append(deleted_album_ids, album_id) + cache_path := path.Join("./photo_cache", strconv.Itoa(album_id)) + err := os.RemoveAll(cache_path) + if err != nil { + deleteErrors = append(deleteErrors, errors.Wrapf(err, "delete unused cache folder (%s)", cache_path)) + } + } + + if len(deleted_album_ids) > 0 { + albums_questions = strings.Repeat("?,", len(deleted_album_ids))[:len(deleted_album_ids)*2-1] + + if _, err := db.Exec("DELETE FROM album WHERE album_id IN ("+albums_questions+")", deleted_album_ids...); err != nil { + ScannerError("Could not delete old albums from database:\n%s\n", err) + deleteErrors = append(deleteErrors, errors.Wrap(err, "delete old albums from database")) + } + } + + return deleteErrors +} diff --git a/api/scanner/scanner_user.go b/api/scanner/scanner_user.go index 4d0b5b8c..7c297a60 100644 --- a/api/scanner/scanner_user.go +++ b/api/scanner/scanner_user.go @@ -8,8 +8,6 @@ import ( "log" "os" "path" - "strconv" - "strings" "github.com/pkg/errors" "github.com/viktorstrate/photoview/api/graphql/models" @@ -157,58 +155,6 @@ func directoryContainsPhotos(rootPath string, cache *AlbumScannerCache) bool { return false } -func deleteOldUserAlbums(db *sql.DB, scannedAlbums []*models.Album, user *models.User) []error { - if len(scannedAlbums) == 0 { - return nil - } - - albumPaths := make([]interface{}, len(scannedAlbums)) - for i, album := range scannedAlbums { - albumPaths[i] = album.Path - } - - // Delete old albums - album_args := make([]interface{}, 0) - album_args = append(album_args, user.UserID) - album_args = append(album_args, albumPaths...) - - albums_questions := strings.Repeat("MD5(?),", len(albumPaths))[:len(albumPaths)*7-1] - rows, err := db.Query("SELECT album_id FROM album WHERE album.owner_id = ? AND path_hash NOT IN ("+albums_questions+")", album_args...) - if err != nil { - return []error{errors.Wrap(err, "get albums to be deleted from database")} - } - defer rows.Close() - - deleteErrors := make([]error, 0) - - deleted_album_ids := make([]interface{}, 0) - for rows.Next() { - var album_id int - if err := rows.Scan(&album_id); err != nil { - deleteErrors = append(deleteErrors, errors.Wrapf(err, "parse album to be removed (album_id %d)", album_id)) - continue - } - - deleted_album_ids = append(deleted_album_ids, album_id) - cache_path := path.Join("./photo_cache", strconv.Itoa(album_id)) - err := os.RemoveAll(cache_path) - if err != nil { - deleteErrors = append(deleteErrors, errors.Wrapf(err, "delete unused cache folder (%s)", cache_path)) - } - } - - if len(deleted_album_ids) > 0 { - albums_questions = strings.Repeat("?,", len(deleted_album_ids))[:len(deleted_album_ids)*2-1] - - if _, err := db.Exec("DELETE FROM album WHERE album_id IN ("+albums_questions+")", deleted_album_ids...); err != nil { - ScannerError("Could not delete old albums from database:\n%s\n", err) - deleteErrors = append(deleteErrors, errors.Wrap(err, "delete old albums from database")) - } - } - - return deleteErrors -} - func ScannerError(format string, args ...interface{}) { message := fmt.Sprintf(format, args...)