summaryrefslogtreecommitdiffci
path: root/internal/router/handlers
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
authorGravatar SayaAndy <saya.andy@posteo.com> 2026-03-30 23:25:59 +0700
committerGravatar SayaAndy <saya.andy@posteo.com> 2026-03-30 23:25:59 +0700
commit7a40c01dd14f04787f5052d0c89e0d6fb9ce597f (patch)
tree4edc2d756295cbbf1f935a5f681b6be69b5584b4 /internal/router/handlers
parent52fbb4a4eb781dd4ba66fae0e1ceaec6721758f5 (diff)
downloadweb-7a40c01dd14f04787f5052d0c89e0d6fb9ce597f.tar.gz
web-7a40c01dd14f04787f5052d0c89e0d6fb9ce597f.zip
feat: build sitemap.xml
Diffstat (limited to 'internal/router/handlers')
-rw-r--r--internal/router/handlers/lang-blog-title.go19
-rw-r--r--internal/router/handlers/lang-blog.go8
-rw-r--r--internal/router/handlers/lang-map.go8
-rw-r--r--internal/router/handlers/lang.go8
-rw-r--r--internal/router/handlers/root.go4
-rw-r--r--internal/router/handlers/sitemap.xml.go79
6 files changed, 126 insertions, 0 deletions
diff --git a/internal/router/handlers/lang-blog-title.go b/internal/router/handlers/lang-blog-title.go
index 97de089..9eac084 100644
--- a/internal/router/handlers/lang-blog-title.go
+++ b/internal/router/handlers/lang-blog-title.go
@@ -46,6 +46,25 @@ func (r *BlogPageHandler) ToValidateLang() router.LangSetting {
return router.InPath
}
+func (r *BlogPageHandler) SitemapInfo(supplements *router.Supplements) []router.SitemapInfo {
+ sitemapInfo := []router.SitemapInfo{}
+
+ pages, err := supplements.B2Client.Scan("")
+ if err != nil {
+ return sitemapInfo
+ }
+
+ for _, page := range pages {
+ sitemapInfo = append(sitemapInfo, router.SitemapInfo{
+ Loc: "/" + page.Lang + "/blog/" + page.FileName,
+ LastModified: page.ModifiedTime,
+ Priority: 1.0,
+ })
+ }
+
+ return sitemapInfo
+}
+
func (r *BlogPageHandler) AddMeta(c *fiber.Ctx, supplements *router.Supplements, lang string, templateMap fiber.Map) (meta map[string]string, err error) {
metadata, _, err := supplements.B2Client.ReadFrontmatter(lang + "/" + c.Params("title") + ".md")
if err != nil {
diff --git a/internal/router/handlers/lang-blog.go b/internal/router/handlers/lang-blog.go
index e4c20c6..ffac77e 100644
--- a/internal/router/handlers/lang-blog.go
+++ b/internal/router/handlers/lang-blog.go
@@ -47,6 +47,14 @@ func (r *CatalogueHandler) ToValidateLang() router.LangSetting {
return router.InPath
}
+func (r *CatalogueHandler) SitemapInfo(supplements *router.Supplements) []router.SitemapInfo {
+ sitemapInfo := []router.SitemapInfo{}
+ for _, lang := range supplements.AvailableLanguages {
+ sitemapInfo = append(sitemapInfo, router.SitemapInfo{Loc: "/" + lang.Name + "/blog", Priority: 0.3})
+ }
+ return sitemapInfo
+}
+
func (r *CatalogueHandler) RenderBody(c *fiber.Ctx, supplements *router.Supplements, lang string, templateMap fiber.Map) (statusCode int, err error) {
querySort := c.Query("sort")
if querySort == "" {
diff --git a/internal/router/handlers/lang-map.go b/internal/router/handlers/lang-map.go
index 7df6104..551b485 100644
--- a/internal/router/handlers/lang-map.go
+++ b/internal/router/handlers/lang-map.go
@@ -40,6 +40,14 @@ func (r *MapHandler) ToValidateLang() router.LangSetting {
return router.InPath
}
+func (r *MapHandler) SitemapInfo(supplements *router.Supplements) []router.SitemapInfo {
+ sitemapInfo := []router.SitemapInfo{}
+ for _, lang := range supplements.AvailableLanguages {
+ sitemapInfo = append(sitemapInfo, router.SitemapInfo{Loc: "/" + lang.Name + "/map", Priority: 0.3})
+ }
+ return sitemapInfo
+}
+
func (r *MapHandler) Render(c *fiber.Ctx, supplements *router.Supplements, lang string, templateMap fiber.Map) (statusCode int, err error) {
pages, err := supplements.B2Client.Scan(lang + "/")
slices.SortFunc(pages, func(a *b2.BlogPage, b *b2.BlogPage) int {
diff --git a/internal/router/handlers/lang.go b/internal/router/handlers/lang.go
index 74166ae..5430773 100644
--- a/internal/router/handlers/lang.go
+++ b/internal/router/handlers/lang.go
@@ -41,6 +41,14 @@ func (r *HomeHandler) ToValidateLang() router.LangSetting {
return router.InPath
}
+func (r *HomeHandler) SitemapInfo(supplements *router.Supplements) []router.SitemapInfo {
+ sitemapInfo := []router.SitemapInfo{}
+ for _, lang := range supplements.AvailableLanguages {
+ sitemapInfo = append(sitemapInfo, router.SitemapInfo{Loc: "/" + lang.Name, Priority: 0.7})
+ }
+ return sitemapInfo
+}
+
func (r *HomeHandler) AddMeta(c *fiber.Ctx, supplements *router.Supplements, lang string, templateMap fiber.Map) (meta map[string]string, err error) {
return map[string]string{
"og:title": supplements.Localization[lang].HomePage.Header,
diff --git a/internal/router/handlers/root.go b/internal/router/handlers/root.go
index 9f15782..89b9c63 100644
--- a/internal/router/handlers/root.go
+++ b/internal/router/handlers/root.go
@@ -35,6 +35,10 @@ func (r *RootHandler) CacheDuration() time.Duration {
return 24 * time.Hour
}
+func (r *RootHandler) SitemapInfo(_ *router.Supplements) []router.SitemapInfo {
+ return []router.SitemapInfo{{Loc: "", Priority: 0.7}}
+}
+
func (r *RootHandler) AddMeta(c *fiber.Ctx, supplements *router.Supplements, lang string, templateMap fiber.Map) (meta map[string]string, err error) {
return map[string]string{
"og:title": "Saya Blog",
diff --git a/internal/router/handlers/sitemap.xml.go b/internal/router/handlers/sitemap.xml.go
new file mode 100644
index 0000000..bb1df93
--- /dev/null
+++ b/internal/router/handlers/sitemap.xml.go
@@ -0,0 +1,79 @@
+package handlers
+
+import (
+ "log/slog"
+ "time"
+
+ "github.com/SayaAndy/saya-today-web/internal/router"
+ "github.com/gofiber/fiber/v2"
+)
+
+type SitemapXmlHandler struct {
+ router.BasicHandler
+}
+
+func init() {
+ router.Routes = append(router.Routes, &SitemapXmlHandler{})
+}
+
+func (r *SitemapXmlHandler) Filter() (method string, path string) {
+ return "GET", "/sitemap.xml"
+}
+
+func (r *SitemapXmlHandler) IsTemplated() bool {
+ return false
+}
+
+func (r *SitemapXmlHandler) TemplatesToInject() []string {
+ return []string{"views/pages/sitemap.xml"}
+}
+
+func (r *SitemapXmlHandler) ToCache() router.CacheSetting {
+ return router.ByUrlOnly
+}
+
+func (r *SitemapXmlHandler) CacheDuration() time.Duration {
+ return time.Hour
+}
+
+func (r *SitemapXmlHandler) ToValidateLang() router.LangSetting {
+ return router.NotRequired
+}
+
+func (r *SitemapXmlHandler) ContentType() string {
+ return fiber.MIMEApplicationXMLCharsetUTF8
+}
+
+func (r *SitemapXmlHandler) Render(c *fiber.Ctx, supplements *router.Supplements, lang string, templateMap fiber.Map) (statusCode int, err error) {
+ urls := []router.SitemapInfo{}
+ for _, route := range router.Routes {
+ sitemapInfo := route.SitemapInfo(supplements)
+ if sitemapInfo == nil {
+ continue
+ }
+
+ method, match := route.Filter()
+ lastMod, err := supplements.TemplateManager.GetLastModified(method + " " + match)
+ if err != nil {
+ slog.Warn("failed to get last modified for a route",
+ slog.String("error", err.Error()),
+ slog.String("method", method),
+ slog.String("match", match))
+ lastMod = time.Now()
+ }
+
+ for i := range sitemapInfo {
+ if sitemapInfo[i].LastModified.Before(lastMod) {
+ sitemapInfo[i].LastModified = lastMod
+ }
+ if sitemapInfo[i].ChangeFreq == "" {
+ sitemapInfo[i].ChangeFreq = "monthly"
+ }
+ urls = append(urls, sitemapInfo[i])
+ }
+ }
+
+ templateMap["URLs"] = urls
+
+ return fiber.StatusOK, nil
+}