repos / pico

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

pico / pkg / shared / storage
Eric Bower  ·  2025-06-08

minio.go

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