package main import ( "net/http" "git.haelnorr.com/h/golib/hws" "git.haelnorr.com/h/golib/hwsauth" "github.com/pkg/errors" "github.com/uptrace/bun" "git.haelnorr.com/h/oslstats/internal/auditlog" "git.haelnorr.com/h/oslstats/internal/config" "git.haelnorr.com/h/oslstats/internal/db" "git.haelnorr.com/h/oslstats/internal/discord" "git.haelnorr.com/h/oslstats/internal/handlers" "git.haelnorr.com/h/oslstats/internal/permissions" "git.haelnorr.com/h/oslstats/internal/rbac" "git.haelnorr.com/h/oslstats/internal/store" ) func addRoutes( s *hws.Server, staticFS *http.FileSystem, cfg *config.Config, conn *bun.DB, auth *hwsauth.Authenticator[*db.User, bun.Tx], store *store.Store, discordAPI *discord.APIClient, perms *rbac.Checker, audit *auditlog.Logger, ) error { // Create the routes pageroutes := []hws.Route{ { Path: "/permtest", Methods: []hws.Method{hws.MethodGET, hws.MethodPOST}, Handler: handlers.PermTester(s, conn), }, { Path: "/static/", Method: hws.MethodGET, Handler: http.StripPrefix("/static/", handlers.StaticFS(staticFS, s)), }, { Path: "/", Method: hws.MethodGET, Handler: handlers.Index(s), }, { Path: "/login", Methods: []hws.Method{hws.MethodGET, hws.MethodPOST}, Handler: auth.LogoutReq(handlers.Login(s, conn, cfg, store, discordAPI)), }, { Path: "/auth/callback", Method: hws.MethodGET, Handler: auth.LogoutReq(handlers.Callback(s, auth, conn, cfg, store, discordAPI)), }, { Path: "/register", Methods: []hws.Method{hws.MethodGET, hws.MethodPOST}, Handler: auth.LogoutReq(handlers.Register(s, auth, conn, cfg, store)), }, { Path: "/logout", Methods: []hws.Method{hws.MethodGET, hws.MethodPOST}, Handler: auth.LoginReq(handlers.Logout(s, auth, conn, discordAPI)), }, { Path: "/notification-tester", Methods: []hws.Method{hws.MethodGET, hws.MethodPOST}, Handler: perms.RequireAdmin(s)(handlers.NotifyTester(s)), }, { Path: "/seasons", Method: hws.MethodGET, Handler: handlers.SeasonsPage(s, conn), }, { Path: "/seasons", Method: hws.MethodPOST, Handler: handlers.SeasonsList(s, conn), }, { Path: "/seasons/new", Method: hws.MethodGET, Handler: perms.RequirePermission(s, permissions.SeasonsCreate)(handlers.NewSeason(s, conn)), }, { Path: "/seasons/new", Method: hws.MethodPOST, Handler: perms.RequirePermission(s, permissions.SeasonsCreate)(handlers.NewSeasonSubmit(s, conn, audit)), }, { Path: "/seasons/{season_short_name}", Method: hws.MethodGET, Handler: handlers.SeasonPage(s, conn), }, { Path: "/seasons/{season_short_name}/edit", Method: hws.MethodGET, Handler: perms.RequirePermission(s, permissions.SeasonsUpdate)(handlers.SeasonEditPage(s, conn)), }, { Path: "/seasons/{season_short_name}/edit", Method: hws.MethodPOST, Handler: perms.RequirePermission(s, permissions.SeasonsUpdate)(handlers.SeasonEditSubmit(s, conn, audit)), }, { Path: "/seasons/{season_short_name}/leagues/{league_short_name}", Method: hws.MethodPOST, Handler: perms.RequirePermission(s, permissions.SeasonsAddLeague)(handlers.SeasonAddLeague(s, conn, audit)), }, { Path: "/seasons/{season_short_name}/leagues/{league_short_name}", Method: hws.MethodDELETE, Handler: perms.RequirePermission(s, permissions.SeasonsRemoveLeague)(handlers.SeasonRemoveLeague(s, conn, audit)), }, { Path: "/leagues", Method: hws.MethodGET, Handler: handlers.LeaguesList(s, conn), }, { Path: "/leagues/new", Method: hws.MethodGET, Handler: perms.RequirePermission(s, permissions.LeaguesCreate)(handlers.NewLeague(s, conn)), }, { Path: "/leagues/new", Method: hws.MethodPOST, Handler: perms.RequirePermission(s, permissions.LeaguesCreate)(handlers.NewLeagueSubmit(s, conn, audit)), }, } htmxRoutes := []hws.Route{ { Path: "/htmx/isusernameunique", Method: hws.MethodPOST, Handler: handlers.IsUnique(s, conn, (*db.User)(nil), "username"), }, { Path: "/htmx/isseasonnameunique", Method: hws.MethodPOST, Handler: handlers.IsUnique(s, conn, (*db.Season)(nil), "name"), }, { Path: "/htmx/isseasonshortnameunique", Method: hws.MethodPOST, Handler: handlers.IsUnique(s, conn, (*db.Season)(nil), "short_name"), }, { Path: "/htmx/isleaguenameunique", Method: hws.MethodPOST, Handler: handlers.IsUnique(s, conn, (*db.League)(nil), "name"), }, { Path: "/htmx/isleagueshortnameunique", Method: hws.MethodPOST, Handler: handlers.IsUnique(s, conn, (*db.League)(nil), "short_name"), }, } wsRoutes := []hws.Route{ { Path: "/ws/notifications", Method: hws.MethodGET, Handler: handlers.NotificationWS(s, cfg), }, } // Admin routes adminRoutes := []hws.Route{ { // TODO: on page load, redirect to /admin/users Path: "/admin", Method: hws.MethodGET, Handler: perms.RequireAdmin(s)(handlers.AdminDashboard(s, conn)), }, { Path: "/admin/users", Method: hws.MethodPOST, Handler: perms.RequireAdmin(s)(handlers.AdminUsersList(s, conn)), }, } routes := append(pageroutes, htmxRoutes...) routes = append(routes, wsRoutes...) routes = append(routes, adminRoutes...) // Register the routes with the server err := s.AddRoutes(routes...) if err != nil { return errors.Wrap(err, "server.AddRoutes") } return nil }