From a610515d5e0fc14dcf34e0f804c8b85408ff8bcd Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Tue, 25 Jul 2023 19:05:55 +0200 Subject: [PATCH] sitemap --- web/app.go | 11 +++++++- web/sitemap_handler.go | 63 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 web/sitemap_handler.go diff --git a/web/app.go b/web/app.go index a8145eb..3e3f093 100644 --- a/web/app.go +++ b/web/app.go @@ -2,9 +2,13 @@ package web import ( "embed" + "fmt" "net/http" + "net/url" "owl-blogs/app" "owl-blogs/app/repository" + "owl-blogs/config" + "owl-blogs/domain/model" "owl-blogs/web/middleware" "github.com/gofiber/fiber/v2" @@ -100,9 +104,14 @@ func NewWebApp( app.Get("/posts/:post/", entryHandler.Handle) // robots.txt app.Get("/robots.txt", func(c *fiber.Ctx) error { + siteConfig := model.SiteConfig{} + configRepo.Get(config.SITE_CONFIG, &siteConfig) + sitemapUrl, _ := url.JoinPath(siteConfig.FullUrl, "/sitemap.xml") c.Set("Content-Type", "text/plain") - return c.SendString("User-agent: *\nAllow: /\n") + return c.SendString(fmt.Sprintf("User-agent: *\nAllow: /\n\nSitemap: %s\n", sitemapUrl)) }) + // sitemap.xml + app.Get("/sitemap.xml", NewSiteMapHandler(entryService, configRepo).Handle) // ActivityPub // activityPubServer := NewActivityPubServer(configRepo) diff --git a/web/sitemap_handler.go b/web/sitemap_handler.go new file mode 100644 index 0000000..869dae0 --- /dev/null +++ b/web/sitemap_handler.go @@ -0,0 +1,63 @@ +package web + +import ( + "bytes" + "encoding/xml" + "net/url" + "owl-blogs/app" + "owl-blogs/app/repository" + + "github.com/gofiber/fiber/v2" +) + +type SiteMapHandler struct { + entryService *app.EntryService + configRepo repository.ConfigRepository +} + +type Sitemap struct { + XMLName xml.Name `xml:"urlset"` + Xmlns string `xml:"xmlns,attr"` + Url []SitemapUrl `xml:"url"` +} + +type SitemapUrl struct { + Loc string `xml:"loc"` +} + +func NewSiteMapHandler(entryService *app.EntryService, configRepo repository.ConfigRepository) *SiteMapHandler { + return &SiteMapHandler{entryService: entryService, configRepo: configRepo} +} + +// Handle handles GET /sitemap.xml +func (h *SiteMapHandler) Handle(c *fiber.Ctx) error { + c.Set(fiber.HeaderContentType, fiber.MIMEApplicationXML) + + siteConfig := getSiteConfig(h.configRepo) + entries, err := h.entryService.FindAllByType(nil, true, false) + if err != nil { + return err + } + + sitemap := Sitemap{ + Xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9", + Url: make([]SitemapUrl, 0), + } + + for _, entry := range entries { + entryUrl, _ := url.JoinPath(siteConfig.FullUrl, "/posts/", url.PathEscape(entry.ID()), "/") + sitemap.Url = append(sitemap.Url, SitemapUrl{ + Loc: entryUrl, + }) + } + + buf := new(bytes.Buffer) + encoder := xml.NewEncoder(buf) + encoder.Indent("", " ") + err = encoder.Encode(sitemap) + if err != nil { + return err + } + + return c.SendString(xml.Header + buf.String()) +}