diff --git a/main.go b/main.go index d9f098d..7803e6b 100644 --- a/main.go +++ b/main.go @@ -60,6 +60,8 @@ func setupRoutes(a *models.App) *http.ServeMux { router.Handle("/ru/", m(controllers_pages.MainRuPageHandler(a))) // Обработка главной страницы router.Handle("/", m(controllers_pages.MainPageHandler(a))) + // Обработка страницы со списком постов + router.Handle("/posts/", m(controllers_pages.PostsPageHandler(a))) } return router diff --git a/mvc/controllers/pages/posts.go b/mvc/controllers/pages/posts.go new file mode 100644 index 0000000..90ebc64 --- /dev/null +++ b/mvc/controllers/pages/posts.go @@ -0,0 +1,34 @@ +package controllers + +import ( + "main/mvc/models" + models_pages "main/mvc/models/pages" + "net/http" +) + +// Обработчик главной страницы +func PostsPageHandler(a *models.App) http.HandlerFunc { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var err error + + // Страничка рендерится только если ее нет в кэше + pageData, ok := a.Cache.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) + } + + SendPostsPage(w, pageData.([]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) +} diff --git a/mvc/models/pages/post.go b/mvc/models/pages/post.go new file mode 100644 index 0000000..2d69cca --- /dev/null +++ b/mvc/models/pages/post.go @@ -0,0 +1,36 @@ +package models + +import ( + "time" +) + +type PostName string + +type Post struct { + Name PostName // имя поста + Link string // ссылка на пост + Preview string // превью поста + Data string // содержание + CreateTimestamp int64 // время создания +} + +// NewPost создает новый пост +func NewPost(name, link, data string) *Post { + // preview - первые 500 символов содержания + var preview string + if len(data) > 500 { + preview = data[:500] + "..." + } else { + preview = data + } + + post := &Post{ + Name: PostName(name), + Link: link, + Preview: preview, + Data: data, + CreateTimestamp: time.Now().Unix(), + } + + return post +} diff --git a/mvc/models/pages/posts.go b/mvc/models/pages/posts.go new file mode 100644 index 0000000..c22824d --- /dev/null +++ b/mvc/models/pages/posts.go @@ -0,0 +1,49 @@ +package models + +import ( + "bytes" + "html/template" + "strings" + "time" +) + +const ( + // Имя соответствующего шаблона + PostsPageTmplName = "posts.gohtml" +) + +type Posts map[PostName]Post + +func RenderPostsPage(templates *template.Template, version int64) ([]byte, error) { + var pageData bytes.Buffer + + posts := Posts{ + "post 1": *NewPost( + "post 1", + "post-1", + "full content 1 with more than 100 characters Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam euismod...", + ), + "post 2": *NewPost( + "post 2", + "post-2", + "full content 2", + ), + "post 3": *NewPost( + "post 3", + "post-3", + strings.Repeat("This is post 3 content. ", 30), + ), + } + + context := map[string]any{ + "version": version, + "renderingTimestamp": time.Now().Unix(), + "posts": posts, + } + + if err := templates.ExecuteTemplate(&pageData, PostsPageTmplName, context); err != nil { + return nil, err + } + + return pageData.Bytes(), nil +} diff --git a/mvc/views/blocks/footer.gohtml b/mvc/views/blocks/footer.gohtml new file mode 100644 index 0000000..922c7ce --- /dev/null +++ b/mvc/views/blocks/footer.gohtml @@ -0,0 +1,34 @@ +{{ define "footer" }} + +{{ end }} \ No newline at end of file diff --git a/mvc/views/blocks/footer_ru.gohtml b/mvc/views/blocks/footer_ru.gohtml new file mode 100644 index 0000000..c55391d --- /dev/null +++ b/mvc/views/blocks/footer_ru.gohtml @@ -0,0 +1,34 @@ +{{ define "footer_ru" }} + +{{ end }} \ No newline at end of file diff --git a/mvc/views/blocks/head.gohtml b/mvc/views/blocks/head.gohtml new file mode 100644 index 0000000..14a301f --- /dev/null +++ b/mvc/views/blocks/head.gohtml @@ -0,0 +1,9 @@ +{{ define "head" }} +
+@@ -96,37 +73,6 @@
+ {{ $post.Preview }} +
++ read more +
+
+ created at: {{ $post.CreateTimestamp }}
+