From a5827ae3d71545fc27c39b9ed9f0dff59e9e2873 Mon Sep 17 00:00:00 2001 From: lbenedar Date: Thu, 5 Mar 2026 11:32:32 +0300 Subject: [PATCH] ch5.3 --- cmd/web/handlers.go | 53 +++++++++++++++----------------------------- cmd/web/main.go | 20 ++++++++++++----- cmd/web/templates.go | 33 +++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 41 deletions(-) diff --git a/cmd/web/handlers.go b/cmd/web/handlers.go index 1c8719f..d091dac 100644 --- a/cmd/web/handlers.go +++ b/cmd/web/handlers.go @@ -3,13 +3,26 @@ package main import ( "errors" "fmt" - "html/template" "net/http" "strconv" "gitea.local.lab/Lbenedar/snippetbox/internal/models" ) +func (app *application) render(w http.ResponseWriter, status int, page string, data *templateData) { + ts, ok := app.templateCache[page] + if !ok { + err := fmt.Errorf("the template %s does not exist", page) + app.serverError(w, err) + return + } + w.WriteHeader(status) + err := ts.ExecuteTemplate(w, "base", data) + if err != nil { + app.serverError(w, err) + } +} + func (app *application) home(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { app.notFound(w) @@ -21,23 +34,9 @@ func (app *application) home(w http.ResponseWriter, r *http.Request) { app.serverError(w, err) return } - files := []string{ - "./ui/html/base.tmpl", - "./ui/html/partials/nav.tmpl", - "./ui/html/pages/home.tmpl", - } - ts, err := template.ParseFiles(files...) - if err != nil { - app.serverError(w, err) - return - } - data := &templateData{ + app.render(w, http.StatusOK, "home.tmpl", &templateData{ Snippets: snippets, - } - err = ts.ExecuteTemplate(w, "base", data) - if err != nil { - app.serverError(w, err) - } + }) } func (app *application) snippetView(w http.ResponseWriter, r *http.Request) { @@ -56,25 +55,9 @@ func (app *application) snippetView(w http.ResponseWriter, r *http.Request) { } return } - files := []string{ - "./ui/html/base.tmpl", - "./ui/html/partials/nav.tmpl", - "./ui/html/pages/view.tmpl", - } - ts, err := template.ParseFiles(files...) - if err != nil { - app.serverError(w, err) - return - } - - data := &templateData{ + app.render(w, http.StatusOK, "view.tmpl", &templateData{ Snippet: snippet, - } - - err = ts.ExecuteTemplate(w, "base", data) - if err != nil { - app.serverError(w, err) - } + }) } func (app *application) snippetCreate(w http.ResponseWriter, r *http.Request) { diff --git a/cmd/web/main.go b/cmd/web/main.go index d2de172..d80a947 100644 --- a/cmd/web/main.go +++ b/cmd/web/main.go @@ -3,6 +3,7 @@ package main import ( "database/sql" "flag" + "html/template" "log" "net/http" "os" @@ -13,9 +14,10 @@ import ( ) type application struct { - errorLog *log.Logger - infoLog *log.Logger - snippets *models.SnippetModel + errorLog *log.Logger + infoLog *log.Logger + snippets *models.SnippetModel + templateCache map[string]*template.Template } type config struct { @@ -40,10 +42,16 @@ func main() { } defer db.Close() + templateCache, err := newTemplateCache() + if err != nil { + errorLog.Fatal(err) + } + app := &application{ - errorLog: errorLog, - infoLog: infoLog, - snippets: &models.SnippetModel{DB: db}, + errorLog: errorLog, + infoLog: infoLog, + snippets: &models.SnippetModel{DB: db}, + templateCache: templateCache, } srv := &http.Server{ diff --git a/cmd/web/templates.go b/cmd/web/templates.go index 350820a..9cba446 100644 --- a/cmd/web/templates.go +++ b/cmd/web/templates.go @@ -1,6 +1,9 @@ package main import ( + "html/template" + "path/filepath" + "gitea.local.lab/Lbenedar/snippetbox/internal/models" ) @@ -8,3 +11,33 @@ type templateData struct { Snippet *models.Snippet Snippets []*models.Snippet } + +func newTemplateCache() (map[string]*template.Template, error) { + cache := map[string]*template.Template{} + + pages, err := filepath.Glob("./ui/html/pages/*.tmpl") + if err != nil { + return nil, err + } + + for _, page := range pages { + name := filepath.Base(page) + ts, err := template.ParseFiles("./ui/html/base.tmpl") + if err != nil { + return nil, err + } + + ts, err = ts.ParseGlob("./ui/html/pages/nav.tmpl") + if err != nil { + return nil, err + } + + ts, err = ts.ParseFiles(page) + if err != nil { + return nil, err + } + + cache[name] = ts + } + return cache, nil +}