package handler import ( "database/sql" "github.com/dmitriygnatenko/internal/interfaces" "github.com/dmitriygnatenko/internal/mapper" "github.com/gofiber/fiber/v2" ) const ( maxArticlesCount = 3 articleParam = "article" articleCacheKey = "article" ) func ArticleHandler(sp interfaces.ServiceProvider) fiber.Handler { return func(ctx *fiber.Ctx) error { articleReq := ctx.Params(articleParam) renderData, found := sp.GetCacheService().Get(articleCacheKey + articleReq) if !found { article, err := sp.GetArticleRepository().GetByURL(ctx.Context(), articleReq) if err != nil { if err == sql.ErrNoRows { return fiber.ErrNotFound } return err } if !article.IsActive { return fiber.ErrNotFound } articleDTO, err := mapper.ConvertArticleModelToDTO(*article) if err != nil { return err } // All used tags tags, err := sp.GetTagRepository().GetAllUsed(ctx.Context()) if err != nil { return err } tagsDTO := mapper.ConvertTagModelsToDTO(tags) // Last articles articles, err := sp.GetArticleRepository().GetAllPreview(ctx.Context()) if err != nil { return err } if len(articles) > maxArticlesCount { articles = articles[:maxArticlesCount] } articlesDTO, err := mapper.ConvertArticlePreviewModelsToDTO(articles) if err != nil { return err } renderData = fiber.Map{ "headTitle": "От слона к суслику - статьи про PHP, Go, алгоритмы", "headDescription": articleDTO.MetaDescription, "headKeywords": articleDTO.MetaKeywords, "pageTitle": "Статья
" + articleDTO.Title, "article": articleDTO, "sidebarArticles": articlesDTO, "sidebarTags": tagsDTO, } sp.GetCacheService().Set(articleCacheKey+articleReq, renderData) } return ctx.Render("article", renderData, "_layout") } }