From df3e03698f01e7ecd705c1d415eb51661317d854 Mon Sep 17 00:00:00 2001 From: Deluan Date: Wed, 25 Jun 2025 08:49:47 -0400 Subject: [PATCH] feat(library): trigger scan after successful library deletion to clean up orphaned data Signed-off-by: Deluan --- core/library.go | 26 +++++++++++++++++++++++++- core/library_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/core/library.go b/core/library.go index ce56d7e03..c96738ad0 100644 --- a/core/library.go +++ b/core/library.go @@ -208,8 +208,32 @@ func (r *libraryRepositoryWrapper) Delete(id string) error { }} } + // Get library info before deletion for logging + lib, err := r.Get(libID) + if err != nil { + return r.mapError(err) + } + err = r.LibraryRepository.Delete(libID) - return r.mapError(err) + if err != nil { + return r.mapError(err) + } + + // Trigger scan after successful library deletion to clean up orphaned data + if r.scanner != nil { + go func() { + log.Info(r.ctx, "Triggering scan after library deletion", "libraryID", lib.ID, "name", lib.Name, "path", lib.Path) + start := time.Now() + warnings, err := r.scanner.ScanAll(r.ctx, false) // Quick scan to clean up orphaned data + if err != nil { + log.Error(r.ctx, "Error scanning after library deletion", "libraryID", lib.ID, "name", lib.Name, err) + } else { + log.Info(r.ctx, "Scan completed after library deletion", "libraryID", lib.ID, "name", lib.Name, "warnings", len(warnings), "elapsed", time.Since(start)) + } + }() + } + + return nil } // Helper methods diff --git a/core/library_test.go b/core/library_test.go index 7b0488989..65f0bc039 100644 --- a/core/library_test.go +++ b/core/library_test.go @@ -701,5 +701,35 @@ var _ = Describe("Library Service", func() { return len(scanner.ScanCalls) }, "100ms", "10ms").Should(Equal(0)) }) + + It("triggers scan when deleting a library", func() { + // First create a library + libraryRepo.SetData(model.Libraries{ + {ID: 1, Name: "Library to Delete", Path: tempDir}, + }) + + // Delete the library + err := repo.Delete("1") + Expect(err).NotTo(HaveOccurred()) + + // Wait briefly for the goroutine to complete + Eventually(func() int { + return len(scanner.ScanCalls) + }, "1s", "10ms").Should(Equal(1)) + + // Verify scan was called with correct parameters + Expect(scanner.ScanCalls[0].FullScan).To(BeFalse()) // Should be quick scan + }) + + It("does not trigger scan when library deletion fails", func() { + // Try to delete a non-existent library + err := repo.Delete("999") + Expect(err).To(HaveOccurred()) + + // Ensure no scan was triggered since deletion failed + Consistently(func() int { + return len(scanner.ScanCalls) + }, "100ms", "10ms").Should(Equal(0)) + }) }) })