cflynn07/myblog

View on GitHub
app/handlers.go

Summary

Maintainability
A
1 hr
Test Coverage
package app

import (
    "bytes"
    "html/template"
    "log"
    "math"
    "net/http"
    "strings"

    "github.com/gobuffalo/packr/v2"
    "github.com/gorilla/mux"
    "github.com/russross/blackfriday/v2"
)

var postsBox = packr.New("Posts", "../posts")
var templateBox = packr.New("Templates", "../templates")

func truncHelper(s string) string {
    words := strings.Fields(s)
    maxPreviewLength := int(math.Min(40, float64(len(words))))
    words = words[0:maxPreviewLength]
    return strings.Join(words, " ")
}

// HomeHandler Handler for / route
func HomeHandler(w http.ResponseWriter, r *http.Request) {
    type homePageVars struct {
        globalPageVars
        BlogPosts     blogPosts
        BlogPostsKeys []string
        Path          string
        PageHasPost   bool
    }

    hpv := homePageVars{
        globalPageVars: gpv,
        BlogPosts:      bp,
        BlogPostsKeys:  bpKeys,
        Path:           "/",
        PageHasPost:    false,
    }

    for key, value := range bp {
        data, err := postsBox.Find(key + ".md")
        if err != nil {
            log.Fatal("error opening post ", err)
        }
        value.Content = string(blackfriday.Run(data))
        value.ContentPreview = truncHelper(string(data))
    }

    templateLayout, err := templateBox.FindString("layout.html")
    if err != nil {
        log.Fatal(err)
    }
    templateHome, err := templateBox.FindString("home.html")
    if err != nil {
        log.Fatal(err)
    }
    t := template.New("")
    t.Parse(templateLayout)
    t.Parse(templateHome)

    err = t.ExecuteTemplate(w, "layout", hpv)
    if err != nil {
        log.Print(err)
    }
}

// PostHandler Handler for /posts/* route
func PostHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)

    type postPageVars struct {
        globalPageVars
        BlogPost     template.HTML
        BlogPostMeta *postData
        Path         string
        PageHasPost  bool
    }

    ppv := postPageVars{
        globalPageVars: gpv,
        Path:           "/posts/" + vars["slug"],
        PageHasPost:    true,
    }

    templateLayout, err := templateBox.FindString("layout.html")
    if err != nil {
        log.Fatal(err)
    }
    var templateContent string

    if post, ok := bp[vars["slug"]]; !ok {
        // Post slug doesn't exist
        w.WriteHeader(http.StatusNotFound)
        // use 404 template
        templateContent, err = templateBox.FindString("404.html")
        if err != nil {
            log.Fatal(err)
        }
    } else {
        ppv.BlogPostMeta = post
        ppv.Description = post.Description
        ppv.Keywords = strings.Join(post.Keywords, ",")

        data, err := postsBox.FindString(vars["slug"] + ".md")
        if err != nil {
            log.Fatal(err)
        }

        // New delims due to conflict with source code in blog posts
        t := template.New("").Delims(":::", ":::")
        _, err = t.Parse(data)
        if err != nil {
            log.Fatal(err)
        }

        buf := bytes.NewBufferString("")
        err = t.Execute(buf, post)
        if err != nil {
            log.Fatal(err)
        }

        blogPost := blackfriday.Run(buf.Bytes())
        ppv.BlogPost = template.HTML(blogPost)

        // use post template
        templateContent, err = templateBox.FindString("post.html")
        if err != nil {
            log.Fatal(err)
        }
    }

    t := template.New("")
    t.Parse(templateLayout)
    t.Parse(templateContent)
    err = t.ExecuteTemplate(w, "layout", ppv)
    if err != nil {
        log.Println(err)
    }
}

// AboutHandler Handler for /about route
func AboutHandler(w http.ResponseWriter, r *http.Request) {
    type aboutPageVars struct {
        globalPageVars
        Path        string
        PageHasPost bool
    }

    apv := aboutPageVars{
        globalPageVars: gpv,
        Path:           "/about",
        PageHasPost:    false,
    }

    templateLayout, err := templateBox.FindString("layout.html")
    if err != nil {
        log.Fatal(err)
    }
    templateContent, err := templateBox.FindString("about.html")
    if err != nil {
        log.Fatal(err)
    }
    t := template.New("")
    t.Parse(templateLayout)
    t.Parse(templateContent)
    err = t.ExecuteTemplate(w, "layout", apv)
}

// CatchAllHandler Handler for undefined routes
func CatchAllHandler(w http.ResponseWriter, r *http.Request) {
    log.Println("catch all handler")
    w.WriteHeader(http.StatusNotFound)

    type notFoundPageVars struct {
        globalPageVars
        Path        string
        PageHasPost bool
    }

    nfpv := notFoundPageVars{
        globalPageVars: gpv,
        Path:           "",
        PageHasPost:    false,
    }

    templateLayout, err := templateBox.FindString("layout.html")
    if err != nil {
        log.Fatal(err)
    }
    templateContent, err := templateBox.FindString("404.html")
    if err != nil {
        log.Fatal(err)
    }
    t := template.New("")
    t.Parse(templateLayout)
    t.Parse(templateContent)
    err = t.ExecuteTemplate(w, "layout", nfpv)
}