From 7b0631d6c42c132adb21f4ada3335994e944cd54 Mon Sep 17 00:00:00 2001 From: 2mal3 <56305732+2mal3@users.noreply.github.com> Date: Fri, 24 Oct 2025 20:45:32 +0200 Subject: [PATCH] refactor(display): more scalable file preview file type routing --- display/pkg/main.go | 30 ++++++++++++++++++++++++++++++ display/web/main.go | 26 ++++---------------------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/display/pkg/main.go b/display/pkg/main.go index 6899818..d19e013 100644 --- a/display/pkg/main.go +++ b/display/pkg/main.go @@ -4,6 +4,9 @@ import ( "bytes" "errors" "fmt" + "image" + "image/jpeg" + "image/png" "log/slog" "net" "os" @@ -178,3 +181,30 @@ func ResolveStorageFilePath(pathParam string) (string, bool, error) { return fullPath, true, nil } + +func PreviewFile(fullPath string) (image.Image, error) { + var err error + + f, err := os.Open(fullPath) + if err != nil { + return nil, err + } + defer f.Close() + + ext := strings.ToLower(filepath.Ext(fullPath)) + var img image.Image + switch ext { + case ".jpg", ".jpeg": + img, err = jpeg.Decode(f) + case ".png": + img, err = png.Decode(f) + default: + return nil, fmt.Errorf("unsupported file type for preview: %s", ext) + } + if err != nil { + return nil, err + } + + preview := resizeImage(img, 200, 200) + return preview, nil +} diff --git a/display/web/main.go b/display/web/main.go index 5c1ee55..2e4b10e 100644 --- a/display/web/main.go +++ b/display/web/main.go @@ -4,8 +4,6 @@ import ( "bytes" "context" "fmt" - "image" - "image/jpeg" "image/png" "io" "log/slog" @@ -327,34 +325,18 @@ func previewRoute(ctx echo.Context) error { return ctx.JSON(http.StatusNotFound, ErrorResponse{Error: "File not found"}) } - f, err := os.Open(fullPath) + resized, err := pkg.PreviewFile(fullPath) if err != nil { - slog.Error("Failed to open file", "file", fullPath, "error", err) - return ctx.JSON(http.StatusInternalServerError, ErrorResponse{Error: "Failed to open file"}) - } - defer f.Close() - - ext := strings.ToLower(filepath.Ext(fullPath)) - var imgData image.Image - switch ext { - case ".jpg", ".jpeg": - imgData, err = jpeg.Decode(f) - case ".png": - imgData, err = png.Decode(f) - default: - return ctx.JSON(http.StatusBadRequest, ErrorResponse{Error: "Unsupported image format for preview"}) - } - if err != nil { - slog.Error("Failed to decode image", "error", err) - return ctx.JSON(http.StatusInternalServerError, ErrorResponse{Error: "Failed to decode image"}) + slog.Error("Failed to generate preview", "file", fullPath, "error", err) + return ctx.JSON(http.StatusInternalServerError, ErrorResponse{Error: "Failed to generate preview"}) } - resized := pkg.ResizeImage(imgData, 100, 100) var buf bytes.Buffer if err := png.Encode(&buf, resized); err != nil { slog.Error("Failed to encode image", "error", err) return ctx.JSON(http.StatusInternalServerError, ErrorResponse{Error: "Failed to encode image"}) } + return ctx.Blob(http.StatusOK, "image/png", buf.Bytes()) }