From 3deb2022b889e950b82f739a52083651b2292e34 Mon Sep 17 00:00:00 2001 From: tamsin johnson Date: Thu, 25 Jan 2024 15:06:28 -0800 Subject: [PATCH] lets-go:5.4 --- snippetbox/cmd/web/handlers.go | 35 ++------------------------------ snippetbox/cmd/web/helpers.go | 23 +++++++++++++++++++++ snippetbox/cmd/web/main.go | 9 +++++++++ snippetbox/cmd/web/templates.go | 36 +++++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 33 deletions(-) diff --git a/snippetbox/cmd/web/handlers.go b/snippetbox/cmd/web/handlers.go index 94dcf53..5c77f5e 100644 --- a/snippetbox/cmd/web/handlers.go +++ b/snippetbox/cmd/web/handlers.go @@ -3,7 +3,6 @@ package main import ( "errors" "fmt" - "html/template" "net/http" "strconv" @@ -23,26 +22,11 @@ func (app *application) home(w http.ResponseWriter, r *http.Request) { 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, r, err) - return - } - data := templateData{ Snippets: snippets, } - err = ts.ExecuteTemplate(w, "base", data) - if err != nil { - app.serverError(w, r, err) - } + app.render(w, r, http.StatusOK, "home.tmpl", data) } // snippetView ... @@ -63,26 +47,11 @@ 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, r, err) - return - } - data := templateData{ Snippet: snippet, } - err = ts.ExecuteTemplate(w, "base", data) - if err != nil { - app.serverError(w, r, err) - } + app.render(w, r, http.StatusOK, "view.tmpl", data) } // snippetCreate ... diff --git a/snippetbox/cmd/web/helpers.go b/snippetbox/cmd/web/helpers.go index d7392c6..6b7e19c 100644 --- a/snippetbox/cmd/web/helpers.go +++ b/snippetbox/cmd/web/helpers.go @@ -1,11 +1,34 @@ package main import ( + "bytes" + "fmt" "log/slog" "net/http" "runtime/debug" ) +// render ... +func (app *application) render(w http.ResponseWriter, r *http.Request, 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, r, err) + return + } + + buf := new(bytes.Buffer) + + err := ts.ExecuteTemplate(buf, "base", data) + if err != nil { + app.serverError(w, r, err) + return + } + + w.WriteHeader(status) + buf.WriteTo(w) +} + func (app *application) serverError(w http.ResponseWriter, r *http.Request, err error) { var ( method = r.Method diff --git a/snippetbox/cmd/web/main.go b/snippetbox/cmd/web/main.go index 7ccebcc..1a09036 100644 --- a/snippetbox/cmd/web/main.go +++ b/snippetbox/cmd/web/main.go @@ -3,6 +3,7 @@ package main import ( "database/sql" "flag" + "html/template" "log/slog" "net/http" "regexp" @@ -17,6 +18,7 @@ import ( type application struct { logger *slog.Logger snippets *models.SnippetModel + templateCache map[string]*template.Template } // main it's the snippetbox webapp @@ -38,10 +40,17 @@ func main() { defer db.Close() + templateCache, err := newTemplateCache() + if err != nil { + logger.Error(err.Error()) + os.Exit(1) + } + // setup the application app := &application{ logger: logger, snippets: &models.SnippetModel{DB: db}, + templateCache: templateCache, } logger.Info("starting server", slog.String("addr", *addr)) diff --git a/snippetbox/cmd/web/templates.go b/snippetbox/cmd/web/templates.go index 61e5975..79e5d76 100644 --- a/snippetbox/cmd/web/templates.go +++ b/snippetbox/cmd/web/templates.go @@ -1,6 +1,9 @@ package main import ( + "html/template" + "path/filepath" + "snippetbox.chaosfem.tw/internal/models" ) @@ -8,3 +11,36 @@ type templateData struct { Snippet models.Snippet Snippets []models.Snippet } + +// newTemplateCache ... +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/partials/*.tmpl") + if err != nil { + return nil, err + } + + ts, err = ts.ParseFiles(page) + if err != nil { + return nil, err + } + + cache[name] = ts + } + + return cache, nil +}