feedizer/cmd/feedizer/server/server.go

88 lines
2.4 KiB
Go

package server
import (
"log"
"git.zom.bi/fanir/feedizer/cmd/feedizer/config"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/gofiber/template/html"
)
func Start(cfg *config.Config) {
htmlEngine := html.New(cfg.Server.TemplateDir, ".html")
app := fiber.New(fiber.Config{
Views: htmlEngine,
})
app.Use(logger.New())
registerRoutes(app, cfg)
log.Fatalln(app.Listen(cfg.Server.Address))
}
func registerRoutes(app *fiber.App, cfg *config.Config) {
app.Get(`/`, func(ctx *fiber.Ctx) error { return ctx.Render("home", nil) })
app.Get(`/about`, func(ctx *fiber.Ctx) error { return ctx.Render("about", nil) })
app.Get(`/bot`, func(ctx *fiber.Ctx) error { return ctx.Render("bot", nil) })
app.Get(`/tos`, func(ctx *fiber.Ctx) error { return ctx.Render("tos", nil) })
app.Get(`/imprint`, func(ctx *fiber.Ctx) error { return ctx.Render("imprint", nil) })
app.Static("/static", cfg.Server.StaticDir, fiber.Static{
Compress: true,
})
app.Get(`/announcement/(?'id'[0-9]+)(/.*)?`, func(c *fiber.Ctx) error { return fiber.ErrNotImplemented })
app.Post(`/feed`, func(c *fiber.Ctx) error { return fiber.ErrNotImplemented })
app.Get(`/feed/{slug}`, func(c *fiber.Ctx) error { return fiber.ErrNotImplemented })
app.Get(`/feed/{slug}/page/(?'feedType'atom|rss)`, func(c *fiber.Ctx) error { return fiber.ErrNotImplemented })
app.Get(`/feed/{slug}/diff/(?'feedType'atom|rss)`, func(c *fiber.Ctx) error { return fiber.ErrNotImplemented })
}
func SendAPIResponse(ctx fiber.Ctx, template string, data interface{}) error {
switch ctx.Accepts("text/html", "application/json") {
case "text/html":
return ctx.Render(template, data)
case "application/json":
return ctx.JSON(data)
}
return fiber.ErrNotAcceptable
}
const (
AtomFeed = "atom"
RSSFeed = "rss"
JSONFeed = "json"
)
func RequestedFeedType(ctx fiber.Ctx) string {
format := ctx.Query("format",
ctx.Accepts(
"application/atom+xml", // Atom
"application/rss+xml", "text/xml", // RSS
"application/feed+json", // JSON Feed
),
)
switch format {
case "atom", "application/atom+xml":
return AtomFeed
case "rss", "application/rss+xml", "text/xml":
return RSSFeed
case "json", "application/feed+json":
return JSONFeed
}
return ""
}
func SendFeedResponse(ctx fiber.Ctx, format string, data interface{}) error {
switch format {
case AtomFeed:
case RSSFeed:
case JSONFeed:
}
return fiber.ErrNotAcceptable
}