aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Kavon <hawk@alexkavon.com>2023-11-28 00:45:37 -0500
committerAlexander Kavon <hawk@alexkavon.com>2023-11-28 00:45:37 -0500
commit7d7059d53891bc1abb284d9b288505a5d406b307 (patch)
treef3ae7435a0a67ce1e5c939966738fea01bb9644e
parentd7d2b376405d91a201b8b830160458c5dd6df4a9 (diff)
build ui and render templates, build routes
-rw-r--r--src/auth/routes.go12
-rw-r--r--src/conf/conf.go8
-rw-r--r--src/main.go13
-rw-r--r--src/post/controller.go14
-rw-r--r--src/post/post_model.go15
-rw-r--r--src/server/router.go12
-rw-r--r--src/server/server.go16
-rw-r--r--src/server/ui.go46
-rw-r--r--src/user/routes.go7
-rw-r--r--ui/pages/users/create.tmpl.html20
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}}