tag.go 1.3 KB

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