repos / pico

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

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