2021-11-23 00:53:51 +00:00
|
|
|
package s3
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"io"
|
|
|
|
|
|
|
|
"git.kapelle.org/niklas/s3browser/internal/types"
|
|
|
|
"github.com/minio/minio-go/v7"
|
|
|
|
"github.com/minio/minio-go/v7/pkg/credentials"
|
|
|
|
)
|
|
|
|
|
|
|
|
type minioS3 struct {
|
|
|
|
client *minio.Client
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewMinio(config types.AppConfig) (S3Service, error) {
|
|
|
|
client, err := minio.New(config.S3Endoint, &minio.Options{
|
|
|
|
Creds: credentials.NewStaticV4(config.S3AccessKey, config.S3SecretKey, ""),
|
|
|
|
Secure: config.S3SSL,
|
|
|
|
})
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &minioS3{
|
|
|
|
client: client,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2021-11-23 19:12:24 +00:00
|
|
|
func (m *minioS3) ListBuckets(ctx context.Context) ([]string, error) {
|
2021-11-23 00:53:51 +00:00
|
|
|
buckets, err := m.client.ListBuckets(ctx)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2021-11-23 19:12:24 +00:00
|
|
|
var rtn []string
|
2021-11-23 00:53:51 +00:00
|
|
|
|
|
|
|
for _, v := range buckets {
|
2021-11-23 19:12:24 +00:00
|
|
|
rtn = append(rtn, v.Name)
|
2021-11-23 00:53:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return rtn, nil
|
|
|
|
}
|
|
|
|
|
2021-11-23 19:12:24 +00:00
|
|
|
func (m *minioS3) ListObjects(ctx context.Context, id types.ID) ([]Object, error) {
|
|
|
|
var result []Object
|
2021-11-23 00:53:51 +00:00
|
|
|
|
2021-11-23 19:12:24 +00:00
|
|
|
for objInfo := range m.client.ListObjects(ctx, id.Bucket, minio.ListObjectsOptions{
|
|
|
|
Prefix: id.Key,
|
|
|
|
Recursive: false,
|
|
|
|
}) {
|
2021-11-23 00:53:51 +00:00
|
|
|
objId := types.ID{
|
|
|
|
Bucket: id.Bucket,
|
|
|
|
Key: objInfo.Key,
|
|
|
|
}
|
|
|
|
|
2021-11-23 19:12:24 +00:00
|
|
|
result = append(result, Object{
|
|
|
|
ID: objId,
|
|
|
|
Size: objInfo.Size,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
}
|
2021-11-23 00:53:51 +00:00
|
|
|
|
2021-11-23 19:12:24 +00:00
|
|
|
func (m *minioS3) ListObjectsRecursive(ctx context.Context, id types.ID) ([]Object, error) {
|
|
|
|
var result []Object
|
|
|
|
|
|
|
|
for objInfo := range m.client.ListObjects(ctx, id.Bucket, minio.ListObjectsOptions{
|
|
|
|
Prefix: id.Key,
|
|
|
|
Recursive: true,
|
|
|
|
}) {
|
|
|
|
objId := types.ID{
|
|
|
|
Bucket: id.Bucket,
|
|
|
|
Key: objInfo.Key,
|
2021-11-23 00:53:51 +00:00
|
|
|
}
|
2021-11-23 19:12:24 +00:00
|
|
|
result = append(result, Object{
|
|
|
|
ID: objId,
|
|
|
|
Size: objInfo.Size,
|
|
|
|
})
|
2021-11-23 00:53:51 +00:00
|
|
|
}
|
|
|
|
|
2021-11-23 19:12:24 +00:00
|
|
|
return result, nil
|
2021-11-23 00:53:51 +00:00
|
|
|
}
|
|
|
|
|
2021-11-23 19:12:24 +00:00
|
|
|
func (m *minioS3) GetObject(ctx context.Context, id types.ID) (ObjectReader, error) {
|
2021-11-23 00:53:51 +00:00
|
|
|
object, err := m.client.GetObject(ctx, id.Bucket, id.Key, minio.GetObjectOptions{})
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return object, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *minioS3) PutObject(ctx context.Context, id types.ID, reader io.Reader, objectSize int64) error {
|
|
|
|
_, err := m.client.PutObject(ctx, id.Bucket, id.Key, reader, objectSize, minio.PutObjectOptions{})
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *minioS3) CopyObject(ctx context.Context, src types.ID, dest types.ID) error {
|
|
|
|
_, err := m.client.CopyObject(ctx, minio.CopyDestOptions{
|
|
|
|
Bucket: dest.Bucket,
|
|
|
|
Object: dest.Key,
|
|
|
|
}, minio.CopySrcOptions{
|
|
|
|
Bucket: src.Bucket,
|
|
|
|
Object: src.Key,
|
|
|
|
})
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2021-11-23 19:12:24 +00:00
|
|
|
func (m *minioS3) StatObject(ctx context.Context, id types.ID) (*Object, error) {
|
2021-11-23 00:53:51 +00:00
|
|
|
info, err := m.client.StatObject(ctx, id.Bucket, id.Key, minio.GetObjectOptions{})
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2021-11-23 19:12:24 +00:00
|
|
|
return &Object{
|
|
|
|
ID: id,
|
|
|
|
Size: info.Size,
|
|
|
|
LastModified: info.LastModified,
|
|
|
|
ContentType: info.ContentType,
|
|
|
|
ETag: info.ETag,
|
|
|
|
}, nil
|
2021-11-23 00:53:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (m *minioS3) RemoveObject(ctx context.Context, id types.ID) error {
|
|
|
|
return m.client.RemoveObject(ctx, id.Bucket, id.Key, minio.RemoveObjectOptions{})
|
|
|
|
}
|