11package main
22
33import (
4- "encoding/json"
54 "errors"
6- "fmt"
75 "log"
86 "time"
97
8+ "github.com/securityfirst/umbrella-api/feed"
9+
1010 "sort"
1111 "strconv"
1212 "strings"
1313
1414 "github.com/securityfirst/umbrella-api/models"
1515 "github.com/securityfirst/umbrella-api/utils"
1616
17- "github.com/PuerkitoBio/goquery"
1817 "github.com/gin-gonic/gin"
1918 "github.com/gosexy/to"
2019)
@@ -65,7 +64,7 @@ func (um *Umbrella) getFeedItems(sources []string, country models.Country, since
6564 var cleanSources , toRefresh , diff []int
6665 for i := range sources {
6766 inrange := to .Int64 (strings .TrimSpace (sources [i ]))
68- if inrange >= 0 && inrange < SourceCount {
67+ if inrange >= 0 && inrange < feed . SourceCount {
6968 cleanSources = append (cleanSources , int (inrange ))
7069 if getLastChecked [inrange ] < time .Now ().Add (- 30 * time .Minute ).Unix () {
7170 toRefresh = append (toRefresh , int (inrange ))
@@ -76,113 +75,47 @@ func (um *Umbrella) getFeedItems(sources []string, country models.Country, since
7675 if len (cleanSources ) == 0 {
7776 err = errors .New ("No Valid sources selected" )
7877 } 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 {
152109 continue
153110 }
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 {
171113 continue
172114 }
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 )
185117 }
118+ go um .updateLastChecked (country .Iso2 , src , time .Now ().Unix ())
186119 }
187120 }
188121 if len (diff ) > 0 {
@@ -222,13 +155,3 @@ func (slice SortFeedByDate) Less(i, j int) bool {
222155func (slice SortFeedByDate ) Swap (i , j int ) {
223156 slice [i ], slice [j ] = slice [j ], slice [i ]
224157}
225-
226- const (
227- ReliefWeb = iota
228- FCO
229- UN
230- CDC
231- GDASC
232- CADATA
233- SourceCount
234- )
0 commit comments