Eric Bower
·
2025-04-18
minio.go
1package storage
2
3import (
4 "fmt"
5 "io"
6 "log/slog"
7 "os"
8 "path/filepath"
9 "strings"
10
11 sst "github.com/picosh/pico/pkg/pobj/storage"
12 "github.com/picosh/pico/pkg/shared/mime"
13)
14
15type StorageMinio struct {
16 *sst.StorageMinio
17}
18
19func NewStorageMinio(logger *slog.Logger, address, user, pass string) (*StorageMinio, error) {
20 st, err := sst.NewStorageMinio(logger, address, user, pass)
21 if err != nil {
22 return nil, err
23 }
24 return &StorageMinio{st}, nil
25}
26
27func (s *StorageMinio) ServeObject(bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
28 var rc io.ReadCloser
29 info := &sst.ObjectInfo{}
30 var err error
31 mimeType := mime.GetMimeType(fpath)
32 if !strings.HasPrefix(mimeType, "image/") || opts == nil || os.Getenv("IMGPROXY_URL") == "" {
33 rc, info, err = s.GetObject(bucket, fpath)
34 if info.Metadata == nil {
35 info.Metadata = map[string][]string{}
36 }
37 // Minio always returns application/octet-stream which needs to be overridden.
38 info.Metadata.Set("content-type", mimeType)
39 } else {
40 filePath := filepath.Join(bucket.Name, fpath)
41 dataURL := fmt.Sprintf("s3://%s", filePath)
42 rc, info, err = HandleProxy(s.Logger, dataURL, opts)
43 }
44 if err != nil {
45 return nil, nil, err
46 }
47 return rc, info, err
48}