Diffstat (limited to 'internal/router/api-v1-general-page-body.go')
| -rw-r--r-- | internal/router/api-v1-general-page-body.go | 121 |
1 files changed, 27 insertions, 94 deletions
diff --git a/internal/router/api-v1-general-page-body.go b/internal/router/api-v1-general-page-body.go index b5567b7..fe21957 100644 --- a/internal/router/api-v1-general-page-body.go +++ b/internal/router/api-v1-general-page-body.go @@ -1,7 +1,6 @@ package router import ( - "bytes" "fmt" "html/template" "log/slog" @@ -14,21 +13,16 @@ import ( "github.com/SayaAndy/saya-today-web/config" "github.com/SayaAndy/saya-today-web/internal/b2" - "github.com/SayaAndy/saya-today-web/internal/blogtrigger" "github.com/SayaAndy/saya-today-web/internal/factgiver" - "github.com/SayaAndy/saya-today-web/internal/frontmatter" - "github.com/SayaAndy/saya-today-web/internal/mailer" "github.com/SayaAndy/saya-today-web/locale" "github.com/gofiber/fiber/v2" "github.com/yuin/goldmark" ) var FactGiver *factgiver.FactGiver -var Mailer *mailer.Mailer -var BlogTrigger *blogtrigger.BlogTriggerScheduler func init() { - assert(0, tm.Add("general-page-body", "views/partials/general-page-body.html")) + tm.Add("general-page-body", "views/partials/general-page-body.html") } func Api_V1_GeneralPage_Body(l map[string]*locale.LocaleConfig, langs []config.AvailableLanguageConfig, b2Client *b2.B2Client, md goldmark.Markdown) func(c *fiber.Ctx) error { @@ -45,16 +39,15 @@ func Api_V1_GeneralPage_Body(l map[string]*locale.LocaleConfig, langs []config.A } path := urlStruct.EscapedPath() - trimmedPath := strings.Trim(path, "/") - cacheKey := fmt.Sprintf("body.%s", trimmedPath) - if val, ok := PCache.Get(cacheKey); !strings.HasSuffix(trimmedPath, "user") && val != nil && ok { + cacheKey := fmt.Sprintf("body.%s", path) + if val, ok := PCache.Get(cacheKey); val != nil && ok { c.Set(fiber.HeaderContentType, fiber.MIMETextHTMLCharsetUTF8) return c.Status(fiber.StatusOK).Type("html").Send(val) } lang := "" - pathParts := strings.Split(trimmedPath, "/") + pathParts := strings.Split(strings.Trim(path, "/"), "/") if len(pathParts) == 1 && pathParts[0] == "" { pathParts = []string{} } @@ -97,54 +90,39 @@ func Api_V1_GeneralPage_Body(l map[string]*locale.LocaleConfig, langs []config.A queryTags = append(queryTags, string(match[1])) } - tagsArray, err := getTags(b2Client, lang) + pages, err := b2Client.Scan(lang + "/") if err != nil { - slog.Warn("failed to get the available tags", slog.String("error", err.Error())) - return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to gather available tags") + slog.Warn("failed to scan pages via b2", slog.String("error", err.Error())) + return c.Status(fiber.ErrInternalServerError.Code).SendString(fmt.Sprintf("failed to scan pages via b2: %s", slog.String("error", err.Error()))) } - values["Tags"] = tagsArray - values["QuerySort"] = querySort - values["QueryTags"] = strings.Join(queryTags, ",") - values["Title"] = l[lang].BlogSearch.Header - - additionalTemplates = append(additionalTemplates, "views/pages/blog-catalogue.html") - } else if len(pathParts) == 2 && pathParts[1] == "user" { - values["Title"] = l[lang].UserProfile.Header - - email, _, err := Mailer.GetInfo(Mailer.GetHash(c.IP())) - if err != nil { - slog.Error("get info from mailer about a client", slog.String("error", err.Error())) - } - - tagsArray, err := getTags(b2Client, lang) - if err != nil { - slog.Warn("failed to get the available tags", slog.String("error", err.Error())) - return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to gather available tags") + tagsMap := make(map[string]int) + for _, page := range pages { + for _, tag := range page.Metadata.Tags { + tagsMap[tag]++ + } } + slog.Debug("enlist pages for catalogue", slog.Int("tag_count", len(tagsMap)), slog.Int("page_count", len(pages)), slog.String("path", c.Path())) - subscriptionType, tags, err := Mailer.GetSubscriptions(c.IP()) - if err != nil { - slog.Warn("failed to get the user subscriptions", slog.String("error", err.Error())) - return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to get the user subscriptions") + type Tag struct { + Name string `json:"Name" yaml:"name"` + Count int `json:"Count" yaml:"count"` } - switch subscriptionType { - case mailer.None: - values["TagsPicked"] = "none" - case mailer.All: - values["TagsPicked"] = "all" - case mailer.Specific: - values["TagsPicked"] = "specific" + tagsArray := make([]Tag, 0, len(tagsMap)) + for tag, count := range tagsMap { + tagsArray = append(tagsArray, Tag{tag, count}) } + slices.SortFunc(tagsArray, func(a Tag, b Tag) int { + return strings.Compare(a.Name, b.Name) + }) - values["TagsPickedList"] = tags - - values["Email"] = email - values["EmailCode"] = c.Query("email_code") - values["ExistingTags"] = tagsArray + values["Tags"] = tagsArray + values["QuerySort"] = querySort + values["QueryTags"] = strings.Join(queryTags, ",") + values["Title"] = l[lang].BlogSearch.Header - additionalTemplates = append(additionalTemplates, "views/pages/user-page.html") + additionalTemplates = append(additionalTemplates, "views/pages/blog-catalogue.html") } else if len(pathParts) == 3 && pathParts[1] == "blog" { metadata, parsedMarkdown, err := readBlogPost(md, b2Client, lang+"/"+pathParts[2]) if err != nil { @@ -196,48 +174,3 @@ func Api_V1_GeneralPage_Body(l map[string]*locale.LocaleConfig, langs []config.A return c.Status(fiber.StatusOK).Type("html").Send(content) } } - -func readBlogPost(md goldmark.Markdown, b2Client *b2.B2Client, sourceName string) (metadata *frontmatter.Metadata, html string, err error) { - metadata, markdown, err := b2Client.ReadFrontmatter(sourceName + ".md") - if err != nil { - return nil, "", fmt.Errorf("failed to read a frontmatter file: %w", err) - } - - var buf bytes.Buffer - if err := md.Convert(markdown, &buf); err != nil { - return nil, "", fmt.Errorf("convert source context from md to html: %w", err) - } - - return metadata, buf.String(), nil -} - -type Tag struct { - Name string `json:"Name" yaml:"name"` - Count int `json:"Count" yaml:"count"` -} - -func getTags(b2Client *b2.B2Client, lang string) (tags []Tag, err error) { - pages, err := b2Client.Scan(lang + "/") - if err != nil { - slog.Warn("failed to scan pages via b2", slog.String("error", err.Error())) - return nil, fmt.Errorf("failed to scan pages via b2: %w", err) - } - - tagsMap := make(map[string]int) - for _, page := range pages { - for _, tag := range page.Metadata.Tags { - tagsMap[tag]++ - } - } - slog.Debug("enlist pages for catalogue", slog.Int("tag_count", len(tagsMap)), slog.Int("page_count", len(pages)), slog.String("lang", lang)) - - tagsArray := make([]Tag, 0, len(tagsMap)) - for tag, count := range tagsMap { - tagsArray = append(tagsArray, Tag{tag, count}) - } - slices.SortFunc(tagsArray, func(a Tag, b Tag) int { - return strings.Compare(a.Name, b.Name) - }) - - return tagsArray, nil -} |