diff --git a/pkg/internal/server/api/admin_api.go b/pkg/internal/server/api/admin_api.go index 77d980d..cc6189b 100644 --- a/pkg/internal/server/api/admin_api.go +++ b/pkg/internal/server/api/admin_api.go @@ -3,7 +3,7 @@ package api import ( "git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/reader/pkg/internal/services" - "github.com/gofiber/fiber" + "github.com/gofiber/fiber/v2" ) func adminTriggerScanTask(c *fiber.Ctx) error { diff --git a/pkg/internal/server/api/index.go b/pkg/internal/server/api/index.go index d3b41fc..76abad1 100644 --- a/pkg/internal/server/api/index.go +++ b/pkg/internal/server/api/index.go @@ -8,12 +8,19 @@ import ( func MapAPIs(app *fiber.App, baseURL string) { api := app.Group(baseURL).Name("API") { + api.Get("/well-known/sources", getNewsSources) + admin := api.Group("/admin").Name("Admin") { admin.Post("/scan", sec.ValidatorMiddleware, adminTriggerScanTask) } - api.Get("/well-known/sources", getNewsSources) api.Get("/link/*", getLinkMeta) + + news := api.Group("/news").Name("News") + { + news.Get("/", listNewsArticles) + news.Get("/:hash", getNewsArticle) + } } } diff --git a/pkg/internal/server/api/news_api.go b/pkg/internal/server/api/news_api.go new file mode 100644 index 0000000..854162e --- /dev/null +++ b/pkg/internal/server/api/news_api.go @@ -0,0 +1,38 @@ +package api + +import ( + "git.solsynth.dev/hypernet/reader/pkg/internal/database" + "git.solsynth.dev/hypernet/reader/pkg/internal/models" + "github.com/gofiber/fiber/v2" +) + +func listNewsArticles(c *fiber.Ctx) error { + take := c.QueryInt("take", 0) + offset := c.QueryInt("offset", 0) + + var count int64 + if err := database.C.Model(&models.NewsArticle{}).Count(&count).Error; err != nil { + return fiber.NewError(fiber.StatusInternalServerError, err.Error()) + } + + var articles []models.NewsArticle + if err := database.C.Limit(take).Offset(offset).Omit("Content").Find(&articles).Error; err != nil { + return fiber.NewError(fiber.StatusInternalServerError, err.Error()) + } + + return c.JSON(fiber.Map{ + "count": count, + "data": articles, + }) +} + +func getNewsArticle(c *fiber.Ctx) error { + hash := c.Params("hash") + + var article models.NewsArticle + if err := database.C.Where("hash = ?", hash).First(&article).Error; err != nil { + return fiber.NewError(fiber.StatusNotFound, err.Error()) + } + + return c.JSON(article) +}