package handler import ( "database/sql" "github.com/dmitriygnatenko/internal/interfaces" "github.com/dmitriygnatenko/internal/mapper" "github.com/gofiber/fiber/v2" ) const ( maxArticlesCount = 3 articleCacheKey = "article" ) func ArticleHandler(app interfaces.IApp) fiber.Handler { return func(ctx *fiber.Ctx) error { articleReq := ctx.Params("article") renderData, found := app.GetCacheService().Get(articleCacheKey + articleReq) if !found { article, err := app.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 := app.GetTagRepository().GetAllUsed(ctx.Context()) if err != nil { return err } tagsDTO, err := mapper.ConvertTagModelsToDTO(tags) if err != nil { return err } // Last articles articles, err := app.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, } app.GetCacheService().Set(articleCacheKey+articleReq, renderData) } return ctx.Render("article", renderData, "_layout") } }