diff --git a/common/errors.go b/common/errors.go index f0485dff..dd496282 100644 --- a/common/errors.go +++ b/common/errors.go @@ -129,7 +129,6 @@ func errorHeader(w http.ResponseWriter, user User, title string) *Header { header := DefaultHeader(w, user) header.Title = title header.Zone = "error" - prepResources(&user, header, header.Theme) return header } @@ -304,10 +303,7 @@ func LoginRequiredJS(w http.ResponseWriter, r *http.Request, user User) RouteErr func SecurityError(w http.ResponseWriter, r *http.Request, user User) RouteError { w.WriteHeader(403) pi := ErrorPage{errorHeader(w, user, phrases.GetErrorPhrase("security_error_title")), phrases.GetErrorPhrase("security_error_body")} - if RunPreRenderHook("pre_render_security_error", w, r, &user, &pi) { - return nil - } - err := pi.Header.Theme.RunTmpl("error", pi, w) + err := RenderTemplateAlias("error", "security_error", w, r, pi.Header, pi) if err != nil { LogError(err) } @@ -381,12 +377,11 @@ func writeJsonError(errmsg string, w http.ResponseWriter) { } func handleErrorTemplate(w http.ResponseWriter, r *http.Request, pi ErrorPage) { - // TODO: What to do about this hook? - if RunPreRenderHook("pre_render_error", w, r, &pi.Header.CurrentUser, &pi) { - return - } - err := pi.Header.Theme.RunTmpl("error", pi, w) + err := RenderTemplateAlias("error", "error", w, r, pi.Header, pi) if err != nil { LogError(err) } } + +// Alias of routes.renderTemplate +var RenderTemplateAlias func(tmplName string, hookName string, w http.ResponseWriter, r *http.Request, header *Header, pi interface{}) error \ No newline at end of file diff --git a/common/routes_common.go b/common/routes_common.go index c235d903..b4a1fbee 100644 --- a/common/routes_common.go +++ b/common/routes_common.go @@ -222,11 +222,11 @@ func userCheck(w http.ResponseWriter, r *http.Request, user *User) (header *Head header.StartedAt = time.Now() } - prepResources(user,header,theme) + //PrepResources(user,header,theme) return header, nil } -func prepResources(user *User, header *Header, theme *Theme) { +func PrepResources(user *User, header *Header, theme *Theme) { header.AddSheet(theme.Name + "/main.css") if len(theme.Resources) > 0 { diff --git a/extend/guilds/lib/guilds.go b/extend/guilds/lib/guilds.go index 77342aba..95747cec 100644 --- a/extend/guilds/lib/guilds.go +++ b/extend/guilds/lib/guilds.go @@ -11,6 +11,7 @@ import ( "strings" c "github.com/Azareal/Gosora/common" + "github.com/Azareal/Gosora/routes" ) // A blank list to fill out that parameter in Page for routes which don't use it @@ -189,11 +190,7 @@ func RouteGuildList(w http.ResponseWriter, r *http.Request, user c.User) c.Route } pi := ListPage{"Guild List", user, header, guildList} - err = header.Theme.RunTmpl("guilds_guild_list", pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return routes.RenderTemplate("guilds_guild_list", w, r, header, pi) } func MiddleViewGuild(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { @@ -231,12 +228,7 @@ func RouteCreateGuild(w http.ResponseWriter, r *http.Request, user c.User) c.Rou } CommonAreaWidgets(header) - pi := c.Page{header, tList, nil} - err := header.Theme.RunTmpl("guilds_create_guild", pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return routes.RenderTemplate("guilds_create_guild", w, r, header, c.Page{header, tList, nil}) } func RouteCreateGuildSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { @@ -384,7 +376,7 @@ func PreRenderViewForum(w http.ResponseWriter, r *http.Request, user *c.User, da guildItem := guildData.(*Guild) guildpi := Page{pi.Title, pi.Header, pi.ItemList, pi.Forum, guildItem, pi.Page, pi.LastPage} - err := header.Theme.RunTmpl("guilds_view_guild", guildpi, w) + err := routes.RenderTemplate("guilds_view_guild", w, r, header, guildpi) if err != nil { c.LogError(err) return false diff --git a/main.go b/main.go index 70e18256..fd9e43dc 100644 --- a/main.go +++ b/main.go @@ -27,6 +27,7 @@ import ( c "github.com/Azareal/Gosora/common" "github.com/Azareal/Gosora/common/counters" "github.com/Azareal/Gosora/common/phrases" + "github.com/Azareal/Gosora/routes" "github.com/Azareal/Gosora/query_gen" "github.com/fsnotify/fsnotify" "github.com/pkg/errors" @@ -41,6 +42,11 @@ type Globs struct { stmts *Stmts } +// Temporary alias for renderTemplate +func init() { + c.RenderTemplateAlias = routes.RenderTemplate +} + // Experimenting with a new error package here to try to reduce the amount of debugging we have to do // TODO: Dynamically register these items to avoid maintaining as much code here? func afterDBInit() (err error) { diff --git a/routes/account.go b/routes/account.go index c34d7ace..e7b84aea 100644 --- a/routes/account.go +++ b/routes/account.go @@ -28,8 +28,7 @@ func AccountLogin(w http.ResponseWriter, r *http.Request, user c.User, header *c return c.LocalError("You're already logged in.", w, r, user) } header.Title = phrases.GetTitlePhrase("login") - pi := c.Page{header, tList, nil} - return renderTemplate("login", w, r, header, pi) + return renderTemplate("login", w, r, header, c.Page{header, tList, nil}) } // TODO: Log failed attempted logins? @@ -160,16 +159,8 @@ func AccountLoginMFAVerify(w http.ResponseWriter, r *http.Request, user c.User, if !mfaVerifySession(provSession, signedSession, uid) { return c.LocalError("Invalid session", w, r, user) } - - pi := c.Page{header, tList, nil} - if c.RunPreRenderHook("pre_render_login_mfa_verify", w, r, &user, &pi) { - return nil - } - err = header.Theme.RunTmpl("login_mfa_verify", pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + + return renderTemplate("login_mfa_verify", w, r, header, c.Page{header, tList, nil}) } func AccountLoginMFAVerifySubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { @@ -202,8 +193,7 @@ func AccountRegister(w http.ResponseWriter, r *http.Request, user c.User, header } header.Title = phrases.GetTitlePhrase("register") header.LooseCSP = true - pi := c.Page{header, tList, nil} - return renderTemplate("register", w, r, header, pi) + return renderTemplate("register", w, r, header, c.Page{header, tList, nil}) } func isNumeric(data string) (numeric bool) { @@ -392,8 +382,7 @@ func AccountEdit(w http.ResponseWriter, r *http.Request, user c.User, header *c. //edit_password func AccountEditPassword(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError { accountEditHead("account_password", w, r, &user, header) - pi := c.Page{header, tList, nil} - return renderTemplate("account_own_edit_password", w, r, header, pi) + return renderTemplate("account_own_edit_password", w, r, header, c.Page{header, tList, nil}) } // TODO: Require re-authentication if the user hasn't logged in in a while @@ -759,8 +748,7 @@ func LevelList(w http.ResponseWriter, r *http.Request, user c.User, header *c.He levels[i] = c.LevelListItem{i, iScore, status, perc * 2} } - pi := c.LevelListPage{header, levels[1:]} - return renderTemplate("level_list", w, r, header, pi) + return renderTemplate("level_list", w, r, header, c.LevelListPage{header, levels[1:]}) } func Alerts(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError { diff --git a/routes/common.go b/routes/common.go index 02206004..d0b100dd 100644 --- a/routes/common.go +++ b/routes/common.go @@ -76,6 +76,20 @@ func doPush(w http.ResponseWriter, header *c.Header) { } func renderTemplate(tmplName string, w http.ResponseWriter, r *http.Request, header *c.Header, pi interface{}) c.RouteError { + return renderTemplate2(tmplName, tmplName, w, r, header, pi) +} + +func renderTemplate2(tmplName string, hookName string, w http.ResponseWriter, r *http.Request, header *c.Header, pi interface{}) c.RouteError { + err := renderTemplate3(tmplName, tmplName, w, r, header, pi) + if err != nil { + return c.InternalError(err, w, r) + } + return nil +} + +func renderTemplate3(tmplName string, hookName string, w http.ResponseWriter, r *http.Request, header *c.Header, pi interface{}) error { + c.PrepResources(&header.CurrentUser, header, header.Theme) + if header.CurrentUser.Loggedin { header.MetaDesc = "" header.OGDesc = "" @@ -98,12 +112,11 @@ func renderTemplate(tmplName string, w http.ResponseWriter, r *http.Request, hea if header.CurrentUser.IsAdmin { header.Elapsed1 = time.Since(header.StartedAt).String() } - if c.RunPreRenderHook("pre_render_"+tmplName, w, r, &header.CurrentUser, pi) { + if c.RunPreRenderHook("pre_render_"+hookName, w, r, &header.CurrentUser, pi) { return nil } - err := header.Theme.RunTmpl(tmplName, pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return header.Theme.RunTmpl(tmplName, pi, w) } + +// TODO: Rename renderTemplate to RenderTemplate instead of using this hack to avoid breaking things +var RenderTemplate = renderTemplate3 diff --git a/routes/forum_list.go b/routes/forum_list.go index 292bbb76..8d9c0d84 100644 --- a/routes/forum_list.go +++ b/routes/forum_list.go @@ -49,6 +49,5 @@ func ForumList(w http.ResponseWriter, r *http.Request, user c.User, header *c.He } } - pi := c.ForumsPage{header, forumList} - return renderTemplate("forums", w, r, header, pi) + return renderTemplate("forums", w, r, header, c.ForumsPage{header, forumList}) } diff --git a/routes/misc.go b/routes/misc.go index 22702440..016c5d9c 100644 --- a/routes/misc.go +++ b/routes/misc.go @@ -50,8 +50,7 @@ func StaticFile(w http.ResponseWriter, r *http.Request) { func Overview(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError { header.Title = phrases.GetTitlePhrase("overview") header.Zone = "overview" - pi := c.Page{header, tList, nil} - return renderTemplate("overview", w, r, header, pi) + return renderTemplate("overview", w, r, header, c.Page{header, tList, nil}) } func CustomPage(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header, name string) c.RouteError { @@ -60,8 +59,7 @@ func CustomPage(w http.ResponseWriter, r *http.Request, user c.User, header *c.H page, err := c.Pages.GetByName(name) if err == nil { header.Title = page.Title - pi := c.CustomPagePage{header, page} - return renderTemplate("custom_page", w, r, header, pi) + return renderTemplate("custom_page", w, r, header, c.CustomPagePage{header, page}) } else if err != sql.ErrNoRows { return c.InternalError(err, w, r) } @@ -72,16 +70,8 @@ func CustomPage(w http.ResponseWriter, r *http.Request, user c.User, header *c.H } header.Title = phrases.GetTitlePhrase("page") - pi := c.Page{header, tList, nil} // TODO: Pass the page name to the pre-render hook? - if c.RunPreRenderHook("pre_render_tmpl_page", w, r, &user, &pi) { - return nil - } - err = header.Theme.RunTmpl("page_"+name, pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return renderTemplate2("page_"+name, "tmpl_page", w, r, header, c.Page{header, tList, nil}) } // TODO: Set the cookie domain diff --git a/routes/moderate.go b/routes/moderate.go index 785b7dde..88ca40ed 100644 --- a/routes/moderate.go +++ b/routes/moderate.go @@ -26,14 +26,5 @@ func IPSearch(w http.ResponseWriter, r *http.Request, user c.User, header *c.Hea if err != nil { return c.InternalError(err, w, r) } - - pi := c.IPSearchPage{header, userList, ip} - if c.RunPreRenderHook("pre_render_ip_search", w, r, &user, &pi) { - return nil - } - err = header.Theme.RunTmpl("ip_search", pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return renderTemplate("ip_search", w, r, header, c.IPSearchPage{header, userList, ip}) }