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"}} - { .ViewTitle } - { .SiteTitle } + {{ .ViewTitle }} @@ -32,27 +32,10 @@ diff --git a/view/templates/index.tmpl b/view/templates/index.tmpl new file mode 100644 index 0000000..33d8105 --- /dev/null +++ b/view/templates/index.tmpl @@ -0,0 +1,13 @@ +{{ define "content" }} +
+

Hello, World

+
+{{ end }} + +{{ define "menu" }} +

Aite RP

+{{ end }} + +{{ define "head" }} + +{{ end }} \ No newline at end of file diff --git a/viewmodel/base.go b/viewmodel/base.go index 7412a65..ecd3174 100644 --- a/viewmodel/base.go +++ b/viewmodel/base.go @@ -2,6 +2,7 @@ package viewmodel import ( "fmt" + "strings" "git.aiterp.net/AiteRP/aitestory/server" "git.aiterp.net/gisle/wrouter/auth" @@ -9,6 +10,7 @@ import ( // Base is the basic information used to render the page type Base struct { + UserID string UserName string UserRole string UserLoggedIn bool @@ -16,11 +18,12 @@ type Base struct { } // InitBase initializes the base of the viewmodel -func (base *Base) InitBase(user *auth.User, viewTitle string) { +func (base *Base) setupBase(user *auth.User, viewTitle string) { if user != nil { - base.UserName = user.ID + base.UserID = user.ID + base.UserName = strings.SplitN(user.ID, ":", 2)[1] base.UserRole = user.Data["role"] - base.UserLoggedIn = false + base.UserLoggedIn = true } base.ViewTitle = fmt.Sprintf("%s - %s", viewTitle, server.Main.Config.View.Title) diff --git a/viewmodel/pagelist.go b/viewmodel/pagelist.go new file mode 100644 index 0000000..1c57351 --- /dev/null +++ b/viewmodel/pagelist.go @@ -0,0 +1,21 @@ +package viewmodel + +import ( + "git.aiterp.net/AiteRP/aitestory/model" + "git.aiterp.net/gisle/wrouter/auth" +) + +// PageList is a view model for rendering the front page +type PageList struct { + Base + Headers []model.Header + Category string + ActiveTags []model.Tag + FavoriteTags []model.Tag +} + +// Setup sets up the page model and the base, and should +// be run after the details have been filled in. +func (pl *PageList) Setup(user *auth.User) { + pl.setupBase(user, "Index") +}