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, bookshelf *handlers.BookshelfHandler, comics *handlers.ComicsHandler, media *handlers.MediaHandler, tysc *handlers.TyscHandler) *gin.Engine { router := gin.New() router.Use(gin.Recovery()) router.Use(gin.LoggerWithConfig(gin.LoggerConfig{ SkipPaths: []string{"/health", "/public/style/main.css"}, })) //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", comics.ComicHandler.ListPage) comic.GET("/publishers", comics.PublisherHandler.ListPage) m := router.Group("/media") m.Use(middleware.AuthRequired()) m.GET("/actors", media.MediaActorHandler.ListPage) m.GET("/actors/:id", media.MediaActorHandler.EditPage) m.POST("/actors/:id", media.MediaActorHandler.UpdatePage) m.GET("/articles", media.MediaArticleHandler.ListPage) m.GET("/files", media.MediaFileHandler.ListPage) m.GET("/files/edit/:id", media.MediaFileHandler.EditPage) m.POST("/files/edit/:id", media.MediaFileHandler.UpdatePage) m.GET("/files/delete/:id", media.MediaFileHandler.DeletePage) m.GET("/videos", media.MediaVideoHandler.ListPage) m.GET("/videos/edit/:id", media.MediaVideoHandler.EditPage) m.POST("/videos/edit/:id", media.MediaVideoHandler.UpdatePage) m.GET("/videos/delete/:id", media.MediaVideoHandler.DeletePage) m.GET("/lofis", media.MediaLoFiHandler.ListPage) m.GET("/lofis/edit", media.MediaLoFiHandler.EditPage) m.GET("/lofis/edit/:id", media.MediaLoFiHandler.EditPage) m.POST("/lofis/edit/:id", media.MediaLoFiHandler.UpdatePage) m.GET("/lofis/review/:id", media.MediaLoFiHandler.ChangeReviewPage) m.GET("/lofis/delete/:id", media.MediaLoFiHandler.DeletePage) m.GET("/musics", media.MediaMusicHandler.ListPage) m.GET("/musics/edit/:id", media.MediaMusicHandler.EditPage) m.POST("/musics/edit/:id", media.MediaMusicHandler.UpdatePage) m.GET("/musics/delete/:id", media.MediaMusicHandler.DeletePage) 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("admin/mailaccounts", admin.MailAccountHandler.List) secured.GET("user/profiles", admin.ProfileHandler.List) secured.GET("user/permissions", admin.PermissionHandler.List) secured.GET("user/assignments", admin.AssignmentHandler.List) secured.GET("user/mails", admin.MailHandler.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("bookshelf/articles", bookshelf.ArticleHandler.List) secured.GET("bookshelf/publishers", bookshelf.BookshelfPublisherHandler.List) secured.GET("bookshelf/books", bookshelf.BookHandler.List) secured.GET("bookshelf/authors", bookshelf.AuthorHandler.List) secured.GET("bookshelf/articleauthors", bookshelf.ArticleAuthorHandler.List) secured.GET("bookshelf/bookauthors", bookshelf.BookAuthorHandler.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) mediaGroup := secured.Group("media") mediaGroup.GET("/files", media.MediaFileHandler.List) mediaGroup.POST("/files", media.MediaFileHandler.Add) mediaGroup.GET("/videos", media.MediaVideoHandler.List) mediaGroup.GET("/lofis", media.MediaLoFiHandler.List) mediaGroup.POST("/lofis", media.MediaLoFiHandler.Add) mediaGroup.GET("/lofis/:id", media.MediaLoFiHandler.Get) mediaGroup.POST("/lofis/:id", media.MediaLoFiHandler.Update) mediaGroup.DELETE("/lofis/:id", media.MediaLoFiHandler.Delete) mediaGroup.POST("/musics", media.MediaMusicHandler.Add) mediaGroup.GET("/musics/:id", media.MediaMusicHandler.Get) mediaGroup.POST("/musics/:id", media.MediaMusicHandler.Update) mediaGroup.DELETE("/musics/:id", media.MediaMusicHandler.Delete) mediaGroup.GET("/actors", media.MediaActorHandler.List) mediaGroup.POST("/actors", media.MediaActorHandler.Add) mediaGroup.GET("/actors/:id", media.MediaActorHandler.Get) mediaGroup.DELETE("/actors/:id", media.MediaActorHandler.Delete) mediaGroup.GET("/actorfiles", media.MediaActorFileHandler.List) mediaGroup.POST("/actorfiles", media.MediaActorFileHandler.Add) mediaGroup.DELETE("/actorfiles", media.MediaActorFileHandler.Delete) } return router }