update:api product

This commit is contained in:
Anang Yusman 2026-01-27 17:28:17 +08:00
parent 383094d1b5
commit 1098c22738
2 changed files with 100 additions and 62 deletions

View File

@ -4,7 +4,6 @@ import (
"encoding/json"
"jaecoo-be/app/database/entity"
res "jaecoo-be/app/module/products/response"
"path/filepath"
)
func ProductsResponseMapper(product *entity.Products, host string) *res.ProductsResponse {
@ -25,9 +24,8 @@ if product.Colors != nil && *product.Colors != "" {
for _, c := range rawColors {
var imageUrl *string
if c.ImagePath != nil {
filename := filepath.Base(*c.ImagePath)
url := host + "/products/viewer/" + filename
if c.ImagePath != nil && *c.ImagePath != "" {
url := host + "/products/viewer/" + *c.ImagePath
imageUrl = &url
}
@ -39,7 +37,6 @@ if product.Colors != nil && *product.Colors != "" {
}
}
response := &res.ProductsResponse{
ID: product.ID,
Title: product.Title,
@ -55,9 +52,7 @@ if product.Colors != nil && *product.Colors != "" {
}
if product.ThumbnailPath != nil && *product.ThumbnailPath != "" {
// Extract filename from path
filename := filepath.Base(*product.ThumbnailPath)
thumbnailUrl := host + "/products/viewer/" + filename
thumbnailUrl := host + "/products/viewer/" + *product.ThumbnailPath
response.ThumbnailUrl = &thumbnailUrl
}

View File

@ -307,68 +307,111 @@ func (_i *productsService) Delete(id uint) (err error) {
return
}
func (_i *productsService) Viewer(c *fiber.Ctx) (err error) {
filename := c.Params("filename")
// func (_i *productsService) Viewer(c *fiber.Ctx) (err error) {
// filename := c.Params("filename")
// Find product by filename (repository will search using LIKE pattern)
result, err := _i.Repo.FindByThumbnailPath(filename)
if err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
"error": true,
"msg": "Product file not found",
})
}
// // Find product by filename (repository will search using LIKE pattern)
// result, err := _i.Repo.FindByThumbnailPath(filename)
// if err != nil {
// return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
// "error": true,
// "msg": "Product file not found",
// })
// }
if result.ThumbnailPath == nil || *result.ThumbnailPath == "" {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
// if result.ThumbnailPath == nil || *result.ThumbnailPath == "" {
// return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
// "error": true,
// "msg": "Product thumbnail path not found",
// })
// }
// ctx := context.Background()
// bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
// objectName := *result.ThumbnailPath
// _i.Log.Info().Str("timestamp", time.Now().
// Format(time.RFC3339)).Str("Service:Resource", "Products:Viewer").
// Interface("data", objectName).Msg("")
// // Create minio connection
// minioClient, err := _i.MinioStorage.ConnectMinio()
// if err != nil {
// return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
// "error": true,
// "msg": err.Error(),
// })
// }
// fileContent, err := minioClient.GetObject(ctx, bucketName, objectName, minio.GetObjectOptions{})
// if err != nil {
// _i.Log.Error().Str("timestamp", time.Now().
// Format(time.RFC3339)).Str("Service:Resource", "Products:Viewer").
// Interface("Error getting file", err).Msg("")
// return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
// "error": true,
// "msg": "Failed to retrieve file",
// })
// }
// defer fileContent.Close()
// // Determine Content-Type based on file extension
// contentType := mime.TypeByExtension("." + getFileExtension(objectName))
// if contentType == "" {
// contentType = "application/octet-stream" // fallback if no MIME type matches
// }
// c.Set("Content-Type", contentType)
// if _, err := io.Copy(c.Response().BodyWriter(), fileContent); err != nil {
// return err
// }
// return
// }
func (_i *productsService) Viewer(c *fiber.Ctx) error {
// ambil full path setelah /viewer
objectPath := strings.TrimPrefix(c.Params("*"), "/")
if objectPath == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": true,
"msg": "Product thumbnail path not found",
"msg": "File path is required",
})
}
ctx := context.Background()
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
objectName := *result.ThumbnailPath
_i.Log.Info().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:Resource", "Products:Viewer").
Interface("data", objectName).Msg("")
// Create minio connection
minioClient, err := _i.MinioStorage.ConnectMinio()
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
return c.Status(500).JSON(fiber.Map{
"error": true,
"msg": err.Error(),
})
}
fileContent, err := minioClient.GetObject(ctx, bucketName, objectName, minio.GetObjectOptions{})
file, err := minioClient.GetObject(ctx, bucketName, objectPath, minio.GetObjectOptions{})
if err != nil {
_i.Log.Error().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:Resource", "Products:Viewer").
Interface("Error getting file", err).Msg("")
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
return c.Status(404).JSON(fiber.Map{
"error": true,
"msg": "Failed to retrieve file",
"msg": "Product file not found",
})
}
defer fileContent.Close()
defer file.Close()
// Determine Content-Type based on file extension
contentType := mime.TypeByExtension("." + getFileExtension(objectName))
// content-type
contentType := mime.TypeByExtension(filepath.Ext(objectPath))
if contentType == "" {
contentType = "application/octet-stream" // fallback if no MIME type matches
contentType = "application/octet-stream"
}
c.Set("Content-Type", contentType)
if _, err := io.Copy(c.Response().BodyWriter(), fileContent); err != nil {
_, err = io.Copy(c.Response().BodyWriter(), file)
return err
}
return
}
func getFileExtension(filename string) string {
// split file name