-
Notifications
You must be signed in to change notification settings - Fork 3
/
feed_groups_handler.go
53 lines (49 loc) · 1.31 KB
/
feed_groups_handler.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
package scheduler
import (
"fmt"
"net/http"
"strings"
)
type FeedGroupsHandler struct {
feedGroups []*FeedGroup
}
func NewFeedGroupsHandler(feeds []*FeedGroup) *FeedGroupsHandler {
return &FeedGroupsHandler{feedGroups: feeds}
}
func (srv *FeedGroupsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
resultChannel := make(chan groupResult, len(srv.feedGroups))
numPublished := 0
var pollErr, pubErr error
var errStrings []string
for _, group := range srv.feedGroups {
go func(group *FeedGroup) {
result := group.pollAndPublish()
resultChannel <- result
}(group)
}
for range srv.feedGroups {
result := <-resultChannel
numPublished += result.numPublished
if result.pollErr != nil {
pollErr = result.pollErr
}
if result.pubErr != nil {
pubErr = result.pubErr
}
}
for _, err := range []error{pollErr, pubErr} {
if err != nil {
errStrings = append(errStrings, err.Error())
}
}
if len(errStrings) > 0 {
http.Error(w, strings.Join(errStrings, "\n")+fmt.Sprintf("\n%d packages successfully processed, see log for details",
numPublished),
http.StatusInternalServerError)
return
}
_, err := w.Write([]byte(fmt.Sprintf("%d packages processed", numPublished)))
if err != nil {
http.Error(w, "unexpected error during http server write: %w", http.StatusInternalServerError)
}
}