Eric Bower
·
2025-04-05
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)
13
14type StorageMinio struct {
15 *sst.StorageMinio
16}
17
18func NewStorageMinio(logger *slog.Logger, address, user, pass string) (*StorageMinio, error) {
19 st, err := sst.NewStorageMinio(logger, address, user, pass)
20 if err != nil {
21 return nil, err
22 }
23 return &StorageMinio{st}, nil
24}
25
26func (s *StorageMinio) ServeObject(bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
27 var rc io.ReadCloser
28 info := &sst.ObjectInfo{}
29 var err error
30 mimeType := GetMimeType(fpath)
31 if !strings.HasPrefix(mimeType, "image/") || opts == nil || os.Getenv("IMGPROXY_URL") == "" {
32 rc, info, err = s.GetObject(bucket, fpath)
33 if info.Metadata == nil {
34 info.Metadata = map[string][]string{}
35 }
36 // Minio always returns application/octet-stream which needs to be overridden.
37 info.Metadata.Set("content-type", mimeType)
38 } else {
39 filePath := filepath.Join(bucket.Name, fpath)
40 dataURL := fmt.Sprintf("s3://%s", filePath)
41 rc, info, err = HandleProxy(s.Logger, dataURL, opts)
42 }
43 if err != nil {
44 return nil, nil, err
45 }
46 return rc, info, err
47}