some changes

posts
serr 2025-04-10 22:07:44 +03:00
parent 5a34d18ed6
commit 70d82d69d1
8 changed files with 40 additions and 45 deletions

View File

@ -21,60 +21,60 @@ func MainPageHandler(a *models.App) http.HandlerFunc {
if count, err = tools.GetJournalctlLogsCount("server", models.Cfg.ServerDomain, 24); err != nil {
log.Printf("%s", err.Error())
}
SendCount(w, count)
sendCount(w, count)
return
}
// Пасхалка
if r.Method == "LOVE" {
SendLove(w)
sendLove(w)
return
}
// Пасхалка 2
if r.Method == "LIMINAL" {
SendLiminal(w)
sendLiminal(w)
return
}
// Страничка рендерится только если ее нет в кэше
pageData, ok := a.Cache.Get(models_pages.MainPageTmplName)
pageData, ok := models.PagesCache.Get(models_pages.MainPageTmplName)
if !ok {
pageData, err = models_pages.RenderMainPage(a.Templates, a.Version)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
a.Cache.Set(models_pages.MainPageTmplName, pageData)
models.PagesCache.Set(models_pages.MainPageTmplName, pageData)
}
SendMainPage(w, pageData.([]byte))
sendMainPage(w, pageData.([]byte))
})
}
// Отправляет страницу
func SendMainPage(w http.ResponseWriter, data []byte) {
func sendMainPage(w http.ResponseWriter, data []byte) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusOK)
w.Write(data)
}
// Ответ на метод COUNT
func SendCount(w http.ResponseWriter, data []byte) {
func sendCount(w http.ResponseWriter, data []byte) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.WriteHeader(http.StatusOK)
w.Write(data)
}
// Ответ на метод LOVE
func SendLove(w http.ResponseWriter) {
func sendLove(w http.ResponseWriter) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.WriteHeader(http.StatusOK)
w.Write([]byte("13.01.2005\n"))
}
// Ответ на метод LIMINAL
func SendLiminal(w http.ResponseWriter) {
func sendLiminal(w http.ResponseWriter) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.WriteHeader(http.StatusOK)
text := "If you're not careful and you slip out of reality in the wrong place, you'll end up in the Backstage, where there's nothing but the stench of old damp carpet, yellow-colored madness, the endless unbearable hum of fluorescent lights, and roughly six hundred million square miles of randomly arranged empty rooms.\n"

View File

@ -12,22 +12,22 @@ func MainRuPageHandler(a *models.App) http.HandlerFunc {
var err error
// Страничка рендерится только если ее нет в кэше
pageData, ok := a.Cache.Get(models_pages.MainRuPageTmplName)
pageData, ok := models.PagesCache.Get(models_pages.MainRuPageTmplName)
if !ok {
pageData, err = models_pages.RenderMainRuPage(a.Templates, a.Version)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
a.Cache.Set(models_pages.MainRuPageTmplName, pageData)
models.PagesCache.Set(models_pages.MainRuPageTmplName, pageData)
}
SendMainPage(w, pageData.([]byte))
sendMainRuPage(w, pageData.([]byte))
})
}
// Отправляет страницу
func SendMainRuPage(w http.ResponseWriter, data []byte) {
func sendMainRuPage(w http.ResponseWriter, data []byte) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusOK)
w.Write(data)

View File

@ -14,7 +14,7 @@ func PostPageHandler(a *models.App) http.HandlerFunc {
posts := models_pages.GetPosts()
// Страничка рендерится только если ее нет в кэше
pageData, ok := a.Cache.Get(models_pages.PostPageTmplName)
pageData, ok := models.PagesCache.Get(models_pages.PostPageTmplName)
if !ok {
post := posts[models_pages.PostLink(r.URL.Path)]
@ -24,15 +24,15 @@ func PostPageHandler(a *models.App) http.HandlerFunc {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
a.Cache.Set(models_pages.PostPageTmplName, pageData)
models.PagesCache.Set(models_pages.PostPageTmplName, pageData)
}
SendPostPage(w, pageData.([]byte))
sendPostPage(w, pageData.([]byte))
})
}
// Отправляет страницу
func SendPostPage(w http.ResponseWriter, data []byte) {
func sendPostPage(w http.ResponseWriter, data []byte) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusOK)
w.Write(data)

View File

@ -12,22 +12,22 @@ func PostsPageHandler(a *models.App) http.HandlerFunc {
var err error
// Страничка рендерится только если ее нет в кэше
pageData, ok := a.Cache.Get(models_pages.PostsPageTmplName)
pageData, ok := models.PagesCache.Get(models_pages.PostsPageTmplName)
if !ok {
pageData, err = models_pages.RenderPostsPage(a.Templates, a.Version)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
a.Cache.Set(models_pages.PostsPageTmplName, pageData)
models.PagesCache.Set(models_pages.PostsPageTmplName, pageData)
}
SendPostsPage(w, pageData.([]byte))
sendPostsPage(w, pageData.([]byte))
})
}
// Отправляет страницу
func SendPostsPage(w http.ResponseWriter, data []byte) {
func sendPostsPage(w http.ResponseWriter, data []byte) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusOK)
w.Write(data)

View File

@ -9,21 +9,18 @@ import (
type Middleware func(http.Handler) http.Handler
var (
MiddlewaresChain = CreateMiddlewaresChain(
LoggingMiddleware,
MiddlewaresChain = createMiddlewaresChain(
loggingMiddleware,
)
)
/*
Возвращает один middleware, который объединяет все переданные
CreateMiddlewaresChain(m1, m2, m3)
createMiddlewaresChain(m1, m2, m3)
= func(next http.Handler) http.Handler { return m1(m2(m3(final))) }
CreateMiddlewaresChain(LoggingMiddleware)
= func(next http.Handler) http.Handler { return LoggingMiddleware(final) }
*/
func CreateMiddlewaresChain(middlewares ...Middleware) Middleware {
func createMiddlewaresChain(middlewares ...Middleware) Middleware {
return func(final http.Handler) http.Handler {
for i := len(middlewares) - 1; i >= 0; i-- {
final = middlewares[i](final)
@ -32,7 +29,7 @@ func CreateMiddlewaresChain(middlewares ...Middleware) Middleware {
}
}
func LoggingMiddleware(next http.Handler) http.Handler {
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()

View File

@ -9,10 +9,9 @@ import (
"time"
)
// App хранит информацию о приложении
// App хранит шаблоны и время запуска
type App struct {
Templates *template.Template // Шаблоны страниц
Cache *Cache // Кэш (отрендеренные странички)
Version int64 // Время запуска
}
@ -21,7 +20,6 @@ func AppInit() (*App, error) {
a := &App{
Version: time.Now().Unix(),
Cache: CacheInit(),
}
// Загрузка шаблонов

View File

@ -2,23 +2,23 @@ package models
import "sync"
type Cache struct {
type cache struct {
Data map[string]any
Mu sync.RWMutex
}
func CacheInit() *Cache {
return &Cache{Data: make(map[string]any)}
}
var (
PagesCache = cache{Data: make(map[string]any)}
)
func (c *Cache) Get(key string) (any, bool) {
func (c *cache) Get(key string) (any, bool) {
c.Mu.RLock()
pageData, ok := c.Data[key]
c.Mu.RUnlock()
return pageData, ok
}
func (c *Cache) Set(key string, data any) {
func (c *cache) Set(key string, data any) {
c.Mu.Lock()
c.Data[key] = data
c.Mu.Unlock()

View File

@ -19,10 +19,10 @@ const (
PostsPageTmplName = "posts.gohtml"
)
type Posts map[PostLink]*Post
type posts map[PostLink]*Post
var (
posts = Posts{}
allPosts = posts{}
)
func init() {
@ -31,8 +31,8 @@ func init() {
}
}
func GetPosts() Posts {
return posts
func GetPosts() posts {
return allPosts
}
func loadPosts(dir string) error {
@ -54,7 +54,7 @@ func loadPosts(dir string) error {
html := tools.MdToHTML(md)
link := fmt.Sprintf("/%s/", strings.TrimSuffix(filepath.Base(path), ".md"))
posts[PostLink(link)] = newPost(link, html)
allPosts[PostLink(link)] = newPost(link, html)
}
return nil
})
@ -72,7 +72,7 @@ func RenderPostsPage(templates *template.Template, version int64) ([]byte, error
context := map[string]any{
"version": version,
"renderingTimestamp": time.Now().Unix(),
"posts": posts,
"posts": allPosts,
}
if err := templates.ExecuteTemplate(&pageData, PostsPageTmplName, context); err != nil {