diff --git a/_views/guide.html b/_views/guide.html index c6bb5c5..df4fb69 100644 --- a/_views/guide.html +++ b/_views/guide.html @@ -4,6 +4,10 @@ {{define "body"}}
+

+ Feed RSS + +

Articoli diff --git a/_views/news.html b/_views/news.html index 6932331..c8a7d36 100644 --- a/_views/news.html +++ b/_views/news.html @@ -4,6 +4,10 @@ {{define "body"}}
+

+ Feed RSS + +

Notizie Importanti @@ -60,4 +64,4 @@ {{ end }}

-{{end}} \ No newline at end of file +{{end}} diff --git a/go.mod b/go.mod index 5a5092a..d9eaaba 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/dlclark/regexp2 v1.4.0 // indirect + github.com/gorilla/feeds v1.1.1 // indirect github.com/klauspost/compress v1.15.6 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.37.0 // indirect diff --git a/go.sum b/go.sum index 3e649fb..c9c310c 100644 --- a/go.sum +++ b/go.sum @@ -19,6 +19,8 @@ github.com/gofiber/fiber/v2 v2.34.0 h1:96BJMw6uaxQhJsHY54SFGOtGgp9pgombK5Hbi4JSE github.com/gofiber/fiber/v2 v2.34.0/go.mod h1:ozRQfS+D7EL1+hMH+gutku0kfx1wLX4hAxDCtDzpj4U= github.com/gofiber/redirect/v2 v2.1.23 h1:MqRyyeKyGqkF4GIFgTB4SuqIeeXviUglgRL2HCOFofM= github.com/gofiber/redirect/v2 v2.1.23/go.mod h1:IYF5pPLDLYrrHMcxajDyWV+nHMbyPd6agCXkCnfLxS0= +github.com/gorilla/feeds v1.1.1 h1:HwKXxqzcRNg9to+BbvJog4+f3s/xzvtZXICcQGutYfY= +github.com/gorilla/feeds v1.1.1/go.mod h1:Nk0jZrvPFZX1OBe5NPiddPw7CfwF6Q9eqzaBbaightA= github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= diff --git a/handler/handler.go b/handler/handler.go index a007a34..06952c8 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -9,6 +9,7 @@ import ( "git.phc.dm.unipi.it/phc/website/articles" "git.phc.dm.unipi.it/phc/website/auth" "git.phc.dm.unipi.it/phc/website/model" + "git.phc.dm.unipi.it/phc/website/rss" "git.phc.dm.unipi.it/phc/website/templates" "git.phc.dm.unipi.it/phc/website/util" ) @@ -27,6 +28,8 @@ type Service interface { HandleProfilePage(w io.Writer, ctx Context) error HandleNewsArticlePage(w io.Writer, articleID string, ctx Context) error HandleGuideArticlePage(w io.Writer, articleID string, ctx Context) error + HandleNewsFeedPage(w io.Writer) error + HandleGuideFeedPage(w io.Writer) error } // @@ -188,3 +191,25 @@ func (h *DefaultHandler) HandleGuideArticlePage(w io.Writer, articleID string, c "ContentHTML": template.HTML(html), }) } + +func (h *DefaultHandler) HandleNewsFeedPage(w io.Writer) error { + registry, err := h.NewsArticlesRegistry.GetArticles() + if err != nil { + return err + } + + newsFeed := rss.GenerateRssFeed(registry) + + return newsFeed.WriteRss(w) +} + +func (h *DefaultHandler) HandleGuideFeedPage(w io.Writer) error { + registry, err := h.GuideArticlesRegistry.GetArticles() + if err != nil { + return err + } + + guideFeed := rss.GenerateRssFeed(registry) + + return guideFeed.WriteRss(w) +} diff --git a/rss/feed.go b/rss/feed.go new file mode 100644 index 0000000..7fcd03d --- /dev/null +++ b/rss/feed.go @@ -0,0 +1,31 @@ +package rss + +import ( + "git.phc.dm.unipi.it/phc/website/articles" + "github.com/gorilla/feeds" +) + +func GenerateRssFeed(entries []*articles.Article) *feeds.Feed { + + // Initialize RSS Feed + feed := &feeds.Feed{} + + var feedItems []*feeds.Item + + // Add items to RSS feeds + for _, entry := range entries { + + feedItems = append(feedItems, + &feeds.Item{ + Id: entry.Id, + Title: entry.Title, + Link: &feeds.Link{Href: entry.ArticlePath}, + Description: entry.Description, + Created: entry.PublishDate, + }) + } + + feed.Items = feedItems + + return feed +} diff --git a/server/fiber.go b/server/fiber.go index f111ba7..097c55f 100644 --- a/server/fiber.go +++ b/server/fiber.go @@ -105,6 +105,16 @@ func routes(h handler.Service, r fiber.Router) { return h.HandleGuidePage(c, CreateContext(c)) }) + r.Get("/news/feed", func(c *fiber.Ctx) error { + c.Type("xml") + return h.HandleNewsFeedPage(c) + }) + + r.Get("/guide/feed", func(c *fiber.Ctx) error { + c.Type("xml") + return h.HandleGuideFeedPage(c) + }) + r.Post("/login", func(c *fiber.Ctx) error { var loginForm struct { Provider string `form:"provider"`