Cancel queued search

Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
This commit is contained in:
Hadi
2025-10-04 19:19:19 +02:00
parent e7a9f9a0fe
commit ad789c73bd
4 changed files with 78 additions and 7 deletions

View File

@@ -118,6 +118,44 @@ func routes(s *server.Server, cache *map[string]*search.Result, searchQueue chan
c.JSON(http.StatusOK, r)
})
s.Router.POST("/search/cancel/:id", func(c *gin.Context) {
id := c.Param("id")
s.Mu.Lock()
r, exists := (*cache)[id]
s.Mu.Unlock()
if !exists {
c.JSON(http.StatusNotFound, gin.H{"Error": "Search not found"})
return
}
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
}
c.JSON(http.StatusBadRequest, gin.H{"Error": "Cannot cancel running or finished search"})
})
s.Router.GET("/dataleak/sample", func(c *gin.Context) {
path := c.Query("path")
if path == "" {

View File

@@ -27,7 +27,7 @@ type Query struct {
type Result struct {
Id string
Date time.Time
Status string // "queued", "pending", "completed", "error"
Status string // "queued", "pending", "completed", "error", "cancelled"
Query Query
ResultsCount int // Total number of results found across all services
@@ -44,6 +44,8 @@ func Search(s *server.Server, q Query, r *Result, mu *sync.RWMutex) {
r.ResultsCount = 0
mu.Unlock()
time.Sleep(20 * time.Second) // To ensure the status update is sent to the client before starting the search
wg.Add(3)
go func() {
if !q.Datawells {