repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

pico / pkg / shared / storage
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}