164 lines
3.5 KiB
Go
164 lines
3.5 KiB
Go
package routes
|
|
|
|
import (
|
|
"fmt"
|
|
"path"
|
|
"sort"
|
|
"time"
|
|
|
|
"git.matterlinux.xyz/Matter/website/lib"
|
|
"git.matterlinux.xyz/Matter/website/log"
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gorilla/feeds"
|
|
)
|
|
|
|
func GetContent() ([]lib.Content, error) {
|
|
var (
|
|
contents []lib.Content
|
|
err error
|
|
)
|
|
|
|
if contents, err = lib.ListContent("news"); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
sort.Slice(contents, func(i, j int) bool {
|
|
time1, err := lib.TimeFromString(contents[i].Date)
|
|
if err != nil {
|
|
log.Error("Bad date while sorting: %s", err.Error())
|
|
return false
|
|
}
|
|
|
|
time2, err := lib.TimeFromString(contents[j].Date)
|
|
if err != nil {
|
|
log.Error("Bad date while sorting: %s", err.Error())
|
|
return false
|
|
}
|
|
|
|
return time1.After(time2)
|
|
})
|
|
|
|
return contents, nil
|
|
}
|
|
|
|
func GET_News(c *fiber.Ctx) error {
|
|
contents, err := GetContent()
|
|
|
|
if err != nil {
|
|
log.Error("GetContent failed: %s", err.Error())
|
|
return lib.RenderError(c, 500)
|
|
}
|
|
|
|
return c.Render("news", fiber.Map{
|
|
"news": contents,
|
|
})
|
|
}
|
|
|
|
func GET_New(c *fiber.Ctx) error {
|
|
postid := c.Params("id")
|
|
if len(postid) == 0 {
|
|
return lib.RenderError(c, 404)
|
|
}
|
|
|
|
contents, err := lib.ListContent("news")
|
|
if err != nil {
|
|
log.Error("ListContent failed: %s", err.Error())
|
|
return lib.RenderError(c, 500)
|
|
}
|
|
|
|
for _, con := range contents {
|
|
if con.ID != postid {
|
|
continue
|
|
}
|
|
|
|
con, err = lib.GetContent(con.Dir, con.Name)
|
|
if err != nil {
|
|
log.Error("ListContent failed: %s", err.Error())
|
|
return lib.RenderError(c, 500)
|
|
}
|
|
|
|
return c.Render("post", fiber.Map{
|
|
"title": con.Title,
|
|
"post": con,
|
|
})
|
|
}
|
|
|
|
return lib.RenderError(c, 404)
|
|
}
|
|
|
|
func GET_NewsFeed(c *fiber.Ctx) error {
|
|
var (
|
|
feed_type string
|
|
feed *feeds.Feed
|
|
contents []lib.Content
|
|
res string
|
|
err error
|
|
)
|
|
|
|
feed_type = path.Base(c.Path())
|
|
|
|
if contents, err = GetContent(); err != nil {
|
|
log.Error("GetContent failed: %s", err.Error())
|
|
return lib.RenderError(c, 500)
|
|
}
|
|
|
|
feed = &feeds.Feed{
|
|
Title: "MatterLinux | News",
|
|
Link: &feeds.Link{Href: "https://matterlinux.xyz/news"}, // lets hardcode this for now
|
|
Description: "News regarding the MatterLinux project",
|
|
Created: time.Now(),
|
|
}
|
|
|
|
feed.Items = []*feeds.Item{}
|
|
|
|
for _, con := range contents {
|
|
parsed, err := time.Parse("02/01/06", con.Date)
|
|
|
|
if err != nil {
|
|
log.Error("Failed to parse post time (%s): %s", con.ID, err.Error())
|
|
return lib.RenderError(c, 500)
|
|
}
|
|
|
|
feed.Items = append(feed.Items, &feeds.Item{
|
|
Id: con.ID,
|
|
Title: con.Title,
|
|
Link: &feeds.Link{Href: fmt.Sprintf("https://matterlinux.xyz/news/%s", con.ID)},
|
|
Author: &feeds.Author{Name: con.Author},
|
|
Created: parsed,
|
|
Content: con.Md,
|
|
})
|
|
}
|
|
|
|
switch feed_type {
|
|
case "feed.atom":
|
|
if res, err = feed.ToAtom(); err != nil {
|
|
log.Error("Failed to convert feed to atom: %s", err.Error())
|
|
return lib.RenderError(c, 500)
|
|
}
|
|
|
|
c.Set("Content-Type", "application/atom+xml")
|
|
return c.Send([]byte(res))
|
|
|
|
case "feed.rss":
|
|
if res, err = feed.ToRss(); err != nil {
|
|
log.Error("Failed to convert feed to RSS: %s", err.Error())
|
|
return lib.RenderError(c, 500)
|
|
}
|
|
|
|
c.Set("Content-Type", "application/rss+xml")
|
|
return c.Send([]byte(res))
|
|
|
|
case "feed.json":
|
|
if res, err = feed.ToJSON(); err != nil {
|
|
log.Error("Failed to convert feed to JSON: %s", err.Error())
|
|
return lib.RenderError(c, 500)
|
|
}
|
|
|
|
c.Set("Content-Type", "application/feed+json")
|
|
return c.Send([]byte(res))
|
|
}
|
|
|
|
log.Error("Cannot handle the feed type: %s", feed_type)
|
|
return lib.RenderError(c, 404)
|
|
}
|