diff --git a/kontor-gin/internal/api/data.go b/kontor-gin/internal/api/data.go index a960184..f84b1e9 100644 --- a/kontor-gin/internal/api/data.go +++ b/kontor-gin/internal/api/data.go @@ -185,6 +185,28 @@ func GetData(server config.Server, apiVersion string) (data *ExportData, err err return &export, nil } +func DeleteData(target config.Server, path, id string) { + url := fmt.Sprintf("%s/%s/%s/%s", target.Url, config.Config.ApiVersion, path, id) + client := resty.New() + client.SetLoggerWarnLevel(true) + token := GetToken(client, target) + _, err := client.R(). + SetAuthToken(token). + SetHeader("Accept", "application/json"). + Delete(url) + if err != nil { + slog.Info(url, "error", err.Error()) + } +} + +func UpdateData(target config.Server, path string, v any) { + client := resty.New() + client.SetLoggerWarnLevel(true) + token := GetToken(client, target) + var result 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 { diff --git a/kontor-gin/internal/cmd/sync.go b/kontor-gin/internal/cmd/sync.go index 7f4efb4..0887105 100644 --- a/kontor-gin/internal/cmd/sync.go +++ b/kontor-gin/internal/cmd/sync.go @@ -33,7 +33,7 @@ var syncCmd = &cobra.Command{ slog.Info("iterate sourceData", "table", "Player", "count", len(sourceData.Player)) sourceData.Player.CompareIds(&targetData.Player) slog.Info("iterate sourceData", "table", "MediaLofi", "count source", len(sourceData.MediaLoFi), "count target", len(targetData.MediaLoFi)) - missing, obsolete := sourceData.MediaLoFi.CompareIds(&targetData.MediaLoFi) + missing, obsolete, changed := sourceData.MediaLoFi.CompareIds(&targetData.MediaLoFi) for _, lofi_id := range missing { if !config.DryRun { slog.Info("add MediaLofi", "id", lofi_id) @@ -42,6 +42,13 @@ var syncCmd = &cobra.Command{ for _, lofi_id := range obsolete { if !config.DryRun { slog.Info("delete MediaLofi", "id", lofi_id) + api.DeleteData(localServer, "media/lofis", lofi_id) + } + } + for _, lofi_id := range changed { + if !config.DryRun { + slog.Info("update MediaLofi", "id", lofi_id) + // api.UpdateData(localServer, "media/lofis", sourceData.MediaLoFi.GetMediaLofi(lofi_id)) } } }, diff --git a/kontor-gin/internal/handlers/media_lofi.go b/kontor-gin/internal/handlers/media_lofi.go index c772bb1..a9f0d99 100644 --- a/kontor-gin/internal/handlers/media_lofi.go +++ b/kontor-gin/internal/handlers/media_lofi.go @@ -88,11 +88,14 @@ func (handler *MediaLoFiHandler) Delete(c *gin.Context) { func (handler *MediaLoFiHandler) ListPage(c *gin.Context) { session := sessions.Default(c) user := session.Get(globals.UserKey) + logger := slog.Get(c) lofis, err := handler.Service.List(c.Request.Context()) if err != nil { + logger.Info("MediaLoFiHandler#ListPage", "error", err.Error()) c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } + logger.Info("MediaLoFiHandler#ListPage", "lofis count", len(lofis)) c.HTML(http.StatusOK, "lofi", gin.H{ "title": "Kontor MediaFiles", "version": "0.4.0", @@ -101,3 +104,102 @@ func (handler *MediaLoFiHandler) ListPage(c *gin.Context) { "user": user, }) } + +func (handler *MediaLoFiHandler) EditPage(c *gin.Context) { + session := sessions.Default(c) + user := session.Get(globals.UserKey) + id := c.Param("id") + logger := slog.Get(c) + lofi, 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", "lofi", lofi) + c.HTML(http.StatusOK, "lofi_detail", gin.H{ + "title": "Kontor MediaFLofi", + "version": "0.4.0", + "message": "MediaFiles...", + "lofi": lofi, + "user": user, + }) +} + +func (handler *MediaLoFiHandler) ChangeReviewPage(c *gin.Context) { + id := c.Param("id") + logger := slog.Get(c) + lofi, err := handler.Service.Get(c.Request.Context(), id) + if err != nil { + logger.Info("MediaLoFiHandler#ChangeReviewPage", "error", err.Error()) + c.Redirect(http.StatusNotFound, "/web/media-lofis") + return + } + lofi.Review = !lofi.Review + handler.Service.Update(c.Request.Context(), lofi.ConvertMediaLoFiToDTO()) + logger.Info("MediaLoFiHandler#ChangeReviewPage", "lofi", lofi) + session := sessions.Default(c) + user := session.Get(globals.UserKey) + lofis, err := handler.Service.List(c.Request.Context()) + if err != nil { + logger.Info("MediaLoFiHandler#ChangeReviewPage", "error", err.Error()) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + logger.Info("MediaLoFiHandler#ListPage", "lofis count", len(lofis)) + c.HTML(http.StatusOK, "lofi", gin.H{ + "title": "Kontor MediaFiles", + "version": "0.4.0", + "message": "MediaFiles...", + "lofis": lofis, + "user": user, + }) + c.Redirect(http.StatusCreated, "/web/media-lofis") +} + +func (handler *MediaLoFiHandler) UpdatePage(c *gin.Context) { + session := sessions.Default(c) + user := session.Get(globals.UserKey) + id := c.Param("id") + logger := slog.Get(c) + lofi, err := handler.Service.Get(c.Request.Context(), id) + if err != nil { + logger.Info("MediaLoFiHandler#UpdatePage", "error", err.Error()) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + var form models.MediaLoFiForm + if err := c.ShouldBind(&form); err != nil { + logger.Info("MediaLoFiHandler#UpdatePage", "error", err.Error()) + c.HTML(http.StatusBadRequest, "lofi_detail", gin.H{ + "Form": form, + "Errors": err.Error(), + "user": user, + }) + return + } + logger.Info("MediaLoFiHandler#UpdatePage", "lofi", lofi) + //handler.Service.Update(c.Request.Context(), form.ConvertFormToMediaLofiDTO()) + c.Redirect(http.StatusFound, "web/media-lofis") +} + +func (handler *MediaLoFiHandler) DeletePage(c *gin.Context) { + session := sessions.Default(c) + user := session.Get(globals.UserKey) + id := c.Param("id") + logger := slog.Get(c) + lofi, err := handler.Service.Get(c.Request.Context(), id) + if err != nil { + logger.Info("MediaLoFiHandler#DeletePage", "error", err.Error()) + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + logger.Info("MediaLoFiHandler#DeletePage", "lofi", id) + c.HTML(http.StatusOK, "lofi_delete", gin.H{ + "title": "Kontor MediaFiles", + "version": "0.4.0", + "message": "MediaFiles...", + "lofi": lofi, + "user": user, + }) +} diff --git a/kontor-gin/internal/models/media_lofi.go b/kontor-gin/internal/models/media_lofi.go index c8ad2b4..80496c8 100644 --- a/kontor-gin/internal/models/media_lofi.go +++ b/kontor-gin/internal/models/media_lofi.go @@ -2,6 +2,7 @@ package models import ( "fmt" + "kontor-api-gin/internal/config" "kontor-api-gin/internal/helpers" "log/slog" "time" @@ -35,10 +36,36 @@ func (media_lofi *MediaLoFi) TableName() string { return "media_lofi" } +func (media_lofi *MediaLoFi) ConvertMediaLoFiToDTO() MediaLoFiDTO { + dto := MediaLoFiDTO{ + ID: media_lofi.ID, + CreatedAt: helpers.KontorTime{Time: media_lofi.CreatedAt}, + UpdatedAt: helpers.KontorTime{Time: media_lofi.UpdatedAt}, + DeletedAt: media_lofi.DeletedAt, + Version: media_lofi.Version, + WebLink: media_lofi.WebLink, + Review: media_lofi.Review, + ShouldDownload: media_lofi.ShouldDownload, + Title: media_lofi.Title, + FileName: media_lofi.FileName, + } + return dto +} + type MediaLofiAdd struct { Url string `json:"url"` } +type MediaLoFiForm struct { + Title string `form:"title" binding:"required"` + Url string `form:"url" binding:"required"` +} + +func (form *MediaLoFiForm) ConvertFormToMediaLofiDTO() MediaLoFiDTO { + media_lofi := MediaLoFiDTO{} + return media_lofi +} + type MediaLoFiDTO struct { ID string `json:"id" binding:"required"` CreatedAt helpers.KontorTime `json:"created_date"` @@ -52,9 +79,62 @@ type MediaLoFiDTO struct { WebLink string `json:"url"` } +func (source MediaLoFiDTO) Equals(target MediaLoFiDTO) bool { + if config.Verbose > 1 { + slog.Info("MediaLoFiDTO#Equals", "id", source.ID) + } + equals := true + if source.Title != target.Title { + if config.Verbose > 1 { + slog.Info("MediaLoFiDTO#Equals: Title changed") + } + equals = false + } + if source.WebLink != target.WebLink { + if config.Verbose > 1 { + slog.Info("MediaLoFiDTO#Equals: WebLink changed") + } + equals = false + } + if source.Version != target.Version { + if config.Verbose > 1 { + slog.Info("MediaLoFiDTO#Equals: Version changed") + } + equals = false + } + if source.FileName != target.FileName { + if config.Verbose > 1 { + slog.Info("MediaLoFiDTO#Equals: FileName changed") + } + equals = false + } + if source.Review != target.Review { + if config.Verbose > 1 { + slog.Info("MediaLoFiDTO#Equals: Review changed") + } + equals = false + } + if source.ShouldDownload != target.ShouldDownload { + if config.Verbose > 1 { + slog.Info("MediaLoFiDTO#Equals: ShouldDownload changed") + } + equals = false + } + return equals +} + type MediaLoFiDTOList []MediaLoFiDTO -func (source *MediaLoFiDTOList) CompareIds(target *MediaLoFiDTOList) (missing, obsolete []string) { +func (source MediaLoFiDTOList) GetMediaLofi(lofi_id string) *MediaLoFiDTO { + for _, lofi := range source { + if lofi.ID == lofi_id { + return &lofi + } + } + return nil +} + +func (source *MediaLoFiDTOList) CompareIds(target *MediaLoFiDTOList) (missing, obsolete, changed []string) { sources := make(map[string]MediaLoFiDTO, len(*source)) targets := make(map[string]MediaLoFiDTO, len(*target)) for _, source := range *source { @@ -66,7 +146,12 @@ func (source *MediaLoFiDTOList) CompareIds(target *MediaLoFiDTOList) (missing, o // iterate source IDs for id := range sources { if _, ok := targets[id]; ok { - slog.Debug(fmt.Sprintf("ID %s found in both lists", id)) + if config.Verbose > 1 { + slog.Info(fmt.Sprintf("ID %s found in both lists", id)) + } + if !sources[id].Equals(targets[id]) { + changed = append(changed, id) + } } else { missing = append(missing, id) } @@ -78,26 +163,15 @@ func (source *MediaLoFiDTOList) CompareIds(target *MediaLoFiDTOList) (missing, o obsolete = append(obsolete, id) } } - slog.Info("CompareIds", "missing", len(missing), "obsolete", len(obsolete)) + slog.Info("CompareIds", "missing", len(missing), "obsolete", len(obsolete), "changed", len(changed)) slog.Debug("CompareIds", "missing", missing, "obsolete", obsolete) - return missing, obsolete + return missing, obsolete, changed } -func ConvertMediaLoFisToDtos(media_lofis []MediaLoFi) []MediaLoFiDTO { - dtos := make([]MediaLoFiDTO, len(media_lofis)) +func ConvertMediaLoFisToDtos(media_lofis []MediaLoFi) MediaLoFiDTOList { + dtos := make(MediaLoFiDTOList, len(media_lofis)) for i, media_lofi := range media_lofis { - dtos[i] = MediaLoFiDTO{ - ID: media_lofi.ID, - CreatedAt: helpers.KontorTime{Time: media_lofi.CreatedAt}, - UpdatedAt: helpers.KontorTime{Time: media_lofi.UpdatedAt}, - DeletedAt: media_lofi.DeletedAt, - Version: media_lofi.Version, - WebLink: media_lofi.WebLink, - Review: media_lofi.Review, - ShouldDownload: media_lofi.ShouldDownload, - Title: media_lofi.Title, - FileName: media_lofi.FileName, - } + dtos[i] = media_lofi.ConvertMediaLoFiToDTO() } return dtos } diff --git a/kontor-gin/internal/router/router.go b/kontor-gin/internal/router/router.go index 8d07fad..836a2ed 100644 --- a/kontor-gin/internal/router/router.go +++ b/kontor-gin/internal/router/router.go @@ -61,6 +61,10 @@ func New(admin *handlers.AdminHandler, bookshelf *handlers.BookshelfHandler, com m.GET("/media-files", media.MediaFileHandler.ListPage) m.GET("/files", media.MediaFileHandler.ListPage) m.GET("/media-lofis", media.MediaLoFiHandler.ListPage) + m.GET("/media-lofis/:id/edit", media.MediaLoFiHandler.EditPage) + m.POST("/media-lofis/:id/edit", media.MediaLoFiHandler.UpdatePage) + m.GET("/media-lofis/:id/change-review", media.MediaLoFiHandler.ChangeReviewPage) + m.GET("/media-lofis/:id/delete", media.MediaLoFiHandler.DeletePage) m.GET("/lofis", media.MediaLoFiHandler.ListPage) api := router.Group("/api") diff --git a/kontor-gin/templates/pages/lofi.html b/kontor-gin/templates/pages/lofi.html index 0f0985d..620407d 100644 --- a/kontor-gin/templates/pages/lofi.html +++ b/kontor-gin/templates/pages/lofi.html @@ -35,7 +35,7 @@
{{ range .lofis }}