From 736bc7c4aab18f4406609bf89eff6d19ad903c4c Mon Sep 17 00:00:00 2001 From: ngn Date: Thu, 11 Apr 2024 16:07:01 +0300 Subject: [PATCH] add atom, rss and json feed support --- api/routes/blog.go | 174 +++-- api/routes/routes.go | 4 +- app/package-lock.json | 4 +- app/package.json | 2 +- app/src/routes/+page.svelte | 2 +- app/src/routes/blog/+page.svelte | 69 +- app/src/routes/blog/[id]/+page.svelte | 6 +- app/static/markdown.css | 1023 +++++++++++++++++++++++++ 8 files changed, 1201 insertions(+), 83 deletions(-) create mode 100644 app/static/markdown.css diff --git a/api/routes/blog.go b/api/routes/blog.go index 9d4364d..7c6f52f 100644 --- a/api/routes/blog.go +++ b/api/routes/blog.go @@ -5,6 +5,7 @@ import ( "log" "net/http" "net/url" + "fmt" "os" "strings" "time" @@ -133,75 +134,7 @@ func GetPost(c *fiber.Ctx) error{ }) } -func GetFeed(c *fiber.Ctx) error{ - var posts []Post = []Post{} - rows, err := DB.Query("SELECT * FROM posts") - if util.ErrorCheck(err, c) { - return util.ErrServer(c) - } - for rows.Next() { - var post Post - err := PostFromRow(&post, rows) - - if util.ErrorCheck(err, c) { - return util.ErrServer(c) - } - - if post.Public == 0 { - continue - } - - posts = append(posts, post) - } - rows.Close() - - - blogurl, err := url.JoinPath(os.Getenv("URL"), "/blog") - if err != nil { - log.Printf("Failed to create the blog URL: %s\n", err.Error()) - return c.JSON(fiber.Map{"error": "Server error"}) - } - - feed := &feeds.Feed{ - Title: "[ngn] | blog", - Link: &feeds.Link{Href: blogurl}, - Description: "ngn's personal blog", - Author: &feeds.Author{Name: "ngn", Email: "ngn@ngn.tf"}, - Created: time.Now(), - } - - feed.Items = []*feeds.Item{} - for _, p := range posts { - purl, err := url.JoinPath(blogurl, p.ID) - if err != nil { - log.Printf("Failed to create URL for '%s': %s\n", p.ID, err.Error()) - continue - } - - parsed, err := time.Parse("02/01/06", p.Date) - if err != nil { - log.Printf("Failed to parse time for '%s': %s\n", p.ID, err.Error()) - continue - } - - feed.Items = append(feed.Items, &feeds.Item{ - Title: p.Title, - Link: &feeds.Link{Href: purl}, - Author: &feeds.Author{Name: p.Author}, - Created: parsed, - }) - } - - atom, err := feed.ToAtom() - if err != nil { - log.Printf("Failed to create atom feed: %s", err.Error()) - return c.JSON(fiber.Map{"error": "Server error"}) - } - - c.Set("Content-Type", "application/atom+xml") - return c.Send([]byte(atom)) -} func SumPost(c *fiber.Ctx) error{ var posts []Post = []Post{} @@ -235,3 +168,108 @@ func SumPost(c *fiber.Ctx) error{ "result": posts, }) } + +func GetFeed() (*feeds.Feed, error){ + var posts []Post = []Post{} + rows, err := DB.Query("SELECT * FROM posts") + if err != nil { + return nil, err + } + + for rows.Next() { + var post Post + err := PostFromRow(&post, rows) + + if err != nil { + return nil, err + } + + if post.Public == 0 { + continue + } + + posts = append(posts, post) + } + rows.Close() + + + blogurl, err := url.JoinPath(os.Getenv("URL"), "/blog") + if err != nil { + return nil, fmt.Errorf("failed to create the blog URL: %s", err.Error()) + } + + feed := &feeds.Feed{ + Title: "[ngn.tf] | blog", + Link: &feeds.Link{Href: blogurl}, + Description: "ngn's personal blog", + Author: &feeds.Author{Name: "ngn", Email: "ngn@ngn.tf"}, + Created: time.Now(), + } + + feed.Items = []*feeds.Item{} + for _, p := range posts { + purl, err := url.JoinPath(blogurl, p.ID) + if err != nil { + return nil, fmt.Errorf("failed to create URL for '%s': %s\n", p.ID, err.Error()) + } + + parsed, err := time.Parse("02/01/06", p.Date) + if err != nil { + return nil, fmt.Errorf("failed to parse time for '%s': %s\n", p.ID, err.Error()) + } + + feed.Items = append(feed.Items, &feeds.Item{ + Id: p.ID, + Title: p.Title, + Link: &feeds.Link{Href: purl}, + Author: &feeds.Author{Name: p.Author}, + Created: parsed, + }) + } + + return feed, nil +} + +func GetAtomFeed(c *fiber.Ctx) error { + feed, err := GetFeed() + if util.ErrorCheck(err, c){ + return util.ErrServer(c) + } + + atom, err := feed.ToAtom() + if util.ErrorCheck(err, c){ + return util.ErrServer(c) + } + + c.Set("Content-Type", "application/atom+xml") + return c.Send([]byte(atom)) +} + +func GetRSSFeed(c *fiber.Ctx) error { + feed, err := GetFeed() + if util.ErrorCheck(err, c){ + return util.ErrServer(c) + } + + rss, err := feed.ToRss() + if util.ErrorCheck(err, c){ + return util.ErrServer(c) + } + + c.Set("Content-Type", "application/rss+xml") + return c.Send([]byte(rss)) +} + +func GetJSONFeed(c *fiber.Ctx) error { + feed, err := GetFeed() + if util.ErrorCheck(err, c){ + return util.ErrServer(c) + } + + json, err := feed.ToJSON() + if util.ErrorCheck(err, c){ + return util.ErrServer(c) + } + c.Set("Content-Type", "application/feed+json") + return c.Send([]byte(json)) +} diff --git a/api/routes/routes.go b/api/routes/routes.go index 7227657..9a2ee9b 100644 --- a/api/routes/routes.go +++ b/api/routes/routes.go @@ -19,7 +19,9 @@ func Setup(app *fiber.App, db *sql.DB){ }) // blog routes - app.Get("/blog/feed", GetFeed) + app.Get("/blog/feed.atom", GetAtomFeed) + app.Get("/blog/feed.rss", GetRSSFeed) + app.Get("/blog/feed.json", GetJSONFeed) app.Get("/blog/sum", SumPost) app.Get("/blog/get", GetPost) app.Get("/blog/vote/set", VoteSet) diff --git a/app/package-lock.json b/app/package-lock.json index aebf255..0d5ce24 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "website", - "version": "4.5.0", + "version": "4.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "website", - "version": "4.5.0", + "version": "4.6.0", "dependencies": { "@types/dompurify": "^3.0.2", "dompurify": "^3.1.0", diff --git a/app/package.json b/app/package.json index 783fb24..e23e050 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "website", - "version": "4.6.0", + "version": "4.8.0", "private": true, "scripts": { "dev": "vite dev", diff --git a/app/src/routes/+page.svelte b/app/src/routes/+page.svelte index 0db6602..910b02b 100644 --- a/app/src/routes/+page.svelte +++ b/app/src/routes/+page.svelte @@ -78,7 +78,7 @@
-

v4.6

+

v4.8