package router import ( "html/template" "kontor-api-gin/assets" "kontor-api-gin/internal/globals" "kontor-api-gin/internal/handlers" "kontor-api-gin/internal/middleware" "kontor-api-gin/templates" "net/http" "log/slog" "github.com/gin-contrib/cors" "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" gin_slog "github.com/gin-contrib/slog" "github.com/gin-gonic/gin" ) func New(admin *handlers.AdminHandler, comics *handlers.ComicsHandler, media *handlers.MediaHandler, tysc *handlers.TyscHandler, webApp *handlers.WebAppHandler) *gin.Engine { router := gin.New() router.Use(gin.Recovery()) router.Use(gin_slog.SetLogger( gin_slog.WithSkipPath([]string{"/health", "/public/style/main.css"}), gin_slog.WithDefaultLevel(slog.LevelInfo), gin_slog.WithClientErrorLevel(slog.LevelInfo), gin_slog.WithServerErrorLevel(slog.LevelInfo), )) router.Use(cors.New(cors.Config{ AllowOrigins: []string{"https://app.example.com"}, AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE"}, AllowHeaders: []string{"Authorization", "Content-Type"}, AllowCredentials: true, })) // router.LoadHTMLGlob("templates/**/*.html") // router.Static("/public", "./assets") templ := template.Must(template.New("").ParseFS(templates.TemplateFiles, "layouts/*.html", "pages/*.html")) router.SetHTMLTemplate(templ) router.StaticFS("/public", http.FS(assets.StaticFiles)) router.Use(sessions.Sessions("session", cookie.NewStore(globals.Secret))) router.Use(middleware.RequestID([]string{"/health"})) router.GET("/health", handlers.Health) router.GET("/", handlers.Index) router.GET("/login", admin.AuthHandler.LoginPage) router.POST("/login", admin.AuthHandler.LoginPost) router.GET("/logout", admin.AuthHandler.LogoutPage) comic := router.Group("/comics") comic.GET("/comics", webApp.ComicHandler.ListPage) m := router.Group("/web") m.Use(middleware.AuthRequired()) m.GET("/actors", media.MediaActorHandler.ListPage) m.GET("/articles", media.MediaFileHandler.ListPage) m.GET("/media-files", media.MediaFileHandler.ListPage) m.GET("/files", media.MediaFileHandler.ListPage) m.GET("/media-lofis", media.MediaLoFiHandler.ListPage) m.GET("/lofis", media.MediaLoFiHandler.ListPage) api := router.Group("/api") api.POST("/login", admin.AuthHandler.Login) v1 := api.Group("/v1") { secured := v1.Group("") secured.Use(middleware.JWT(admin.Secret)) secured.GET("user/profiles", admin.ProfileHandler.List) secured.GET("user/permissions", admin.PermissionHandler.List) secured.GET("user/assignments", admin.AssignmentHandler.List) secured.GET("user/tokens", admin.TokenHandler.List) secured.GET("tysc/sports", tysc.SportHandler.List) secured.GET("tysc/sports/:id", tysc.SportHandler.Get) secured.GET("tysc/players", tysc.PlayerHandler.List) secured.GET("tysc/teams", tysc.TeamHandler.List) secured.GET("tysc/positions", tysc.PositionHandler.List) secured.GET("tysc/roosters", tysc.RoosterHandler.List) secured.GET("tysc/vendors", tysc.VendorHandler.List) secured.GET("tysc/cardsets", tysc.CardSetHandler.List) secured.GET("tysc/cards", tysc.CardHandler.List) secured.GET("/comics/comics", comics.ComicHandler.List) secured.GET("/comics/publishers", comics.PublisherHandler.List) secured.GET("/comics/artists", comics.ArtistHandler.List) secured.GET("/comics/issues", comics.IssueHandler.List) secured.GET("/comics/tradepaperbacks", comics.TradePaperbackHandler.List) secured.GET("/comics/worktypes", comics.WorkTypeHandler.List) secured.GET("/comics/volumes", comics.VolumeHandler.List) secured.GET("/comics/storyarcs", comics.StoryArcHandler.List) secured.GET("/comics/comicworks", comics.ComicworkHandler.List) secured.GET("/comics/issueworks", comics.IssueworkHandler.List) secured.GET("/media/files", media.MediaFileHandler.List) secured.GET("/media/videos", media.MediaVideoHandler.List) secured.GET("/media/lofis", media.MediaLoFiHandler.List) secured.GET("/media/actors", media.MediaActorHandler.List) } return router }