/
handle_task.go
100 lines (73 loc) · 1.88 KB
/
handle_task.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package ead
import (
"net/http"
"sort"
"github.com/go-chi/chi"
"github.com/go-chi/render"
"github.com/rs/zerolog/log"
)
func (s *Service) findAvailableTask() *Task {
tasks := []*Task{}
for _, task := range s.tasks {
if task.InState == StatePending || task.Interrupted {
tasks = append(tasks, task)
}
}
if len(tasks) == 0 {
return nil
}
sort.Slice(tasks, func(i, j int) bool {
return tasks[i].currentTransition().Started.After(tasks[j].currentTransition().Started)
})
log.Info().Str("svc", "eadProcessor").Int("availableTasks", len(tasks)).Msg("returning first available task for processing")
return tasks[0]
}
func (s *Service) Tasks(w http.ResponseWriter, r *http.Request) {
s.rw.RLock()
defer s.rw.RUnlock()
// TODO(kiivihal): add option to filter by datasetID
render.JSON(w, r, s.tasks)
}
func (s *Service) findTask(orgID, datasetID string, filterActive bool) (*Task, error) {
s.rw.RLock()
defer s.rw.RUnlock()
for _, t := range s.tasks {
// TODO(kiivihal): add filter for orgID later
_ = orgID
if t.Meta.DatasetID == datasetID {
if filterActive && !t.isActive() {
continue
}
return t, nil
}
}
return nil, ErrTaskNotFound
}
func (s *Service) GetTask(w http.ResponseWriter, r *http.Request) {
s.rw.RLock()
defer s.rw.RUnlock()
id := chi.URLParam(r, "id")
task, ok := s.tasks[id]
if !ok {
http.Error(w, "unknown task", http.StatusNotFound)
return
}
render.JSON(w, r, task)
}
func (s *Service) CancelTask(w http.ResponseWriter, r *http.Request) {
id := chi.URLParam(r, "id")
s.rw.Lock()
defer s.rw.Unlock()
task, ok := s.tasks[id]
if !ok {
http.Error(w, "unknown task", http.StatusNotFound)
return
}
task.moveState(StateCanceled)
task.log().Info().Msg("canceling running ead task")
task.cancel()
task.Next()
// TODO(kiivihal): do we delete or keep it
// delete(s.tasks, id)
w.WriteHeader(http.StatusNoContent)
}