diff --git a/controllers/listcontroller.go b/controllers/listcontroller.go index 3e21940..a581b6b 100644 --- a/controllers/listcontroller.go +++ b/controllers/listcontroller.go @@ -2,6 +2,10 @@ package controllers import ( "net/http" + "strings" + + "git.aiterp.net/AiteRP/aitestory/view" + "git.aiterp.net/AiteRP/aitestory/viewmodel" "git.aiterp.net/gisle/wrouter" "git.aiterp.net/gisle/wrouter/auth" @@ -11,11 +15,14 @@ import ( var ListController = wrouter.Router{} func listIndex(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool { - if req.Method != "GET" { + if req.Method != "GET" || strings.LastIndex(req.URL.Path, "/") >= len(path) { return false } - // tags := strings.Split(path, ",") + vm := viewmodel.PageList{} + vm.Setup(user) + + view.Render(w, "index", 200, vm) return true } diff --git a/debug b/debug new file mode 100755 index 0000000..32d5133 Binary files /dev/null and b/debug differ diff --git a/main.go b/main.go index d3103f9..31ae977 100644 --- a/main.go +++ b/main.go @@ -1,5 +1,16 @@ package main +import "git.aiterp.net/AiteRP/aitestory/server" +import "git.aiterp.net/AiteRP/aitestory/controllers" +import "git.aiterp.net/gisle/wrouter/auth" + func main() { - -} \ No newline at end of file + router := &server.Main.Router + + auth.Register(&controllers.WikiAthenticator{}) + router.Mount("/", &controllers.ListController) + + router.Static("/ui/", server.Main.Config.Server.UI) + + server.Main.Start() +} diff --git a/server/server.go b/server/server.go index 2082303..5a1a55f 100644 --- a/server/server.go +++ b/server/server.go @@ -25,6 +25,15 @@ type server struct { Config Config } +func (srv *server) Start() { + log.Println(fmt.Sprintf("Running: http://%s:%d", srv.Config.Server.Host, srv.Config.Server.Port)) + + _, err := srv.Router.Listen(srv.Config.Server.Host, srv.Config.Server.Port) + if err != nil { + log.Fatalf("Failed to init listen: %s", err) + } +} + // Main is the main instance var Main = server{} diff --git a/view/renderer.go b/view/renderer.go new file mode 100644 index 0000000..5c284e1 --- /dev/null +++ b/view/renderer.go @@ -0,0 +1,59 @@ +package view + +import ( + "errors" + "html/template" + "io" + "log" + "net/http" + "os" + "path" + + "git.aiterp.net/gisle/wrouter/response" +) + +var wd, _ = os.Getwd() +var rootPath = path.Join(wd, "./view/templates/") +var cache = make(map[string]*template.Template) + +// Register registers a template and compiles it for rendering. This should be done +// in the beginning since an error will terminate the server +func Register(name string, base string) { + tmpl, err := template.New(name).ParseFiles(path.Join(rootPath, name+".tmpl"), path.Join(rootPath, base+".tmpl")) + if err != nil { + log.Fatalf("Failed to register %s: %s", name, err) + } + + cache[name] = tmpl +} + +// Render renders a template with the name it was registered with, and with the +// view model. The view model is expected to be the correct model from the viewmodel +// package +func Render(w http.ResponseWriter, name string, status int, viewModel interface{}) { + tmpl, ok := cache[name] + if !ok { + response.Text(w, 500, "Template not found: "+name) + return + } + + w.WriteHeader(status) + err := tmpl.ExecuteTemplate(w, "base", viewModel) + if err != nil { + log.Println("Template error:", err.Error()) + } +} + +// Run runs the template to a simple io.Writer. It's made for testing +func Run(w io.Writer, name string, viewModel interface{}) error { + tmpl, ok := cache[name] + if !ok { + return errors.New("template not found") + } + + return tmpl.ExecuteTemplate(w, "base", viewModel) +} + +func init() { + Register("index", "base/default") +} diff --git a/view/templates/fragments/layout.tmpl b/view/templates/base/default.tmpl similarity index 55% rename from view/templates/fragments/layout.tmpl rename to view/templates/base/default.tmpl index 2a2d867..2ae70c4 100644 --- a/view/templates/fragments/layout.tmpl +++ b/view/templates/base/default.tmpl @@ -1,10 +1,10 @@ -{{define "layout"}} +{{define "base"}}
-