diff options
| author | Alexander Kavon <hawk@alexkavon.com> | 2023-11-28 00:45:37 -0500 |
|---|---|---|
| committer | Alexander Kavon <hawk@alexkavon.com> | 2023-11-28 00:45:37 -0500 |
| commit | 7d7059d53891bc1abb284d9b288505a5d406b307 (patch) | |
| tree | f3ae7435a0a67ce1e5c939966738fea01bb9644e | |
| parent | d7d2b376405d91a201b8b830160458c5dd6df4a9 (diff) | |
build ui and render templates, build routes
| -rw-r--r-- | src/auth/routes.go | 12 | ||||
| -rw-r--r-- | src/conf/conf.go | 8 | ||||
| -rw-r--r-- | src/main.go | 13 | ||||
| -rw-r--r-- | src/post/controller.go | 14 | ||||
| -rw-r--r-- | src/post/post_model.go | 15 | ||||
| -rw-r--r-- | src/server/router.go | 12 | ||||
| -rw-r--r-- | src/server/server.go | 16 | ||||
| -rw-r--r-- | src/server/ui.go | 46 | ||||
| -rw-r--r-- | src/user/routes.go | 7 | ||||
| -rw-r--r-- | ui/pages/users/create.tmpl.html | 20 |
10 files changed, 99 insertions, 64 deletions
diff --git a/src/auth/routes.go b/src/auth/routes.go index 4f161de..5a28756 100644 --- a/src/auth/routes.go +++ b/src/auth/routes.go @@ -1,10 +1,7 @@ package auth import ( - "html/template" - "log" "net/http" - "os" "gitlab.com/alexkavon/newsstand/src/server" ) @@ -13,7 +10,7 @@ var Routes = server.Routes{ server.Route{ Name: "Register", Method: "GET", - Pattern: "/auth/register", + Path: "/auth/register", AuthRequired: false, HandlerFunc: Register, }, @@ -21,11 +18,6 @@ var Routes = server.Routes{ func Register(s *server.Server) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - cwd, err := os.Getwd() - if err != nil { - log.Fatal(err) - } - tmpl := template.Must(template.ParseFiles(cwd+"/ui/templates/base.tmpl.html", cwd+"/ui/pages/auth/register.tmpl.html")) - tmpl.ExecuteTemplate(w, "base", nil) + s.Ui.Render(w, "auth/register", nil) } } diff --git a/src/conf/conf.go b/src/conf/conf.go index 9cf24aa..7a6dcbf 100644 --- a/src/conf/conf.go +++ b/src/conf/conf.go @@ -22,9 +22,9 @@ type ( } Server struct { - Hostname string `toml:"hostname"` - Port string `toml:"port"` - TemplatePath string `toml:"template_path"` + Hostname string `toml:"hostname"` + Port string `toml:"port"` + UiPath string `toml:"ui_path"` } ) @@ -45,7 +45,7 @@ func NewConf() *Conf { filepath, Db{}, Server{ - TemplatePath: cwd + "/ui", + UiPath: cwd + "/ui", }, } _, err = toml.DecodeFile(filepath, &c) diff --git a/src/main.go b/src/main.go index fe6a51a..d3f6c03 100644 --- a/src/main.go +++ b/src/main.go @@ -5,6 +5,7 @@ import ( "gitlab.com/alexkavon/newsstand/src/conf" "gitlab.com/alexkavon/newsstand/src/db" "gitlab.com/alexkavon/newsstand/src/server" + "gitlab.com/alexkavon/newsstand/src/user" ) func main() { @@ -12,10 +13,14 @@ func main() { config := conf.NewConf() // connect database // start server - s := server.NewServer(config, server.NewRouter(config), db.NewDb(config)) - for _, route := range auth.Routes { - s.Router. - Method(route.Method, route.Pattern, route.HandlerFunc(s)) + s := server.NewServer(config, db.NewDb(config)) + s.BuildUi() + routers := []server.Routes{ + auth.Routes, + user.Routes, + } + for _, r := range routers { + s.RegisterRoutes(r) } s.Serve() } diff --git a/src/post/controller.go b/src/post/controller.go deleted file mode 100644 index 561e9b3..0000000 --- a/src/post/controller.go +++ /dev/null @@ -1,14 +0,0 @@ -package post - -import ( - "net/http" - - "github.com/go-chi/chi/v5" -) - -func Create() { - r := chi.NewRouter() - r.Get("/", func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte("Yello There!")) - }) -} diff --git a/src/post/post_model.go b/src/post/post_model.go deleted file mode 100644 index fc5dc2a..0000000 --- a/src/post/post_model.go +++ /dev/null @@ -1,15 +0,0 @@ -package post - -import ( - "time" - - "gitlab.com/alexkavon/newsstand/src/user" -) - -type Post struct { - Title string `json:"title"` - Body string `json:"body"` - User user.User `json:"user"` - Created time.Time `json:"created"` - Updated time.Time `json:"updated"` -} diff --git a/src/server/router.go b/src/server/router.go index 248a1d3..c8ca0fa 100644 --- a/src/server/router.go +++ b/src/server/router.go @@ -11,11 +11,13 @@ import ( type HandlerFunc func(s *Server) http.HandlerFunc type Route struct { - Name string - Method string - Pattern string - AuthRequired bool - HandlerFunc HandlerFunc + Name string + Method string + Path string + AuthRequired bool + HandlerFunc HandlerFunc + UiPageName string + UiTemplateName string } type Routes []Route diff --git a/src/server/server.go b/src/server/server.go index 495b140..9ba6104 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -15,12 +15,22 @@ type Server struct { Ui Ui } -func NewServer(config *conf.Conf, router *chi.Mux, db *sql.DB) *Server { +func NewServer(config *conf.Conf, db *sql.DB) *Server { return &Server{ - Router: router, + Router: NewRouter(config), Db: db, Config: config, - Ui: buildPages("my/path", "my/other/path"), + Ui: NewUi(config), + } +} + +func (s *Server) BuildUi() { + s.Ui.CompilePages(s.Config.Server.UiPath) +} + +func (s *Server) RegisterRoutes(routes Routes) { + for _, r := range routes { + s.Router.Method(r.Method, r.Path, r.HandlerFunc(s)) } } diff --git a/src/server/ui.go b/src/server/ui.go index f0b73ad..ce0ef01 100644 --- a/src/server/ui.go +++ b/src/server/ui.go @@ -2,20 +2,54 @@ package server import ( "html/template" + "log" "net/http" + "path/filepath" + "strings" + + "gitlab.com/alexkavon/newsstand/src/conf" ) type Ui struct { pages map[string]*template.Template } -func buildPages(paths ...string) Ui { - // walk template files with template.ParseFS (?) - +func NewUi(config *conf.Conf) Ui { return Ui{} } -func (ui *Ui) RenderPage(page string, w http.ResponseWriter) { - p := ui.pages[page] - p.ExecuteTemplate(w, "base", nil) +func (ui *Ui) CompilePages(uipath string) { + ui.pages = map[string]*template.Template{} + baseTmpl, err := template.ParseFiles(filepath.Join(uipath, "templates/base.tmpl.html")) + if err != nil { + log.Fatal(err) + } + pagesDir := filepath.Join(uipath, "pages") + tmplGlob := "**/*.tmpl.html" + + fileglob, err := filepath.Glob(filepath.Join(pagesDir, tmplGlob)) + if err != nil { + log.Fatal(err) + } + for _, file := range fileglob { + f := strings.TrimSuffix(file, ".tmpl.html") + tmplName, err := filepath.Rel(pagesDir, f) + if err != nil { + log.Fatal(err) + } + skeleton, err := baseTmpl.Clone() + if err != nil { + log.Fatal(err) + } + ui.pages[tmplName] = template.Must(skeleton.ParseFiles(file)) + log.Println(ui.pages[tmplName].DefinedTemplates()) + } +} + +func (ui *Ui) Render(w http.ResponseWriter, pageName string, data interface{}) { + p := ui.pages[pageName] + err := p.ExecuteTemplate(w, "base", data) + if err != nil { + log.Fatal(err) + } } diff --git a/src/user/routes.go b/src/user/routes.go index b265e67..791213d 100644 --- a/src/user/routes.go +++ b/src/user/routes.go @@ -9,15 +9,15 @@ import ( var Routes = server.Routes{ server.Route{ Name: "Create", - Method: "POST", - Pattern: "/users", + Method: "GET", + Path: "/users/create", AuthRequired: false, HandlerFunc: Create, }, server.Route{ Name: "Me", Method: "GET", - Pattern: "/users/me", + Path: "/users/me", AuthRequired: true, HandlerFunc: Show, }, @@ -25,6 +25,7 @@ var Routes = server.Routes{ func Create(s *server.Server) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + s.Ui.Render(w, "users/create", nil) } } diff --git a/ui/pages/users/create.tmpl.html b/ui/pages/users/create.tmpl.html new file mode 100644 index 0000000..381f6ea --- /dev/null +++ b/ui/pages/users/create.tmpl.html @@ -0,0 +1,20 @@ +{{define "title"}}Create User{{end}} + +{{define "main"}} + <h1>Registration</h1> + <form hx-post="/user"> + <label> + Email + <input type="email" placeholder="email" /> + </label> + <label> + Username + <input type="text" placeholder="username" /> + </label> + <label> + Password + <input type="password" placeholder="password" /> + </label> + <button type="submit">Register</button> + </form> +{{end}} |
