package bucket import ( "bytes" "encoding/json" "io/ioutil" "os" "github.com/minio/minio-go/v6" ) type Client struct { *minio.Client } func NewClient(endpoint, accessKey, secretKey, regionName string, endpointSecure bool) (*Client, error) { m, err := minio.NewWithRegion(endpoint, accessKey, secretKey, endpointSecure, regionName) if err != nil { return nil, err } client := &Client{ Client: m, } return client, nil } func NewClientFromEnv() (*Client, error) { accessKey := os.Getenv("MINIO_ACCESS_KEY") secretKey := os.Getenv("MINIO_SECRET_KEY") regionName := os.Getenv("MINIO_REGION_NAME") endpoint := os.Getenv("MINIO_ENDPOINT") endpointSecure := os.Getenv("MINIO_ENDPOINT_SECURE") == "true" return NewClient(endpoint, accessKey, secretKey, regionName, endpointSecure) } func (c *Client) GetBucketMetadata(b Bucket) (BucketMetadata, error) { err := b.Validate() if err != nil { return BucketMetadata{}, err } o, err := c.GetObject(b.String(), bucketMetadataObject, minio.GetObjectOptions{}) if err != nil { return BucketMetadata{}, err } defer o.Close() buf, err := ioutil.ReadAll(o) if err != nil { return BucketMetadata{}, err } m := BucketMetadata{} err = json.Unmarshal(buf, &m) if err != nil { return BucketMetadata{}, err } return m, nil } func (c *Client) PutBucketMetadata(b Bucket, m BucketMetadata) error { err := b.Validate() if err != nil { return err } buf, err := json.MarshalIndent(m, "", "\t") if err != nil { return err } _, err = c.PutObject(b.String(), bucketMetadataObject, bytes.NewBuffer(buf), int64(len(buf)), minio.PutObjectOptions{ ContentType: "application/json", }) if err != nil { return err } return nil } func (c *Client) PutBucketWeb(b Bucket, buf []byte) error { err := b.Validate() if err != nil { return err } _, err = c.PutObject(b.String(), "index.html", bytes.NewBuffer(buf), int64(len(buf)), minio.PutObjectOptions{ ContentType: "text/html", StorageClass: "REDUCED_REDUNDANCY", }) if err != nil { return err } return nil } func (c *Client) GetPhotos(b Bucket) ([]Photo, error) { err := b.Validate() if err != nil { return nil, err } keys := make([]Photo, 0) doneCh := make(chan struct{}) objCh := c.ListObjectsV2(b.String(), photoPrefix, true, doneCh) for obj := range objCh { if obj.Err != nil { return nil, obj.Err } keys = append(keys, Photo(obj.Key)) } return keys, nil } func (c *Client) GetPhoto(b Bucket, p Photo) ([]byte, error) { err := b.Validate() if err != nil { return nil, err } err = p.Validate() if err != nil { return nil, err } o, err := c.GetObject(b.String(), p.String(), minio.GetObjectOptions{}) if err != nil { return nil, err } defer o.Close() return ioutil.ReadAll(o) } func (c *Client) GetPhotoMetadata(b Bucket, p Photo) (PhotoMetadata, error) { err := b.Validate() if err != nil { return PhotoMetadata{}, err } err = p.Validate() if err != nil { return PhotoMetadata{}, err } o, err := c.GetObject(b.String(), p.MetadataString(), minio.GetObjectOptions{}) if err != nil { return PhotoMetadata{}, err } defer o.Close() buf, err := ioutil.ReadAll(o) if err != nil { return PhotoMetadata{}, err } m := PhotoMetadata{} err = json.Unmarshal(buf, &m) if err != nil { return PhotoMetadata{}, err } return m, nil } func (c *Client) PutPhotoMetadata(b Bucket, p Photo, m PhotoMetadata) error { err := b.Validate() if err != nil { return err } err = p.Validate() if err != nil { return err } buf, err := json.MarshalIndent(m, "", "\t") if err != nil { return err } _, err = c.PutObject(b.String(), p.MetadataString(), bytes.NewBuffer(buf), int64(len(buf)), minio.PutObjectOptions{ ContentType: "application/json", }) if err != nil { return err } return nil } func (c *Client) PutPreview(b Bucket, p Preview, buf []byte) error { err := b.Validate() if err != nil { return err } err = p.Validate() if err != nil { return err } _, err = c.PutObject(b.String(), p.String(), bytes.NewBuffer(buf), int64(len(buf)), minio.PutObjectOptions{ ContentType: p.Format().ContentType(), StorageClass: "REDUCED_REDUNDANCY", }) if err != nil { return err } return nil }