206 lines
4.1 KiB
Go
206 lines
4.1 KiB
Go
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
|
|
}
|