feat: add a way to get routes by name, need to implement path params too

This commit is contained in:
Mark Bailey 2024-11-26 08:51:17 -05:00
parent ae26700e59
commit 15abbde592
8 changed files with 78 additions and 20 deletions

View File

@ -19,16 +19,17 @@ type IController interface {
Post(w http.ResponseWriter, r *http.Request) error Post(w http.ResponseWriter, r *http.Request) error
Patch(w http.ResponseWriter, r *http.Request) error Patch(w http.ResponseWriter, r *http.Request) error
Connect(w http.ResponseWriter, r *http.Request) error Connect(w http.ResponseWriter, r *http.Request) error
Init(session.IManager, database.IDB, logger.ILogger) IController Init(session.IManager, database.IDB, logger.ILogger, IControllerCtx) IController
} }
type Controller struct { type Controller struct {
Session session.IManager Session session.IManager
Db database.IDB Db database.IDB
Logger logger.ILogger Logger logger.ILogger
Ctx IControllerCtx
} }
func (c Controller) Init(s session.IManager, d database.IDB, l logger.ILogger) IController { func (c Controller) Init(s session.IManager, d database.IDB, l logger.ILogger, ctx IControllerCtx) IController {
return nil return nil
} }

24
app/controller/ctx.go Normal file
View File

@ -0,0 +1,24 @@
package controller
import werror "git.markbailey.dev/cerbervs/ptpp/lib/error"
type IRouterCtx interface {
GetRouteByName(string) (string, error)
}
type IControllerCtx interface {
GetRouteByName(string) string
}
type ControllerCtx struct {
RouterCtx IRouterCtx
}
func (c *ControllerCtx) GetRouteByName(name string) string {
path, err := c.RouterCtx.GetRouteByName(name)
if err != nil {
panic(werror.Wrap(err, "Error getting route by name"))
}
return path
}

View File

@ -34,7 +34,8 @@ type Router struct {
} }
func (r Router) HandleAllRequestMethods(route Route) { func (r Router) HandleAllRequestMethods(route Route) {
c := route.Controller.Init(sess, database.ChooseDB(), logger.NewCompositeLogger()) ctx := &controller.ControllerCtx{RouterCtx: r}
c := route.Controller.Init(sess, database.ChooseDB(), logger.NewCompositeLogger(), ctx)
r.Mux.Handle("GET "+r.BasePath+route.Path, handler.HandlerFunc(c.Get)) r.Mux.Handle("GET "+r.BasePath+route.Path, handler.HandlerFunc(c.Get))
r.Mux.Handle("OPTIONS "+r.BasePath+route.Path, handler.HandlerFunc(c.Options)) r.Mux.Handle("OPTIONS "+r.BasePath+route.Path, handler.HandlerFunc(c.Options))
r.Mux.Handle("TRACE "+r.BasePath+route.Path, handler.HandlerFunc(c.Trace)) r.Mux.Handle("TRACE "+r.BasePath+route.Path, handler.HandlerFunc(c.Trace))
@ -87,9 +88,12 @@ func (r Router) GetFlatRouteList() []RouteMapping {
var routes []RouteMapping var routes []RouteMapping
for _, route := range r.Routes { for _, route := range r.Routes {
routes = append(routes, RouteMapping{Path: route.Path, Name: route.Name}) routes = append(routes, RouteMapping{Path: r.BasePath+route.Path, Name: route.Name})
} }
if r.SubRouters == nil {
return routes
}
for _, subRouter := range *r.SubRouters { for _, subRouter := range *r.SubRouters {
routes = append(routes, subRouter.GetFlatRouteList()...) routes = append(routes, subRouter.GetFlatRouteList()...)
} }

View File

@ -17,10 +17,11 @@ type IndexHandler struct {
controller.Controller controller.Controller
} }
func (h IndexHandler) Init(s session.IManager, d database.IDB, l logger.ILogger) controller.IController { func (h IndexHandler) Init(s session.IManager, d database.IDB, l logger.ILogger, ctx controller.IControllerCtx) controller.IController {
h.Logger = l h.Logger = l
h.Db = d h.Db = d
h.Session = s h.Session = s
h.Ctx = ctx
return h return h
} }

View File

@ -17,10 +17,11 @@ type HomePageController struct {
controller.Controller controller.Controller
} }
func (c HomePageController) Init(s session.IManager, d database.IDB, l logger.ILogger) controller.IController { func (c HomePageController) Init(s session.IManager, d database.IDB, l logger.ILogger, ctx controller.IControllerCtx) controller.IController {
c.Logger = l c.Logger = l
c.Db = d c.Db = d
c.Session = s c.Session = s
c.Ctx = ctx
return c return c
} }
@ -36,7 +37,7 @@ func (h HomePageController) Get(w http.ResponseWriter, r *http.Request) error {
return nil return nil
} }
if err := homepage.Homepage(os.Getenv("$HTMX_APP_ENV")).Render(context.Background(), w); err != nil { if err := homepage.Homepage(os.Getenv("$HTMX_APP_ENV"), h.Ctx).Render(context.Background(), w); err != nil {
h.Logger.Error(h.Logger.Wrap(err, "Error rendering homepage")) h.Logger.Error(h.Logger.Wrap(err, "Error rendering homepage"))
return err return err
} }

View File

@ -20,10 +20,11 @@ type SignUpHandler struct {
controller.Controller controller.Controller
} }
func (c SignUpHandler) Init(s session.IManager, d database.IDB, l logger.ILogger) controller.IController { func (c SignUpHandler) Init(s session.IManager, d database.IDB, l logger.ILogger, ctx controller.IControllerCtx) controller.IController {
c.Logger = l c.Logger = l
c.Db = d c.Db = d
c.Session = s c.Session = s
c.Ctx = ctx
return c return c
} }
@ -32,7 +33,7 @@ type SignInHandler struct {
controller.Controller controller.Controller
} }
func (c SignInHandler) Init(s session.IManager, d database.IDB, l logger.ILogger) controller.IController { func (c SignInHandler) Init(s session.IManager, d database.IDB, l logger.ILogger, ctx controller.IControllerCtx) controller.IController {
c.Logger = l c.Logger = l
c.Db = d c.Db = d
c.Session = s c.Session = s
@ -44,10 +45,11 @@ type PopulateHandler struct {
controller.Controller controller.Controller
} }
func (c PopulateHandler) Init(s session.IManager, d database.IDB, l logger.ILogger) controller.IController { func (c PopulateHandler) Init(s session.IManager, d database.IDB, l logger.ILogger, ctx controller.IControllerCtx) controller.IController {
c.Logger = l c.Logger = l
c.Db = d c.Db = d
c.Session = s c.Session = s
c.Ctx = ctx
return c return c
} }
@ -56,10 +58,11 @@ type SignOutHandler struct {
controller.Controller controller.Controller
} }
func (c SignOutHandler) Init(s session.IManager, d database.IDB, l logger.ILogger) controller.IController { func (c SignOutHandler) Init(s session.IManager, d database.IDB, l logger.ILogger, ctx controller.IControllerCtx) controller.IController {
c.Logger = l c.Logger = l
c.Db = d c.Db = d
c.Session = s c.Session = s
c.Ctx = ctx
return c return c
} }
@ -67,7 +70,7 @@ func (c SignOutHandler) Init(s session.IManager, d database.IDB, l logger.ILogge
func (c PopulateHandler) Get(w http.ResponseWriter, r *http.Request) error { func (c PopulateHandler) Get(w http.ResponseWriter, r *http.Request) error {
existingOrg, err := c.Db.Repo().FindOrganizationByName("CerbervsSoft") existingOrg, err := c.Db.Repo().FindOrganizationByName("CerbervsSoft")
if existingOrg != nil && err == nil { if existingOrg != nil && err == nil {
return util.Redirect(w, r, "/signup", http.StatusSeeOther, false) return util.Redirect(w, r, c.Ctx.GetRouteByName("app.user.sign_up"), http.StatusSeeOther, false)
} }
authToken, err := util.CreateTokenForUser("CerbervsSoft") authToken, err := util.CreateTokenForUser("CerbervsSoft")
@ -90,7 +93,7 @@ func (c PopulateHandler) Get(w http.ResponseWriter, r *http.Request) error {
return err return err
} }
return util.Redirect(w, r, "/signup", http.StatusSeeOther, false) return util.Redirect(w, r, c.Ctx.GetRouteByName("app.user.sign_up"), http.StatusSeeOther, false)
} }
type UserSignInForm struct { type UserSignInForm struct {

View File

@ -1,20 +1,23 @@
package homepage package homepage
import "git.markbailey.dev/cerbervs/ptpp/view/layout" import (
"git.markbailey.dev/cerbervs/ptpp/view/layout"
"git.markbailey.dev/cerbervs/ptpp/app/controller"
)
templ Homepage(env string) { templ Homepage(env string, context controller.IControllerCtx) {
@layout.Layout() { @layout.Layout() {
<div class="h-screen flex flex-col items-center justify-evenly text-blue-400 text-2xl"> <div class="h-screen flex flex-col items-center justify-evenly text-blue-400 text-2xl">
<div> <div>
Welcome to the homepage Welcome to the homepage
</div> </div>
<div> <div>
<a href="/sign-up"> <a href={ templ.SafeURL(context.GetRouteByName("app.user.sign_up")) }>
<button class="text-gray-400 text-md border-black rounded-lg bg-gray-300 p-2"> <button class="text-gray-400 text-md border-black rounded-lg bg-gray-300 p-2">
Sign Up Sign Up
</button> </button>
</a> </a>
<a href="/sign-in"> <a href={ templ.SafeURL(context.GetRouteByName("app.user.sign_in")) }>
<button class="text-gray-400 text-md border-black rounded-lg bg-gray-300 p-2"> <button class="text-gray-400 text-md border-black rounded-lg bg-gray-300 p-2">
Sign In Sign In
</button> </button>

View File

@ -8,9 +8,12 @@ package homepage
import "github.com/a-h/templ" import "github.com/a-h/templ"
import templruntime "github.com/a-h/templ/runtime" import templruntime "github.com/a-h/templ/runtime"
import "git.markbailey.dev/cerbervs/ptpp/view/layout" import (
"git.markbailey.dev/cerbervs/ptpp/app/controller"
"git.markbailey.dev/cerbervs/ptpp/view/layout"
)
func Homepage(env string) templ.Component { func Homepage(env string, context controller.IControllerCtx) templ.Component {
return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
@ -43,7 +46,25 @@ func Homepage(env string) templ.Component {
}() }()
} }
ctx = templ.InitializeContext(ctx) ctx = templ.InitializeContext(ctx)
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"h-screen flex flex-col items-center justify-evenly text-blue-400 text-2xl\"><div>Welcome to the homepage</div><div><a href=\"/sign-up\"><button class=\"text-gray-400 text-md border-black rounded-lg bg-gray-300 p-2\">Sign Up</button></a> <a href=\"/sign-in\"><button class=\"text-gray-400 text-md border-black rounded-lg bg-gray-300 p-2\">Sign In</button></a></div></div>") _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("<div class=\"h-screen flex flex-col items-center justify-evenly text-blue-400 text-2xl\"><div>Welcome to the homepage</div><div><a href=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var3 templ.SafeURL = templ.SafeURL(context.GetRouteByName("app.user.sign_up"))
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var3)))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><button class=\"text-gray-400 text-md border-black rounded-lg bg-gray-300 p-2\">Sign Up</button></a> <a href=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var4 templ.SafeURL = templ.SafeURL(context.GetRouteByName("app.user.sign_in"))
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(string(templ_7745c5c3_Var4)))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><button class=\"text-gray-400 text-md border-black rounded-lg bg-gray-300 p-2\">Sign In</button></a></div></div>")
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err return templ_7745c5c3_Err
} }