blog/core/app.go

96 lines
2.4 KiB
Go
Raw Normal View History

2017-10-08 04:48:58 +00:00
package core
import (
"net/http"
"path/filepath"
2017-10-08 04:48:58 +00:00
"github.com/gorilla/mux"
"github.com/gorilla/sessions"
"github.com/kirsle/blog/core/jsondb"
"github.com/kirsle/blog/core/models/posts"
"github.com/kirsle/blog/core/models/settings"
"github.com/kirsle/blog/core/models/users"
"github.com/shurcooL/github_flavored_markdown/gfmstyle"
2017-10-08 04:48:58 +00:00
"github.com/urfave/negroni"
)
// Blog is the root application object that maintains the app configuration
// and helper objects.
type Blog struct {
Debug bool
2017-10-08 04:48:58 +00:00
// DocumentRoot is the core static files root; UserRoot masks over it.
DocumentRoot string
UserRoot string
DB *jsondb.DB
// Helper singletone
Posts *PostHelper
2017-10-08 04:48:58 +00:00
// Web app objects.
n *negroni.Negroni // Negroni middleware manager
r *mux.Router // Router
store sessions.Store
2017-10-08 04:48:58 +00:00
}
// New initializes the Blog application.
func New(documentRoot, userRoot string) *Blog {
blog := &Blog{
DocumentRoot: documentRoot,
UserRoot: userRoot,
DB: jsondb.New(filepath.Join(userRoot, ".private")),
}
blog.Posts = InitPostHelper(blog)
// Load the site config, or start with defaults if not found.
settings.DB = blog.DB
config, err := settings.Load()
if err != nil {
config = settings.Defaults()
2017-10-08 04:48:58 +00:00
}
// Initialize the session cookie store.
blog.store = sessions.NewCookieStore([]byte(config.Security.SecretKey))
users.HashCost = config.Security.HashCost
// Initialize the rest of the models.
posts.DB = blog.DB
users.DB = blog.DB
// Initialize the router.
2017-10-08 04:48:58 +00:00
r := mux.NewRouter()
2017-11-15 14:55:15 +00:00
r.HandleFunc("/initial-setup", blog.SetupHandler)
r.HandleFunc("/login", blog.LoginHandler)
r.HandleFunc("/logout", blog.LogoutHandler)
2017-11-15 14:55:15 +00:00
blog.AdminRoutes(r)
2017-11-20 05:49:19 +00:00
blog.BlogRoutes(r)
2017-11-15 14:55:15 +00:00
// GitHub Flavored Markdown CSS.
r.Handle("/css/gfm.css", http.StripPrefix("/css", http.FileServer(gfmstyle.Assets)))
2017-11-15 14:55:15 +00:00
r.PathPrefix("/").HandlerFunc(blog.PageHandler)
2017-10-08 04:48:58 +00:00
r.NotFoundHandler = http.HandlerFunc(blog.PageHandler)
n := negroni.New(
negroni.NewRecovery(),
negroni.NewLogger(),
2017-11-15 14:55:15 +00:00
negroni.HandlerFunc(blog.SessionLoader),
negroni.HandlerFunc(blog.CSRFMiddleware),
2017-11-15 14:55:15 +00:00
negroni.HandlerFunc(blog.AuthMiddleware),
2017-10-08 04:48:58 +00:00
)
n.UseHandler(r)
2017-11-15 14:55:15 +00:00
// Keep references handy elsewhere in the app.
blog.n = n
blog.r = r
2017-10-08 04:48:58 +00:00
return blog
}
// ListenAndServe begins listening on the given bind address.
func (b *Blog) ListenAndServe(address string) {
log.Info("Listening on %s", address)
http.ListenAndServe(address, b.n)
}