tag.go 1.3 KB

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