main_page.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package handler
  2. //go:generate mkdir -p mocks
  3. //go:generate rm -rf ./mocks/*_minimock.go
  4. //go:generate minimock -i CacheService,ArticleRepository,TagRepository -o ./mocks/ -s "_minimock.go"
  5. import (
  6. "context"
  7. "time"
  8. "git.dmitriygnatenko.ru/dima/go-common/logger"
  9. "github.com/gofiber/fiber/v2"
  10. "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/mapper"
  11. "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/models"
  12. )
  13. type (
  14. CacheService interface {
  15. Get(key string) (interface{}, bool)
  16. Set(key string, value interface{}, expiration *time.Duration)
  17. }
  18. ArticleRepository interface {
  19. GetByURL(ctx context.Context, url string) (*models.Article, error)
  20. GetAllPreview(ctx context.Context) ([]models.ArticlePreview, error)
  21. GetPreviewByTagID(ctx context.Context, tagID uint64) ([]models.ArticlePreview, error)
  22. }
  23. TagRepository interface {
  24. GetAllUsed(ctx context.Context) ([]models.Tag, error)
  25. GetByURL(ctx context.Context, tag string) (*models.Tag, error)
  26. }
  27. )
  28. const allPreviewArticlesCacheKey = "all-preview-articles"
  29. func MainPageHandler(
  30. cacheService CacheService,
  31. articleRepository ArticleRepository,
  32. ) fiber.Handler {
  33. return func(fctx *fiber.Ctx) error {
  34. ctx := fctx.Context()
  35. renderData, found := cacheService.Get(allPreviewArticlesCacheKey)
  36. if !found {
  37. articles, err := articleRepository.GetAllPreview(fctx.Context())
  38. if err != nil {
  39. logger.Error(ctx, err.Error())
  40. return err
  41. }
  42. renderData = fiber.Map{
  43. "headTitle": "От слона к суслику - статьи про PHP, Go, алгоритмы",
  44. "headDescription": "список статей",
  45. "headKeywords": "Дмитрий Гнатенко, программист, PHP, Go, Golang, программирование, статьи, блог",
  46. "pageTitle": "Список статей",
  47. "articles": mapper.ToArticlePreviewDTOList(articles),
  48. }
  49. cacheService.Set(allPreviewArticlesCacheKey, renderData, nil)
  50. }
  51. return fctx.Render("index", renderData, "_layout")
  52. }
  53. }