kontor-echo: setup project to show homepage
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
Gitea Actions Demo / build-and-test (push) Failing after 11s

This commit is contained in:
Thomas Peetz
2026-11-09 17:02:59 +01:00
parent 074abd3c85
commit debdf3d0b0
63 changed files with 2411 additions and 485 deletions
+130 -10
View File
@@ -1,34 +1,154 @@
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()
skipper := func(c *echo.Context) bool {
// Skip health check endpoint
return c.Request().URL.Path == "/health"
}
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
e.Use(middleware.Recover())
e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{
LogStatus: true,
LogURI: true,
LogStatus: true,
HandleError: true,
Skipper: skipper,
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 {
slog.Info("REQUEST", "uri", v.URI, "status", v.Status)
} else {
slog.Info("REQUEST-ERROR", "uri", v.URI, "status", v.Status, "err", v.Error.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
}