website/api/routes/blog.go

204 lines
3.7 KiB
Go
Raw Normal View History

2023-11-12 17:43:23 +03:00
package routes
import (
"database/sql"
"fmt"
2024-04-11 14:41:27 +03:00
"net/url"
2024-10-06 17:30:25 +03:00
"path"
"strings"
2024-04-11 14:41:27 +03:00
"time"
2023-11-12 17:43:23 +03:00
"github.com/gofiber/fiber/v2"
2024-04-11 14:41:27 +03:00
"github.com/gorilla/feeds"
2024-10-06 17:30:25 +03:00
"github.com/ngn13/website/api/config"
"github.com/ngn13/website/api/database"
2023-11-12 17:43:23 +03:00
"github.com/ngn13/website/api/util"
)
2024-10-06 17:30:25 +03:00
func GET_Post(c *fiber.Ctx) error {
var (
2024-10-06 17:30:25 +03:00
post database.Post
id string
2024-10-06 17:30:25 +03:00
db *sql.DB
found bool
err error
)
2024-10-06 17:30:25 +03:00
db = *(c.Locals("database").(**sql.DB))
2024-10-06 17:30:25 +03:00
if id = c.Query("id"); id == "" {
return util.ErrBadData(c)
}
2024-10-06 17:30:25 +03:00
if found, err = post.Get(db, id); err != nil {
util.Fail("error while search for a post (\"%s\"): %s", id, err.Error())
return util.ErrServer(c)
}
2024-10-06 17:30:25 +03:00
if !found {
return util.ErrEntryNotExists(c)
}
return c.JSON(fiber.Map{
"error": "",
"result": post,
})
2023-11-12 17:43:23 +03:00
}
2024-10-06 17:30:25 +03:00
func GET_PostSum(c *fiber.Ctx) error {
var (
2024-10-06 17:30:25 +03:00
posts []database.Post
rows *sql.Rows
db *sql.DB
err error
)
2024-10-06 17:30:25 +03:00
db = *(c.Locals("database").(**sql.DB))
2024-04-11 16:07:01 +03:00
2024-10-06 17:30:25 +03:00
if rows, err = db.Query("SELECT * FROM posts"); err != nil {
util.Fail("cannot load posts: %s", err.Error())
return util.ErrServer(c)
}
2024-10-06 17:30:25 +03:00
defer rows.Close()
2024-04-11 16:07:01 +03:00
for rows.Next() {
2024-10-06 17:30:25 +03:00
var post database.Post
2024-04-11 14:41:27 +03:00
2024-10-06 17:30:25 +03:00
if err = post.Load(rows); err != nil {
util.Fail("error while loading post: %s", err.Error())
return util.ErrServer(c)
}
2024-04-11 14:41:27 +03:00
if post.Public == 0 {
continue
}
2024-04-11 14:41:27 +03:00
if len(post.Content) > 255 {
post.Content = post.Content[0:250]
}
2024-04-11 16:07:01 +03:00
posts = append(posts, post)
}
2024-04-11 16:07:01 +03:00
return c.JSON(fiber.Map{
"error": "",
"result": posts,
})
2024-04-11 16:07:01 +03:00
}
2024-10-06 17:30:25 +03:00
func getFeed(db *sql.DB) (*feeds.Feed, error) {
var (
2024-10-06 17:30:25 +03:00
posts []database.Post
err error
)
2024-10-06 17:30:25 +03:00
rows, err := db.Query("SELECT * FROM posts")
if err != nil {
return nil, err
}
for rows.Next() {
2024-10-06 17:30:25 +03:00
var post database.Post
2024-10-06 17:30:25 +03:00
if err = post.Load(rows); err != nil {
return nil, err
}
if post.Public == 0 {
continue
}
posts = append(posts, post)
}
rows.Close()
2024-10-06 17:30:25 +03:00
blogurl, err := url.JoinPath(
config.Get("frontend_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
2024-04-11 16:07:01 +03:00
}
2024-10-06 17:30:25 +03:00
func GET_Feed(c *fiber.Ctx) error {
var (
db *sql.DB
err error
feed *feeds.Feed
name []string
res string
ext string
)
2024-10-06 17:30:25 +03:00
db = *(c.Locals("database").(**sql.DB))
2024-04-11 14:41:27 +03:00
2024-10-06 17:30:25 +03:00
if name = strings.Split(path.Base(c.Path()), "."); len(name) != 2 {
return util.ErrNotFound(c)
}
2024-10-06 17:30:25 +03:00
ext = name[1]
2024-10-06 17:30:25 +03:00
if feed, err = getFeed(db); err != nil {
util.Fail("cannot obtain the feed: %s", err.Error())
return util.ErrServer(c)
}
2024-10-06 17:30:25 +03:00
switch ext {
case "atom":
res, err = feed.ToAtom()
c.Set("Content-Type", "application/atom+xml")
break
2023-11-12 17:43:23 +03:00
2024-10-06 17:30:25 +03:00
case "json":
res, err = feed.ToJSON()
c.Set("Content-Type", "application/feed+json")
break
case "rss":
res, err = feed.ToRss()
c.Set("Content-Type", "application/rss+xml")
break
default:
return util.ErrNotFound(c)
}
2024-10-06 17:30:25 +03:00
if err != nil {
util.Fail("cannot obtain the feed as the specified format: %s", err.Error())
return util.ErrServer(c)
}
2024-10-06 17:30:25 +03:00
return c.Send([]byte(res))
2023-11-12 17:43:23 +03:00
}