// retrieveFeed makes the HTTP GET request to the feed url then parses the xml // into the models we created func retrieveFeed(args ...interface{}) interface{} { res, err := http.Get(args[0].(string)) if err != nil { log.Fatal("error sending GET to url: ", err) return feedFetchResult{nil, &_Error{500, "Failed when sending GET request using the url you provided..."}} } raw, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { log.Fatal("error reading the response of GET: ", err) return feedFetchResult{nil, &_Error{500, "Failed when reading the response of GET request using the url you provided..."}} } var rssStruct models.RSS d := xml.NewDecoder(bytes.NewReader(raw)) // using xml.Unmarshal(raw, &rssStruct) for some reason does not parse channel link // but setting the default name space does the trick http://stackoverflow.com/questions/25332175/golang-rss-xml-parsing-atom10link-overrides-link d.DefaultSpace = "RssDefault" e := d.Decode(&rssStruct) if e != nil { log.Fatal("error parsing xml: ", e) return feedFetchResult{nil, &_Error{500, "Failed when processing the xml..."}} } feed := models.Feed{} feed.Title = rssStruct.Channel.Title feed.Description = rssStruct.Channel.Description feed.URL = args[0].(string) feed.LastPubDate = rssStruct.Channel.PubDate feed.FeedURL = rssStruct.Channel.LinkURL feed.ImageURL = rssStruct.Channel.Image.URL log.Print("itunes image url: ", rssStruct.Channel.ITunesImage) feed.Items = make([]*models.FeedItem, len(rssStruct.Channel.Items)) for i, item := range rssStruct.Channel.Items { var feedItem models.FeedItem feedItem.Title = item.Title feedItem.Description = item.Description feedItem.URL = item.Link feedItem.MediaURL = item.Enclosure.URL feedItem.PubDate = item.PubDate feed.Items[i] = &feedItem } return feedFetchResult{&feed, nil} }
func (pg *PostgresDBManager) SaveFeed(feed *models.Feed) bool { var feedStmt, itemStmt *sql.Stmt var err error var randID uuid.UUID // save feed to db feedStmt, err = pg.db.Prepare("INSERT INTO feeds VALUES($1, $2, $3, $4, $5, $6, $7)") if err != nil { log.Fatal(err) return false } // add id randID, err = uuid.V4() if err != nil { log.Fatal(err) return false } feed.ID = randID.String() _, err = feedStmt.Exec(feed.ID, feed.Title, feed.Description, feed.URL, feed.FeedURL, feed.LastPubDate, feed.ImageURL) if err != nil { log.Fatal(err) return false } // save feed Items itemStmt, err = pg.db.Prepare("INSERT INTO feed_items VALUES($1, $2, $3, $4, $5, $6, $7, $8)") if err != nil { log.Fatal(err) return false } for _, item := range feed.Items { randID, err = uuid.V4() if err != nil { log.Fatal(err) return false } item.ID = randID.String() _, err = itemStmt.Exec(item.ID, item.Title, item.Description, item.URL, item.MediaURL, item.PubDate, item.ImageURL, feed.ID) if err != nil { log.Fatal(err) return false } } return true }