blog/core/blog.go

59 lines
1.4 KiB
Go

package core
import (
"html/template"
"net/http"
"github.com/gorilla/mux"
"github.com/kirsle/blog/core/models/posts"
"github.com/urfave/negroni"
)
// BlogRoutes attaches the blog routes to the app.
func (b *Blog) BlogRoutes(r *mux.Router) {
// Login-required routers.
loginRouter := mux.NewRouter()
loginRouter.HandleFunc("/blog/edit", b.EditBlog)
r.PathPrefix("/blog").Handler(
negroni.New(
negroni.HandlerFunc(b.LoginRequired),
negroni.Wrap(loginRouter),
),
)
adminRouter := mux.NewRouter().PathPrefix("/admin").Subrouter().StrictSlash(false)
r.HandleFunc("/admin", b.AdminHandler) // so as to not be "/admin/"
adminRouter.HandleFunc("/settings", b.SettingsHandler)
adminRouter.PathPrefix("/").HandlerFunc(b.PageHandler)
r.PathPrefix("/admin").Handler(negroni.New(
negroni.HandlerFunc(b.LoginRequired),
negroni.Wrap(adminRouter),
))
}
// EditBlog is the blog writing and editing page.
func (b *Blog) EditBlog(w http.ResponseWriter, r *http.Request) {
v := NewVars(map[interface{}]interface{}{
"preview": "",
})
post := posts.New()
if r.Method == http.MethodPost {
// Parse from form values.
post.LoadForm(r)
// Previewing, or submitting?
switch r.FormValue("submit") {
case "preview":
v.Data["preview"] = template.HTML(b.RenderMarkdown(post.Body))
case "submit":
if err := post.Validate(); err != nil {
v.Error = err
}
}
}
v.Data["post"] = post
b.RenderTemplate(w, r, "blog/edit", v)
}