Convert multiple pages into SPA
This commit is contained in:
@@ -117,7 +117,10 @@ func New(r *httprouter.Router, prefix string, conf Config) (wc *WebController) {
|
||||
r.Handle("DELETE", "/api/*p", proxyHandler)
|
||||
}
|
||||
|
||||
r.NotFound = http.HandlerFunc(wc.serveNotFound)
|
||||
r.NotFound = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
log.Info("running wrap handler")
|
||||
wc.serveTemplate("wrap", handlerOpts{})(w, r, nil)
|
||||
})
|
||||
|
||||
// Request method shorthands. These help keep the array of handlers aligned
|
||||
const PST, GET = "POST", "GET"
|
||||
@@ -128,14 +131,10 @@ func New(r *httprouter.Router, prefix string, conf Config) (wc *WebController) {
|
||||
path string // The URL path this API will be registered on
|
||||
handler httprouter.Handle // The function to run when this API is called
|
||||
}{
|
||||
// General navigation
|
||||
{GET, "" /* */, wc.serveLandingPage()},
|
||||
{GET, "home" /* */, wc.serveTemplate("home", handlerOpts{})},
|
||||
{GET, "api" /* */, wc.serveMarkdown("api.md", handlerOpts{})},
|
||||
{GET, "d/*path" /* */, wc.serveDirectory},
|
||||
{GET, "widgets" /* */, wc.serveTemplate("widgets", handlerOpts{})},
|
||||
{GET, "about" /* */, wc.serveMarkdown("about.md", handlerOpts{})},
|
||||
{GET, "appearance" /* */, wc.serveTemplate("appearance", handlerOpts{})},
|
||||
{GET, "hosting" /* */, wc.serveMarkdown("hosting.md", handlerOpts{})},
|
||||
{GET, "acknowledgements" /**/, wc.serveMarkdown("acknowledgements.md", handlerOpts{})},
|
||||
{GET, "business" /* */, wc.serveMarkdown("business.md", handlerOpts{})},
|
||||
@@ -144,23 +143,7 @@ func New(r *httprouter.Router, prefix string, conf Config) (wc *WebController) {
|
||||
{GET, "filesystem" /* */, wc.serveMarkdown("filesystem.md", handlerOpts{})},
|
||||
{GET, "100_gigabit_ethernet", wc.serveMarkdown("100_gigabit_ethernet.md", handlerOpts{NoExec: true})},
|
||||
{GET, "apps" /* */, wc.serveTemplate("apps", handlerOpts{})},
|
||||
{GET, "speedtest" /* */, wc.serveTemplate("speedtest", handlerOpts{})},
|
||||
{GET, "status" /* */, wc.serveTemplate("status", handlerOpts{})},
|
||||
|
||||
// User account pages
|
||||
{GET, "login" /* */, wc.serveTemplate("login", handlerOpts{NoEmbed: true})},
|
||||
{GET, "register" /* */, wc.serveTemplate("login", handlerOpts{NoEmbed: true})},
|
||||
{GET, "logout" /* */, wc.serveTemplate("logout", handlerOpts{Auth: true, NoEmbed: true})},
|
||||
{PST, "logout" /* */, wc.serveLogout},
|
||||
|
||||
// User account settings
|
||||
{GET, "user/*p", wc.serveTemplate("user_home", handlerOpts{Auth: true, NoEmbed: true})},
|
||||
|
||||
// Admin settings
|
||||
{GET, "admin", wc.serveTemplate("admin", handlerOpts{Auth: true})},
|
||||
{GET, "admin/*p", wc.serveTemplate("admin", handlerOpts{Auth: true})},
|
||||
|
||||
// Misc
|
||||
{GET, "theme.css", wc.themeHandler},
|
||||
} {
|
||||
r.Handle(h.method, prefix+"/"+h.path, middleware(h.handler))
|
||||
@@ -198,24 +181,8 @@ type handlerOpts struct {
|
||||
NoExec bool
|
||||
}
|
||||
|
||||
func (wc *WebController) serveLandingPage() httprouter.Handle {
|
||||
return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
||||
var td = wc.newTemplateData(w, r)
|
||||
var template = "home"
|
||||
|
||||
// If the user is logged in, run user home template
|
||||
if td.Authenticated {
|
||||
template = "user_home"
|
||||
}
|
||||
|
||||
if err := wc.templates.Run(w, r, template, td); err != nil && !util.IsNetError(err) {
|
||||
log.Error("Error executing template '%s': %s", template, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (wc *WebController) serveTemplate(tpl string, opts handlerOpts) httprouter.Handle {
|
||||
return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
||||
return func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
|
||||
if opts.NoEmbed {
|
||||
w.Header().Set("X-Frame-Options", "DENY")
|
||||
}
|
||||
@@ -314,22 +281,6 @@ func (wc *WebController) serveFile(path string) httprouter.Handle {
|
||||
}
|
||||
}
|
||||
|
||||
func (wc *WebController) serveForbidden(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("Forbidden: %s", r.URL)
|
||||
w.WriteHeader(http.StatusForbidden)
|
||||
wc.templates.Run(w, r, "403", wc.newTemplateData(w, r))
|
||||
}
|
||||
|
||||
func (wc *WebController) serveNotFound(w http.ResponseWriter, r *http.Request) {
|
||||
log.Debug("Not Found: %s", r.URL)
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
wc.templates.Run(w, r, "404", wc.newTemplateData(w, r))
|
||||
}
|
||||
func (wc *WebController) serveUnavailableForLegalReasons(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(http.StatusUnavailableForLegalReasons)
|
||||
wc.templates.Run(w, r, "451", wc.newTemplateData(w, r))
|
||||
}
|
||||
|
||||
func (wc *WebController) getAPIKey(r *http.Request) (key string, err error) {
|
||||
if cookie, err := r.Cookie("pd_auth_key"); err == nil {
|
||||
if len(cookie.Value) == 36 {
|
||||
|
Reference in New Issue
Block a user