From 2a95341a99c6a08428819d518a22890c5b44880a Mon Sep 17 00:00:00 2001 From: ngn Date: Thu, 11 Apr 2024 14:41:27 +0300 Subject: [PATCH] add atom feed support --- api/Dockerfile | 3 ++ api/Makefile | 2 +- api/go.mod | 1 + api/go.sum | 2 ++ api/main.go | 7 +++-- api/routes/blog.go | 74 ++++++++++++++++++++++++++++++++++++++++++++ api/routes/routes.go | 1 + 7 files changed, 87 insertions(+), 3 deletions(-) diff --git a/api/Dockerfile b/api/Dockerfile index 789b772..441699e 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -15,4 +15,7 @@ RUN make ARG PASSWORD ENV PASSWORD $PASSWORD +ARG URL +ENV URL $URL + ENTRYPOINT ["/app/server"] diff --git a/api/Makefile b/api/Makefile index f3cf4aa..dc1f860 100644 --- a/api/Makefile +++ b/api/Makefile @@ -2,6 +2,6 @@ server: *.go routes/* util/* go build -o server . test: - PASSWORD=test ./server + URL=http://localhost:5173/ PASSWORD=test ./server .PHONY: test diff --git a/api/go.mod b/api/go.mod index 8212bdb..e1ad0ac 100644 --- a/api/go.mod +++ b/api/go.mod @@ -10,6 +10,7 @@ require ( require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/google/uuid v1.5.0 // indirect + github.com/gorilla/feeds v1.1.2 // indirect github.com/klauspost/compress v1.17.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect diff --git a/api/go.sum b/api/go.sum index c57b42b..cfe437c 100644 --- a/api/go.sum +++ b/api/go.sum @@ -4,6 +4,8 @@ github.com/gofiber/fiber/v2 v2.52.2 h1:b0rYH6b06Df+4NyrbdptQL8ifuxw/Tf2DgfkZkDax github.com/gofiber/fiber/v2 v2.52.2/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/feeds v1.1.2 h1:pxzZ5PD3RJdhFH2FsJJ4x6PqMqbgFk1+Vez4XWBW8Iw= +github.com/gorilla/feeds v1.1.2/go.mod h1:WMib8uJP3BbY+X8Szd1rA5Pzhdfh+HCCAYT2z7Fza6Y= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= diff --git a/api/main.go b/api/main.go index c7f8f71..59cc9b4 100644 --- a/api/main.go +++ b/api/main.go @@ -10,13 +10,16 @@ import ( func CorsMiddleware(c *fiber.Ctx) error { c.Set("Access-Control-Allow-Origin", "*") - c.Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") + c.Set("Access-Control-Allow-Headers", + "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") c.Set("Access-Control-Allow-Methods", "PUT, DELETE, GET") return c.Next() } func main() { - app := fiber.New() + app := fiber.New(fiber.Config{ + DisableStartupMessage: true, + }) app.Use(CorsMiddleware) db, err := sql.Open("sqlite3", "data.db") diff --git a/api/routes/blog.go b/api/routes/blog.go index b0bbaff..9d4364d 100644 --- a/api/routes/blog.go +++ b/api/routes/blog.go @@ -4,9 +4,13 @@ import ( "database/sql" "log" "net/http" + "net/url" + "os" "strings" + "time" "github.com/gofiber/fiber/v2" + "github.com/gorilla/feeds" "github.com/ngn13/website/api/util" ) @@ -129,6 +133,76 @@ 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{} rows, err := DB.Query("SELECT * FROM posts") diff --git a/api/routes/routes.go b/api/routes/routes.go index b14e961..7227657 100644 --- a/api/routes/routes.go +++ b/api/routes/routes.go @@ -19,6 +19,7 @@ func Setup(app *fiber.App, db *sql.DB){ }) // blog routes + app.Get("/blog/feed", GetFeed) app.Get("/blog/sum", SumPost) app.Get("/blog/get", GetPost) app.Get("/blog/vote/set", VoteSet)