package router import ( "html/template" "io" "kontor-api-echo/assets" "kontor-api-echo/internal/config" "kontor-api-echo/internal/handlers" "kontor-api-echo/templates" "log/slog" "os" echojwt "github.com/labstack/echo-jwt/v5" "github.com/labstack/echo/v5" "github.com/labstack/echo/v5/middleware" ) type Template struct { templates *template.Template } func (t *Template) Render(c *echo.Context, w io.Writer, name string, data any) error { return t.templates.ExecuteTemplate(w, name, data) } func New(admin *handlers.AdminHandler, media *handlers.MediaHandler) *echo.Echo { e := echo.New() logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) e.Use(middleware.Recover()) e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{ LogURI: true, LogStatus: true, HandleError: true, Skipper: func(c *echo.Context) bool { // Skip health check endpoint return c.Path() == "/health" }, LogValuesFunc: func(c *echo.Context, v middleware.RequestLoggerValues) error { if v.Error != nil { logger.Error("request failed", "uri", v.URI, "status", v.Status, "error", v.Error) return nil } logger.Info("request", "uri", v.URI, "status", v.Status) return nil }, })) e.StaticFS("/public", echo.MustSubFS(assets.StaticFiles, "assets")) templ := template.Must(template.New("").ParseFS(templates.TemplateFiles, "layouts/*.html", "pages/*.html")) t := &Template{ templates: templ, } e.Renderer = t e.GET("/health", handlers.Health) e.GET("/", handlers.Index) e.GET("/login", admin.AuthHandler.LoginPage) e.POST("/login", admin.AuthHandler.LoginPost) e.GET("/logout", admin.AuthHandler.LogoutPage) mediaGroup := e.Group("/media") //mediaGroup.Use(middleware.AuthRequired()) mediaGroup.GET("/actors", media.MediaActorHandler.ListPage) mediaGroup.GET("/actors/:id", media.MediaActorHandler.EditPage) mediaGroup.POST("/actors/:id", media.MediaActorHandler.UpdatePage) mediaGroup.GET("/articles", media.MediaArticleHandler.ListPage) mediaGroup.GET("/files", media.MediaFileHandler.ListPage) mediaGroup.GET("/files/edit/:id", media.MediaFileHandler.EditPage) mediaGroup.POST("/files/edit/:id", media.MediaFileHandler.UpdatePage) mediaGroup.GET("/files/delete/:id", media.MediaFileHandler.DeletePage) mediaGroup.GET("/videos", media.MediaVideoHandler.ListPage) mediaGroup.GET("/videos/edit/:id", media.MediaVideoHandler.EditPage) mediaGroup.POST("/videos/edit/:id", media.MediaVideoHandler.UpdatePage) mediaGroup.GET("/videos/delete/:id", media.MediaVideoHandler.DeletePage) mediaGroup.GET("/lofis", media.MediaLoFiHandler.ListPage) mediaGroup.GET("/lofis/edit", media.MediaLoFiHandler.EditPage) mediaGroup.GET("/lofis/edit/:id", media.MediaLoFiHandler.EditPage) mediaGroup.POST("/lofis/edit/:id", media.MediaLoFiHandler.UpdatePage) mediaGroup.GET("/lofis/review/:id", media.MediaLoFiHandler.ChangeReviewPage) mediaGroup.GET("/lofis/delete/:id", media.MediaLoFiHandler.DeletePage) mediaGroup.GET("/musics", media.MediaMusicHandler.ListPage) mediaGroup.GET("/musics/edit/:id", media.MediaMusicHandler.EditPage) mediaGroup.POST("/musics/edit/:id", media.MediaMusicHandler.UpdatePage) mediaGroup.GET("/musics/delete/:id", media.MediaMusicHandler.DeletePage) api := e.Group("/api") api.POST("/login", admin.AuthHandler.Login) v1 := api.Group("/v1") { secured := v1.Group("") secured.Use(echojwt.WithConfig(echojwt.Config{SigningKey: config.ServerConfig.ApiSecret})) //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 e }