reprogl

Форк
0
/
article.go 
102 строки · 2.7 Кб
1
package handlers
2

3
import (
4
	"errors"
5
	"net/http"
6
	"strconv"
7
	"time"
8

9
	"github.com/go-chi/chi/v5"
10
	"xelbot.com/reprogl/container"
11
	"xelbot.com/reprogl/models"
12
	"xelbot.com/reprogl/models/repositories"
13
	"xelbot.com/reprogl/session"
14
	"xelbot.com/reprogl/views"
15
)
16

17
func PageAction(app *container.Application) http.HandlerFunc {
18
	return func(w http.ResponseWriter, r *http.Request) {
19
		slug := chi.URLParam(r, "slug")
20

21
		var isAdmin bool
22
		if user, ok := session.GetIdentity(r.Context()); ok {
23
			isAdmin = user.IsAdmin()
24
		}
25

26
		repo := repositories.ArticleRepository{DB: app.DB}
27
		article, err := repo.GetBySlug(slug, isAdmin)
28
		if err != nil {
29
			if errors.Is(err, models.RecordNotFound) {
30
				app.NotFound(w)
31
			} else {
32
				app.ServerError(w, err)
33
			}
34

35
			return
36
		}
37

38
		tagRepo := repositories.TagRepository{DB: app.DB}
39
		article.Tags, err = tagRepo.GetCollectionByArticle(article)
40
		if err != nil {
41
			app.ServerError(w, err)
42

43
			return
44
		}
45

46
		commentRepo := repositories.CommentRepository{DB: app.DB}
47
		lastUpdate, err := commentRepo.GetLastUpdate(article.ID)
48
		if err != nil {
49
			app.ServerError(w, err)
50

51
			return
52
		}
53

54
		cache := app.GetIntCache()
55

56
		var recentID int
57
		var found bool
58
		if recentID, found = cache.Get("last_recent_id"); !found {
59
			recentID, err = repo.GetLastRecentPostsID()
60
			if err != nil {
61
				app.ServerError(w, err)
62

63
				return
64
			}
65
			cache.Set("last_recent_id", recentID, 24*time.Hour)
66
		}
67
		if article.ID >= recentID {
68
			article.RecentPostsID = strconv.Itoa(article.ID)
69
		} else {
70
			article.RecentPostsID = "0"
71
		}
72

73
		templateData := views.NewArticlePageData(
74
			article,
75
			lastUpdate,
76
			r.Header.Get("Accept"),
77
		)
78
		cfg := container.GetConfig()
79
		templateData.AppendTitle(article.Title)
80
		templateData.SetCanonical(container.GenerateAbsoluteURL("article", "slug", slug))
81
		templateData.SetOpenGraphProperty("og:type", "article")
82
		templateData.SetOpenGraphProperty("article:published_time", article.CreatedAt.Format(time.RFC3339))
83
		templateData.SetOpenGraphProperty("article:modified_time", article.UpdatedAt.Format(time.RFC3339))
84
		templateData.SetOpenGraphProperty("article:author", cfg.Author.FullName)
85
		if article.HasImage() {
86
			image := article.SrcImageForOpenGraph()
87
			if image != nil {
88
				templateData.SetOpenGraphProperty("og:image", cfg.CDNBaseURL+"/uploads/"+image.Path)
89
				templateData.SetOpenGraphProperty("og:image:width", strconv.Itoa(image.Width))
90
				templateData.SetOpenGraphProperty("og:image:height", strconv.Itoa(image.Height))
91
			}
92
			if article.Alt.Valid && len(article.Alt.String) > 0 {
93
				templateData.SetOpenGraphProperty("og:image:alt", article.Alt.String)
94
			}
95
		}
96

97
		err = views.WriteTemplateWithContext(r.Context(), w, "article.gohtml", templateData)
98
		if err != nil {
99
			app.ServerError(w, err)
100
		}
101
	}
102
}
103

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.