tag.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package handler
  2. import (
  3. "database/sql"
  4. "errors"
  5. "git.dmitriygnatenko.ru/dima/go-common/logger"
  6. "github.com/gofiber/fiber/v2"
  7. "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/mapper"
  8. "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/services/i18n"
  9. )
  10. const (
  11. TagCacheKey = "tag"
  12. tagParam = "tag"
  13. )
  14. func TagHandler(
  15. cacheService CacheService,
  16. articleRepository ArticleRepository,
  17. tagRepository TagRepository,
  18. ) fiber.Handler {
  19. return func(fctx *fiber.Ctx) error {
  20. ctx := fctx.Context()
  21. url := fctx.Params(tagParam)
  22. lang := i18n.Language(fctx)
  23. renderData, found := cacheService.Get(TagCacheKey + string(lang) + url)
  24. if !found {
  25. tag, err := tagRepository.GetByURL(ctx, url)
  26. if err != nil {
  27. if errors.Is(err, sql.ErrNoRows) {
  28. return fiber.ErrNotFound
  29. }
  30. logger.Error(ctx, err.Error())
  31. return err
  32. }
  33. articles, err := articleRepository.GetPreviewByTagID(ctx, tag.ID)
  34. if err != nil {
  35. logger.Error(ctx, err.Error())
  36. return err
  37. }
  38. renderData = fiber.Map{
  39. "headTitle": i18n.T(lang, "head_title"),
  40. "pageTitle": i18n.T(lang, "tag_page_title", tag.Tag),
  41. "headDescription": i18n.T(lang, "tag_page_desc", tag.Tag),
  42. "headKeywords": i18n.T(lang, "tag_page_keywords", tag.Tag),
  43. "articles": mapper.ToArticlePreviewDTOList(fctx, articles),
  44. }
  45. cacheService.Set(TagCacheKey+string(lang)+url, renderData, nil)
  46. }
  47. return fctx.Render("tag", renderData, "_layout")
  48. }
  49. }