From f9b7e20841ad94d5cb326ee93f4f77a74d6fd48c Mon Sep 17 00:00:00 2001 From: Thomas Peetz Date: Sun, 1 Nov 2026 02:32:18 +0100 Subject: [PATCH] Fix Listign of MediaArticle --- kontor-gin/.goreleaser.yaml | 3 - kontor-gin/cmd/kontor/main.go | 2 +- kontor-gin/internal/config/config.go | 4 +- kontor-gin/internal/handlers/media_article.go | 134 ++++++++++++++++++ kontor-gin/internal/router/router.go | 17 ++- 5 files changed, 148 insertions(+), 12 deletions(-) create mode 100644 kontor-gin/internal/handlers/media_article.go diff --git a/kontor-gin/.goreleaser.yaml b/kontor-gin/.goreleaser.yaml index dd65f02..5c1c7fd 100644 --- a/kontor-gin/.goreleaser.yaml +++ b/kontor-gin/.goreleaser.yaml @@ -22,11 +22,8 @@ builds: goos: - linux - windows - - darwin goarch: - - arm64 - amd64 - - "386" archives: - formats: [tar.gz] diff --git a/kontor-gin/cmd/kontor/main.go b/kontor-gin/cmd/kontor/main.go index 99f8b53..24ffc6c 100644 --- a/kontor-gin/cmd/kontor/main.go +++ b/kontor-gin/cmd/kontor/main.go @@ -40,7 +40,7 @@ func main() { } r := router.New( - handlers.NewAdminHandler(db, []byte(viper.GetString("api_secret"))), + handlers.NewAdminHandler(db, config.ServerConfig.ApiSecret), handlers.NewBookshelfHandler(db), handlers.NewComicsHandler(db), handlers.NewMediaHandler(db), diff --git a/kontor-gin/internal/config/config.go b/kontor-gin/internal/config/config.go index 09a92d4..d82f340 100644 --- a/kontor-gin/internal/config/config.go +++ b/kontor-gin/internal/config/config.go @@ -11,6 +11,7 @@ import ( ) var ( + ApiSecret []byte CfgFile string Verbose int Overwrite bool @@ -79,7 +80,8 @@ type CliConfig struct { } type ServerConfiguration struct { - Server struct { + ApiSecret []byte `mapstructure:"api_secret" validate:"required"` + Server struct { Port int `mapstructure:"port" validate:"required"` Host string `mapstructure:"host"` } `mapstructure:"server"` diff --git a/kontor-gin/internal/handlers/media_article.go b/kontor-gin/internal/handlers/media_article.go new file mode 100644 index 0000000..11102e3 --- /dev/null +++ b/kontor-gin/internal/handlers/media_article.go @@ -0,0 +1,134 @@ +package handlers + +import ( + "kontor-api-gin/internal/globals" + "kontor-api-gin/internal/models" + "kontor-api-gin/internal/repository" + "kontor-api-gin/internal/service" + "net/http" + + "github.com/gin-contrib/sessions" + "github.com/gin-contrib/slog" + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +type MediaArticleHandler struct { + Service *service.MediaFileService +} + +func NewMediaArticleHandler(db *gorm.DB) *MediaArticleHandler { + mediaFileHandler := &MediaArticleHandler{ + Service: service.NewMediaFileService(repository.NewMediaFileRepository(db)), + } + return mediaFileHandler +} + +func (handler *MediaArticleHandler) List(c *gin.Context) { + logger := slog.Get(c) + logger.Info("MediaArticleHandler#List") + articles, err := handler.Service.List(c.Request.Context()) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + dtos := models.ConvertMediaArticlesToDtos(articles) + c.JSON(http.StatusOK, dtos) +} + +func (handler *MediaArticleHandler) Add(c *gin.Context) { + var input models.MediaFileAdd + + if err := c.ShouldBindJSON(&input); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + lofi, err := handler.Service.Add(c.Request.Context(), input.Url) + if err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "lofi not added"}) + return + } + c.JSON(http.StatusOK, lofi) +} + +func (handler *MediaArticleHandler) Delete(c *gin.Context) { + id := c.Param("id") + err := handler.Service.Delete(c.Request.Context(), id) + if err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "lofi not found"}) + return + } + c.JSON(http.StatusOK, gin.H{"ok": "true"}) +} + +func (handler *MediaArticleHandler) ListPage(c *gin.Context) { + session := sessions.Default(c) + user := session.Get(globals.UserKey) + files, err := handler.Service.List(c.Request.Context()) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + data := globals.GetDefaultValues(user, "MediaArticles...") + data["title"] = "Kontor MediaArticles" + data["media_links"] = files + data["MediaLinksUrl"] = globals.MediaVideoLink + c.HTML(http.StatusOK, "media_links", data) +} + +func (handler *MediaArticleHandler) EditPage(c *gin.Context) { + session := sessions.Default(c) + user := session.Get(globals.UserKey) + id := c.Param("id") + logger := slog.Get(c) + media_file, err := handler.Service.Get(c.Request.Context(), id) + if err != nil { + logger.Info("MediaArticleHandler#EditPage", "error", err.Error()) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + logger.Info("MediaArticleHandler#EditPage", "media_file", media_file) + data := globals.GetDefaultValues(user, "MediaFile Details...") + data["lofi"] = media_file + c.HTML(http.StatusOK, "lofi_detail", data) +} + +func (handler *MediaArticleHandler) UpdatePage(c *gin.Context) { + session := sessions.Default(c) + user := session.Get(globals.UserKey) + id := c.Param("id") + logger := slog.Get(c) + media_file, err := handler.Service.Get(c.Request.Context(), id) + if err != nil { + logger.Info("MediaArticleHandler#UpdatePage", "error", err.Error()) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + var form models.MediaFileForm + if err := c.ShouldBind(&form); err != nil { + logger.Info("MediaArticleHandler#UpdatePage", "error", err.Error()) + data := globals.GetDefaultValues(user, "MediaFile Details...") + data["Form"] = form + data["Errors"] = err.Error() + c.HTML(http.StatusBadRequest, "lofi_detail", data) + return + } + logger.Info("MediaArticleHandler#UpdatePage", "media_file", media_file) + //handler.Service.Update(c.Request.Context(), form.ConvertFormToMediaFileDTO()) + c.Redirect(http.StatusFound, globals.MediaFileLink) +} + +func (handler *MediaArticleHandler) DeletePage(c *gin.Context) { + //session := sessions.Default(c) + //user := session.Get(globals.UserKey) + id := c.Param("id") + logger := slog.Get(c) + err := handler.Service.Delete(c.Request.Context(), id) + if err != nil { + logger.Info("MediaArticleHandler#DeletePage", "error", err.Error()) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + logger.Info("MediaArticleHandler#DeletePage", "lofi", id) + c.Redirect(http.StatusFound, globals.MediaFileLink) +} diff --git a/kontor-gin/internal/router/router.go b/kontor-gin/internal/router/router.go index 95920a2..d361439 100644 --- a/kontor-gin/internal/router/router.go +++ b/kontor-gin/internal/router/router.go @@ -21,12 +21,15 @@ import ( 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_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(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"}, @@ -60,7 +63,7 @@ func New(admin *handlers.AdminHandler, bookshelf *handlers.BookshelfHandler, com m.GET("/actors", media.MediaActorHandler.ListPage) m.GET("/actors/:id", media.MediaActorHandler.EditPage) m.POST("/actors/:id", media.MediaActorHandler.UpdatePage) - m.GET("/articles", media.MediaFileHandler.ListPage) + 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)