1
1
package main
2
2
3
3
import (
4
- "encoding/json"
5
4
"errors"
6
- "fmt"
7
5
"log"
8
6
"time"
9
7
8
+ "github.com/securityfirst/umbrella-api/feed"
9
+
10
10
"sort"
11
11
"strconv"
12
12
"strings"
13
13
14
14
"github.com/securityfirst/umbrella-api/models"
15
15
"github.com/securityfirst/umbrella-api/utils"
16
16
17
- "github.com/PuerkitoBio/goquery"
18
17
"github.com/gin-gonic/gin"
19
18
"github.com/gosexy/to"
20
19
)
@@ -65,7 +64,7 @@ func (um *Umbrella) getFeedItems(sources []string, country models.Country, since
65
64
var cleanSources , toRefresh , diff []int
66
65
for i := range sources {
67
66
inrange := to .Int64 (strings .TrimSpace (sources [i ]))
68
- if inrange >= 0 && inrange < SourceCount {
67
+ if inrange >= 0 && inrange < feed . SourceCount {
69
68
cleanSources = append (cleanSources , int (inrange ))
70
69
if getLastChecked [inrange ] < time .Now ().Add (- 30 * time .Minute ).Unix () {
71
70
toRefresh = append (toRefresh , int (inrange ))
@@ -76,113 +75,47 @@ func (um *Umbrella) getFeedItems(sources []string, country models.Country, since
76
75
if len (cleanSources ) == 0 {
77
76
err = errors .New ("No Valid sources selected" )
78
77
} else if len (toRefresh ) > 0 {
79
- for k := range toRefresh {
80
- switch src := toRefresh [k ]; src {
81
- case CDC :
82
- lenItems := len (items )
83
- fmt .Println ("refresh cdc" )
84
- // refresh cdc
85
- if len (items ) == lenItems {
86
- diff = append (diff , src )
87
- }
88
- // go um.updateLastChecked(country.Iso2, CDC, time.Now().Unix())
89
- case ReliefWeb :
90
- lenItems := len (items )
91
- body , err := makeRequest (fmt .Sprintf ("https://api.reliefweb.int/v1/countries/%v" , country .ReliefWeb ), "get" , nil )
92
- var rwResp RWResponse
93
- err = json .Unmarshal (body , & rwResp )
94
- if err != nil {
95
- utils .CheckErr (err )
96
- fmt .Println (string (body [:]))
97
- } else {
98
- go um .updateLastChecked (country .Iso2 , ReliefWeb , time .Now ().Unix ())
99
- }
100
- if len (rwResp .Data ) < 1 {
101
- utils .CheckErr (errors .New ("No data received" ))
102
- continue
103
- }
104
- if rwResp .Data [0 ].Fields .DescriptionHTML != "" {
105
- doc , err := goquery .NewDocumentFromReader (strings .NewReader (rwResp .Data [0 ].Fields .DescriptionHTML ))
106
- if err != nil {
107
- log .Fatal (err )
108
- }
109
- s := doc .Find ("h3" ).First ()
110
- s .Next ().Children ().Each (func (i int , t * goquery.Selection ) {
111
- href , ok := t .Contents ().Attr ("href" )
112
- if ok {
113
- item := models.FeedItem {
114
- Title : t .Contents ().Text (),
115
- URL : href ,
116
- Country : country .Iso2 ,
117
- Source : ReliefWeb ,
118
- UpdatedAt : time .Now ().Unix (),
119
- }
120
- segments := strings .Split (href , "/" )
121
- if len (segments ) > 0 && to .Int64 (segments [len (segments )- 1 ]) != 0 {
122
- nodeUrl := fmt .Sprintf ("https://api.reliefweb.int/v1/reports/%v" , segments [len (segments )- 1 ])
123
- body , err := makeRequest (nodeUrl , "get" , nil )
124
- var rwReport RWReport
125
- err = json .Unmarshal (body , & rwReport )
126
- if err != nil {
127
- utils .CheckErr (err )
128
- fmt .Println (string (body [:]))
129
- } else {
130
- if rwReport .Data [0 ].Fields .Headline .Summary != "" {
131
- item .Description = rwReport .Data [0 ].Fields .Headline .Summary
132
- } else {
133
- item .Description = rwReport .Data [0 ].Fields .BodyHTML
134
- }
135
- item .UpdatedAt = rwReport .Data [0 ].Fields .Date .Changed .Unix ()
136
- }
137
-
138
- }
139
- items = append (items , item )
140
- go item .UpdateRelief (um .Db )
141
- }
142
- })
143
- }
144
- if len (items ) == lenItems {
145
- diff = append (diff , src )
146
- }
147
- case GDASC :
148
- f := GdascFetcher {}
149
- srcItems , err := f .Fetch ()
150
- if err != nil {
151
- utils .CheckErr (err )
78
+ for _ , src := range toRefresh {
79
+ var fetcher interface {
80
+ Fetch () ([]models.FeedItem , error )
81
+ }
82
+ var updater = (* models .FeedItem ).UpdateOthers
83
+ switch src {
84
+ case feed .CDC :
85
+ fetcher = & feed.CDCFetcher {}
86
+ case feed .ReliefWeb :
87
+ fetcher = & feed.ReliefWebFetcher {Country : & country }
88
+ updater = (* models .FeedItem ).UpdateRelief
89
+ case feed .CADATA :
90
+ fetcher = & feed.CadataFetcher {}
91
+ case feed .GDASC :
92
+ fetcher = & feed.GdascFetcher {}
93
+ case feed .FCO :
94
+ fetcher = & feed.FCOFetcher {}
95
+ }
96
+ if fetcher == nil {
97
+ log .Printf ("[%v] no match" , src )
98
+ continue
99
+ }
100
+ items , err := fetcher .Fetch ()
101
+ if err != nil {
102
+ utils .CheckErr (err )
103
+ continue
104
+ }
105
+ var change bool
106
+ for i , item := range items {
107
+ go updater (& items [i ], um .Db )
108
+ if item .Country != country .Iso2 {
152
109
continue
153
110
}
154
- var change bool
155
- for i , item := range srcItems {
156
- go srcItems [i ].UpdateOthers (um .Db )
157
- if item .Country == country .Iso2 {
158
- items = append (items , item )
159
- if change {
160
- continue
161
- }
162
- change = true
163
- diff = append (diff , src )
164
- }
165
- }
166
- case CADATA :
167
- f := CadataFetcher {}
168
- srcItems , err := f .Fetch ()
169
- if err != nil {
170
- utils .CheckErr (err )
111
+ items = append (items , item )
112
+ if change {
171
113
continue
172
114
}
173
- var change bool
174
- for i , item := range srcItems {
175
- go srcItems [i ].UpdateOthers (um .Db )
176
- if item .Country == country .Iso2 {
177
- items = append (items , item )
178
- if change {
179
- continue
180
- }
181
- change = true
182
- diff = append (diff , src )
183
- }
184
- }
115
+ change = true
116
+ diff = append (diff , src )
185
117
}
118
+ go um .updateLastChecked (country .Iso2 , src , time .Now ().Unix ())
186
119
}
187
120
}
188
121
if len (diff ) > 0 {
@@ -222,13 +155,3 @@ func (slice SortFeedByDate) Less(i, j int) bool {
222
155
func (slice SortFeedByDate ) Swap (i , j int ) {
223
156
slice [i ], slice [j ] = slice [j ], slice [i ]
224
157
}
225
-
226
- const (
227
- ReliefWeb = iota
228
- FCO
229
- UN
230
- CDC
231
- GDASC
232
- CADATA
233
- SourceCount
234
- )
0 commit comments