feat: add a way to get routes by name, need to implement path params too
This commit is contained in:
parent
ae26700e59
commit
15abbde592
@ -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
24
app/controller/ctx.go
Normal 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
|
||||||
|
}
|
@ -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()...)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user