From 215d98af3776e1043f1f003ca6357decc9367d00 Mon Sep 17 00:00:00 2001 From: Hadi <112569860+anotherhadi@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:31:25 +0200 Subject: [PATCH] Fix queue & warn about queued or cancelled search Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com> --- back/api/api.go | 36 +-- front/src/routes/search/[id]/index.svelte | 356 +++++++++++----------- 2 files changed, 202 insertions(+), 190 deletions(-) diff --git a/back/api/api.go b/back/api/api.go index d7d92f7..7759622 100644 --- a/back/api/api.go +++ b/back/api/api.go @@ -11,6 +11,8 @@ import ( "github.com/gin-gonic/gin" ) +var cancelled = make(map[string]struct{}) + func searchWorker(s *server.Server, cache *map[string]*search.Result, searchQueue chan string, limiter chan struct{}) { for id := range searchQueue { s.Mu.RLock() @@ -21,6 +23,16 @@ func searchWorker(s *server.Server, cache *map[string]*search.Result, searchQueu continue } + s.Mu.RLock() + _, isCancelled := cancelled[id] + s.Mu.RUnlock() + if isCancelled { + s.Mu.Lock() + r.Status = "cancelled" + s.Mu.Unlock() + continue + } + limiter <- struct{}{} search.Search(s, r.Query, r, s.Mu) <-limiter @@ -130,30 +142,14 @@ func routes(s *server.Server, cache *map[string]*search.Result, searchQueue chan return } + s.Mu.Lock() + cancelled[id] = struct{}{} if r.Status == "queued" { - newQueue := make(chan string, cap(searchQueue)) - for { - select { - case queuedId := <-searchQueue: - if queuedId != id { - newQueue <- queuedId - } - default: - goto Done - } - } - Done: - searchQueue = newQueue - - s.Mu.Lock() r.Status = "cancelled" - s.Mu.Unlock() - - c.JSON(http.StatusOK, gin.H{"Status": "Cancelled"}) - return } + s.Mu.Unlock() - c.JSON(http.StatusBadRequest, gin.H{"Error": "Cannot cancel running or finished search"}) + c.JSON(http.StatusOK, gin.H{"Status": "Cancelled"}) }) s.Router.GET("/dataleak/sample", func(c *gin.Context) { diff --git a/front/src/routes/search/[id]/index.svelte b/front/src/routes/search/[id]/index.svelte index b60655e..0646d43 100644 --- a/front/src/routes/search/[id]/index.svelte +++ b/front/src/routes/search/[id]/index.svelte @@ -43,7 +43,11 @@ .then((r) => { result = r.data; console.log(result); - if (result && result.Status !== "pending") { + if ( + result && + result.Status !== "pending" && + result.Status !== "queued" + ) { clearInterval(intervalId); } }) @@ -71,7 +75,7 @@ elapsedTime += pollingInterval; // Check for status change inside the interval - if (result && result.Status !== "pending") { + if (result && result.Status !== "pending" && result.Status !== "queued") { clearInterval(intervalId); return; } @@ -102,7 +106,7 @@ {#if result}
-

🔍 Search

+

🔍 Search

- {#if !result.LeakResult.Inactive} -
- -
-
- - Data wells lookup -
- {#if result.LeakResult.Error !== ""} - - {:else if result.LeakResult.Duration === 0} - - {:else if result.LeakResult.Rows.length > 0} - - {:else} - - {/if} -
-
- {#if result.LeakResult.Error !== ""} -