tag.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. )
  9. const (
  10. TagCacheKey = "tag"
  11. tagParam = "tag"
  12. )
  13. func TagHandler(
  14. cacheService CacheService,
  15. articleRepository ArticleRepository,
  16. tagRepository TagRepository,
  17. ) fiber.Handler {
  18. return func(fctx *fiber.Ctx) error {
  19. ctx := fctx.Context()
  20. url := fctx.Params(tagParam)
  21. renderData, found := cacheService.Get(TagCacheKey + url)
  22. if !found {
  23. tag, err := tagRepository.GetByURL(ctx, url)
  24. if err != nil {
  25. if errors.Is(err, sql.ErrNoRows) {
  26. return fiber.ErrNotFound
  27. }
  28. logger.Error(ctx, err.Error())
  29. return err
  30. }
  31. articles, err := articleRepository.GetPreviewByTagID(ctx, tag.ID)
  32. if err != nil {
  33. logger.Error(ctx, err.Error())
  34. return err
  35. }
  36. renderData = fiber.Map{
  37. "headTitle": "От слона к суслику - статьи про PHP, Go, алгоритмы",
  38. "headDescription": "статьи с тегом " + tag.Tag,
  39. "headKeywords": "программирование, статьи, блог, " + tag.Tag,
  40. "pageTitle": "Тег<br>" + tag.Tag,
  41. "articles": mapper.ToArticlePreviewDTOList(articles),
  42. }
  43. cacheService.Set(TagCacheKey+url, renderData, nil)
  44. }
  45. return fctx.Render("tag", renderData, "_layout")
  46. }
  47. }