tag.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package handler
  2. import (
  3. "database/sql"
  4. "github.com/gofiber/fiber/v2"
  5. "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/mapper"
  6. )
  7. const tagParam = "tag"
  8. const tagCacheKey = "tag"
  9. func TagHandler(
  10. cacheService CacheService,
  11. articleRepository ArticleRepository,
  12. tagRepository TagRepository,
  13. ) fiber.Handler {
  14. return func(fctx *fiber.Ctx) error {
  15. ctx := fctx.Context()
  16. tagReq := fctx.Params(tagParam)
  17. renderData, found := cacheService.Get(tagCacheKey + tagReq)
  18. if !found {
  19. tag, err := tagRepository.GetByURL(ctx, tagReq)
  20. if err != nil {
  21. if err == sql.ErrNoRows {
  22. return fiber.ErrNotFound
  23. }
  24. return err
  25. }
  26. articles, err := articleRepository.GetPreviewByTagID(ctx, tag.ID)
  27. if err != nil {
  28. return err
  29. }
  30. renderData = fiber.Map{
  31. "headTitle": "От слона к суслику - статьи про PHP, Go, алгоритмы",
  32. "headDescription": "статьи с тегом " + tag.Tag,
  33. "headKeywords": "программирование, статьи, блог, " + tag.Tag,
  34. "pageTitle": "Тег<br>" + tag.Tag,
  35. "articles": mapper.ToArticlePreviewDTOList(articles),
  36. }
  37. cacheService.Set(tagCacheKey+tagReq, renderData)
  38. }
  39. return fctx.Render("tag", renderData, "_layout")
  40. }
  41. }