diff --git a/kontor-gin/internal/api/data.go b/kontor-gin/internal/api/data.go index 11fdc48..c0cd1dd 100644 --- a/kontor-gin/internal/api/data.go +++ b/kontor-gin/internal/api/data.go @@ -1,12 +1,10 @@ package api import ( - "encoding/json" "fmt" "kontor-api-gin/internal/config" "kontor-api-gin/internal/models" "log/slog" - "os" "resty.dev/v3" ) @@ -220,21 +218,6 @@ func UpdateData(target config.Server, path string, v any) { PostJSON(client, target, token, config.Config.ApiVersion, path, v, &result) } -func WriteJson(data *ExportData, fileName string) error { - jsonData, err := json.MarshalIndent(data, "", " ") - if err != nil { - slog.Info("JSON MarshalIndent failed", "Error:", err) - return err - } - // Write bytes to file - err = os.WriteFile(fileName, jsonData, 0644) - if err != nil { - slog.Info("Error writing file:", "Error", err) - return err - } - return nil -} - func GetJSON(client *resty.Client, token string, server config.Server, path string, v any) { url := fmt.Sprintf("%s/%s/%s", server.Url, config.Config.ApiVersion, path) if config.Verbose > 2 { diff --git a/kontor-gin/internal/api/file.go b/kontor-gin/internal/api/file.go new file mode 100644 index 0000000..1f0a758 --- /dev/null +++ b/kontor-gin/internal/api/file.go @@ -0,0 +1,22 @@ +package api + +import ( + "encoding/json" + "log/slog" + "os" +) + +func WriteJson(data *ExportData, fileName string) error { + jsonData, err := json.MarshalIndent(data, "", " ") + if err != nil { + slog.Info("JSON MarshalIndent failed", "Error:", err) + return err + } + // Write bytes to file + err = os.WriteFile(fileName, jsonData, 0644) + if err != nil { + slog.Info("Error writing file:", "Error", err) + return err + } + return nil +} diff --git a/kontor-gin/internal/cmd/export.go b/kontor-gin/internal/cmd/export.go index 21b0685..1e9d7ce 100644 --- a/kontor-gin/internal/cmd/export.go +++ b/kontor-gin/internal/cmd/export.go @@ -7,12 +7,9 @@ import ( "log/slog" "github.com/spf13/cobra" - "github.com/spf13/viper" "resty.dev/v3" ) -var filename string - var exportCmd = &cobra.Command{ Use: "export", Short: "Export Kontor Database", @@ -28,7 +25,7 @@ var exportCmd = &cobra.Command{ localServer := config.Config.Server[config.ServerName] export, _ := api.GetData(localServer, config.Config.ApiVersion) - err := api.WriteJson(export, filename) + err := api.WriteJson(export, config.FileName) if err != nil { slog.Info("WriteJon failed", "Error:", err) } @@ -38,9 +35,4 @@ var exportCmd = &cobra.Command{ func init() { rootCmd.AddCommand(exportCmd) - - exportCmd.PersistentFlags().StringVarP(&filename, "file", "f", "/home/tpeetz/.sync/media/data-gin.json", "Filename to store data") - viper.BindPFlag("file", exportCmd.PersistentFlags().Lookup("file")) - exportCmd.PersistentFlags().StringVarP(&config.Config.ApiVersion, "api", "a", "api/v1", "API Version") - viper.BindPFlag("api", exportCmd.PersistentFlags().Lookup("api")) } diff --git a/kontor-gin/internal/cmd/root.go b/kontor-gin/internal/cmd/root.go index 67e472b..b223706 100644 --- a/kontor-gin/internal/cmd/root.go +++ b/kontor-gin/internal/cmd/root.go @@ -35,10 +35,21 @@ func init() { rootCmd.PersistentFlags().StringVarP(&config.CfgFile, "config", "c", "/home/tpeetz/.config/kli.yaml", "config file") rootCmd.PersistentFlags().CountVarP(&config.Verbose, "verbose", "v", "increase verbosity (-v, -vv, -vvv)") viper.BindPFlag("config", rootCmd.PersistentFlags().Lookup("config")) + exportCmd.Flags().StringVarP(&config.ServerName, "servername", "s", "local", "Define server to get Kontor items") updateTitleCmd.Flags().StringVarP(&config.ServerName, "servername", "s", "local", "Define server to get Kontor items") addLinksCmd.Flags().StringVarP(&config.ServerName, "servername", "s", "local", "Define server to get Kontor items") + addLinksCmd.Flags().Var(&config.Mediatype, "mediatype", "MediaType: allowed values are: media, videos, lofi") + + exportCmd.PersistentFlags().StringVarP(&config.FileName, "file", "f", "/home/tpeetz/.sync/media/data-gin.json", "Filename to store data") + importCmd.PersistentFlags().StringVarP(&config.FileName, "file", "f", "/home/tpeetz/.sync/media/data-gin.json", "Filename to import data from") + viper.BindPFlag("file", exportCmd.PersistentFlags().Lookup("file")) + + exportCmd.PersistentFlags().StringVarP(&config.Config.ApiVersion, "api", "a", "api/v1", "API Version") + viper.BindPFlag("api", exportCmd.PersistentFlags().Lookup("api")) + viper.BindPFlag("server", exportCmd.PersistentFlags().Lookup("server")) + cobra.OnInitialize(config.InitCliConfig) } diff --git a/kontor-gin/internal/config/config.go b/kontor-gin/internal/config/config.go index 763197a..409d836 100644 --- a/kontor-gin/internal/config/config.go +++ b/kontor-gin/internal/config/config.go @@ -10,14 +10,25 @@ import ( "github.com/spf13/viper" ) -type MediaType string +var ( + CfgFile string + Verbose int + Overwrite bool + ServerName string + Mediatype MediaType + Config CliConfig + DryRun bool + FileName string +) const ( mediaTypeMedia MediaType = "media" mediaTypeVideo MediaType = "video" - mediaTypeLofi MediaType = "lofi" + mediaTypeLofi MediaType = "lofi" ) +type MediaType string + func (e *MediaType) String() string { return string(*e) } @@ -37,23 +48,13 @@ func (e *MediaType) Type() string { } func myEnumCompletion(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - return []string{ - "media\thelp text for media", - "video\thelp text for video", - "lofi\thelp text for lofi", - }, cobra.ShellCompDirectiveDefault + return []string{ + "media\thelp text for media", + "video\thelp text for video", + "lofi\thelp text for lofi", + }, cobra.ShellCompDirectiveDefault } -var ( - CfgFile string - Verbose int - Overwrite bool - ServerName string - Mediatype MediaType - Config CliConfig - DryRun bool -) - type Server struct { Url string `mapstructure:"url"` Username string `mapstructure:"username"` diff --git a/kontor-gin/internal/handlers/media_file.go b/kontor-gin/internal/handlers/media_file.go index b1453cb..9964bbb 100644 --- a/kontor-gin/internal/handlers/media_file.go +++ b/kontor-gin/internal/handlers/media_file.go @@ -69,11 +69,65 @@ func (handler *MediaFileHandler) ListPage(c *gin.Context) { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - c.HTML(http.StatusOK, "mediafiles", gin.H{ - "title": "Kontor MediaFiles", - "version": "0.4.0", - "message": "MediaFiles...", - "mediafiles": files, - "user": user, - }) + data := globals.GetDefaultValues(user, "MediaFiles...") + data["title"] = "Kontor MediaFiles" + data["mediafiles"] = files + c.HTML(http.StatusOK, "mediafiles", data) +} + +func (handler *MediaFileHandler) 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("MediaLoFiHandler#EditPage", "error", err.Error()) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + logger.Info("MediaLoFiHandler#EditPage", "media_file", media_file) + data := globals.GetDefaultValues(user, "MediaFile Details...") + data["lofi"] = media_file + c.HTML(http.StatusOK, "lofi_detail", data) +} + +func (handler *MediaFileHandler) 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("MediaFileHandler#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("MediaFileHandler#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("MediaFileHandler#UpdatePage", "media_file", media_file) + //handler.Service.Update(c.Request.Context(), form.ConvertFormToMediaFileDTO()) + c.Redirect(http.StatusFound, "web/media-files") +} + +func (handler *MediaFileHandler) 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("MediaFileHandler#DeletePage", "error", err.Error()) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + logger.Info("MediaFileHandler#DeletePage", "lofi", id) + c.Redirect(http.StatusFound, "web/media-files") } diff --git a/kontor-gin/internal/handlers/mediavideo.go b/kontor-gin/internal/handlers/mediavideo.go index c5eb338..21d0612 100644 --- a/kontor-gin/internal/handlers/mediavideo.go +++ b/kontor-gin/internal/handlers/mediavideo.go @@ -43,7 +43,7 @@ func (handler *MediaVideoHandler) ListPage(c *gin.Context) { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - logger.Info("MediaLoFiHandler#ListPage", "videos count", len(videos)) + logger.Info("MediaVideoHandler#ListPage", "videos count", len(videos)) data := globals.GetDefaultValues(user, "MediaVideos...") data["title"] = "Kontor MediaVideos" data["mediavideos"] = videos diff --git a/kontor-gin/internal/middleware/request_id.go b/kontor-gin/internal/middleware/request_id.go index 0429547..3019bc8 100644 --- a/kontor-gin/internal/middleware/request_id.go +++ b/kontor-gin/internal/middleware/request_id.go @@ -16,7 +16,7 @@ func RequestID(skipPaths []string) gin.HandlerFunc { id = uuid.NewString() } if len(skipPaths) > 0 && !slices.Contains(skipPaths, c.Request.URL.Path) { - logger.Info("RequestID", "id", id) + logger.Info("RequestID", "id", id, "path", c.Request.URL.Path) } c.Set("request_id", id) c.Writer.Header().Set("X-Request-ID", id) diff --git a/kontor-gin/internal/models/media_file.go b/kontor-gin/internal/models/media_file.go index 9baf6bc..fbfc850 100644 --- a/kontor-gin/internal/models/media_file.go +++ b/kontor-gin/internal/models/media_file.go @@ -30,6 +30,16 @@ type MediaFileAdd struct { Url string `json:"url"` } +type MediaFileForm struct { + Title string `form:"title" binding:"required"` + Url string `form:"url" binding:"required"` +} + +func (form *MediaFileForm) ConvertFormToMediaFileDTO() MediaFileDTO { + media_file := MediaFileDTO{} + return media_file +} + type MediaFileDTO struct { ID string `json:"id" binding:"required"` CreatedAt helpers.KontorTime `json:"created_date"` diff --git a/kontor-gin/internal/router/router.go b/kontor-gin/internal/router/router.go index 1ecfe16..65babbe 100644 --- a/kontor-gin/internal/router/router.go +++ b/kontor-gin/internal/router/router.go @@ -63,6 +63,8 @@ func New(admin *handlers.AdminHandler, bookshelf *handlers.BookshelfHandler, com m.POST("/actors/:id/edit", media.MediaActorHandler.UpdatePage) m.GET("/articles", media.MediaFileHandler.ListPage) m.GET("/media-files", media.MediaFileHandler.ListPage) + m.GET("/media-files/:id", media.MediaFileHandler.EditPage) + m.POST("/media-files/:id", media.MediaFileHandler.UpdatePage) m.GET("/media-videos", media.MediaVideoHandler.ListPage) m.GET("/media-lofis", media.MediaLoFiHandler.ListPage) m.GET("/media-lofis/:id/edit", media.MediaLoFiHandler.EditPage) diff --git a/kontor-gin/templates/pages/mediavideos.html b/kontor-gin/templates/pages/mediavideos.html new file mode 100644 index 0000000..88ce5e8 --- /dev/null +++ b/kontor-gin/templates/pages/mediavideos.html @@ -0,0 +1,71 @@ +{{ define "mediavideos" }} + + + {{ template "head" . }} + + + {{ template "navbar" . }} +
+
+
+ + + + + +
+
+
+
+ + + + + + + + + + + + {{ range .mediavideos }} + + + {{ if .WebLink }} + + {{ else }} + + {{ end }} + + + + + + {{ end }} + +
TitleWeblinkReviewDownloadActions
{{.Title}}{{.WebLink}}no link + {{ if .Review }} + true + {{ else }} + true + {{ end }} + + {{ if .ShouldDownload }} + true + {{ else }} + true + {{ end }} + EditDelete
+
+
+
+ {{ template "footer" . }} + + +{{ end }}