#6 - fetch feed
This commit is contained in:
30
internal/handlers/fetchFeedHandler.go
Normal file
30
internal/handlers/fetchFeedHandler.go
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
package handlers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"github.com/rdarius/boot-dev-blog-aggregator/internal/config"
|
||||||
|
"github.com/rdarius/boot-dev-blog-aggregator/internal/rss"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FetchFeedHandler(s *config.State, cmd config.Command) error {
|
||||||
|
var feedUrl string
|
||||||
|
if len(cmd.Args) < 1 {
|
||||||
|
feedUrl = "https://www.wagslane.dev/index.xml"
|
||||||
|
} else {
|
||||||
|
feedUrl = cmd.Args[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
feed, err := rss.FetchFeed(ctx, feedUrl)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Failed to fetch feed")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("%v", feed)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
57
internal/rss/rss.go
Normal file
57
internal/rss/rss.go
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package rss
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/xml"
|
||||||
|
"html"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Feed struct {
|
||||||
|
Channel struct {
|
||||||
|
Title string `xml:"title"`
|
||||||
|
Link string `xml:"link"`
|
||||||
|
Description string `xml:"description"`
|
||||||
|
Item []Item `xml:"item"`
|
||||||
|
} `xml:"channel"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Item struct {
|
||||||
|
Title string `xml:"title"`
|
||||||
|
Link string `xml:"link"`
|
||||||
|
Description string `xml:"description"`
|
||||||
|
PubDate string `xml:"pubDate"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func FetchFeed(ctx context.Context, feedURL string) (*Feed, error) {
|
||||||
|
req, err := http.NewRequestWithContext(ctx, "GET", feedURL, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.Header.Set("User-Agent", "gator")
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
res, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var feed Feed
|
||||||
|
err = xml.Unmarshal(res, &feed)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
feed.Channel.Title = html.UnescapeString(feed.Channel.Title)
|
||||||
|
feed.Channel.Link = html.UnescapeString(feed.Channel.Link)
|
||||||
|
feed.Channel.Description = html.UnescapeString(feed.Channel.Description)
|
||||||
|
for i, _ := range feed.Channel.Item {
|
||||||
|
feed.Channel.Item[i].Link = html.UnescapeString(feed.Channel.Item[i].Link)
|
||||||
|
feed.Channel.Item[i].Description = html.UnescapeString(feed.Channel.Item[i].Description)
|
||||||
|
feed.Channel.Item[i].PubDate = html.UnescapeString(feed.Channel.Item[i].PubDate)
|
||||||
|
feed.Channel.Item[i].Title = html.UnescapeString(feed.Channel.Item[i].Title)
|
||||||
|
}
|
||||||
|
return &feed, nil
|
||||||
|
}
|
||||||
1
main.go
1
main.go
@@ -35,6 +35,7 @@ func main() {
|
|||||||
commands.Register("register", handlers.RegisterHandler)
|
commands.Register("register", handlers.RegisterHandler)
|
||||||
commands.Register("reset", handlers.ResetUsersHandler)
|
commands.Register("reset", handlers.ResetUsersHandler)
|
||||||
commands.Register("users", handlers.GetUsersHandler)
|
commands.Register("users", handlers.GetUsersHandler)
|
||||||
|
commands.Register("agg", handlers.FetchFeedHandler)
|
||||||
|
|
||||||
if len(os.Args) < 2 {
|
if len(os.Args) < 2 {
|
||||||
log.Fatal("usage: boot-dev-blog-aggregator <command> [args...]")
|
log.Fatal("usage: boot-dev-blog-aggregator <command> [args...]")
|
||||||
|
|||||||
Reference in New Issue
Block a user