diff --git a/app/controller/controller.go b/app/controller/controller.go index 0ab4550..ed44cd7 100644 --- a/app/controller/controller.go +++ b/app/controller/controller.go @@ -19,16 +19,17 @@ type IController interface { Post(w http.ResponseWriter, r *http.Request) error Patch(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 { Session session.IManager Db database.IDB 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 } diff --git a/app/controller/ctx.go b/app/controller/ctx.go new file mode 100644 index 0000000..7d56d2c --- /dev/null +++ b/app/controller/ctx.go @@ -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 +} diff --git a/app/routing/router.go b/app/routing/router.go index 132b614..a283172 100644 --- a/app/routing/router.go +++ b/app/routing/router.go @@ -34,7 +34,8 @@ type Router struct { } 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("OPTIONS "+r.BasePath+route.Path, handler.HandlerFunc(c.Options)) r.Mux.Handle("TRACE "+r.BasePath+route.Path, handler.HandlerFunc(c.Trace)) @@ -87,9 +88,12 @@ func (r Router) GetFlatRouteList() []RouteMapping { var routes []RouteMapping 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 { routes = append(routes, subRouter.GetFlatRouteList()...) } diff --git a/handlers/admin/index.go b/handlers/admin/index.go index eb0015c..bdbf73a 100644 --- a/handlers/admin/index.go +++ b/handlers/admin/index.go @@ -17,10 +17,11 @@ type IndexHandler struct { 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.Db = d h.Session = s + h.Ctx = ctx return h } diff --git a/handlers/shared/homepage.go b/handlers/shared/homepage.go index 5aa9a52..e10665b 100644 --- a/handlers/shared/homepage.go +++ b/handlers/shared/homepage.go @@ -17,10 +17,11 @@ type HomePageController struct { 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.Db = d c.Session = s + c.Ctx = ctx return c } @@ -36,7 +37,7 @@ func (h HomePageController) Get(w http.ResponseWriter, r *http.Request) error { 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")) return err } diff --git a/handlers/shared/user.go b/handlers/shared/user.go index a6d178c..ca38284 100644 --- a/handlers/shared/user.go +++ b/handlers/shared/user.go @@ -20,10 +20,11 @@ type SignUpHandler struct { 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.Db = d c.Session = s + c.Ctx = ctx return c } @@ -32,7 +33,7 @@ type SignInHandler struct { 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.Db = d c.Session = s @@ -44,10 +45,11 @@ type PopulateHandler struct { 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.Db = d c.Session = s + c.Ctx = ctx return c } @@ -56,10 +58,11 @@ type SignOutHandler struct { 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.Db = d c.Session = s + c.Ctx = ctx 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 { existingOrg, err := c.Db.Repo().FindOrganizationByName("CerbervsSoft") 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") @@ -90,7 +93,7 @@ func (c PopulateHandler) Get(w http.ResponseWriter, r *http.Request) error { 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 { diff --git a/view/homepage/homepage.templ b/view/homepage/homepage.templ index c69f411..42bdfb4 100644 --- a/view/homepage/homepage.templ +++ b/view/homepage/homepage.templ @@ -1,20 +1,23 @@ 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() {
Welcome to the homepage
- + - + diff --git a/view/homepage/homepage_templ.go b/view/homepage/homepage_templ.go index 5f60a1b..1b0d8eb 100644 --- a/view/homepage/homepage_templ.go +++ b/view/homepage/homepage_templ.go @@ -8,9 +8,12 @@ package homepage import "github.com/a-h/templ" 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) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -43,7 +46,25 @@ func Homepage(env string) templ.Component { }() } ctx = templ.InitializeContext(ctx) - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
Welcome to the homepage
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err }