package storage import ( "context" "fmt" "net/url" "time" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" ) type StorageMinio struct { client *minio.Client endpoint string accessKey string accessSecret string secure bool bucket string } func newMinioStorage(endpoint, accessKey, accessSecret string, secure bool, bucket string) (*StorageMinio, error) { client, err := minio.New(endpoint, &minio.Options{ Creds: credentials.NewStaticV4(accessKey, accessSecret, ""), Secure: secure, }) if err != nil { return nil, err } return &StorageMinio{ client: client, endpoint: endpoint, accessKey: accessKey, accessSecret: accessSecret, secure: secure, bucket: bucket, }, nil } // PresignedPutObject implements ObjectStorage func (m *StorageMinio) PresignedPutObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) { return m.client.PresignedPutObject(ctx, m.bucket, objectName, expires) } // PresignedGetObject implements ObjectStorage func (m *StorageMinio) PresignedGetObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) { return m.client.PresignedGetObject(ctx, m.bucket, objectName, expires, nil) } // MoveObject implements ObjectStorage func (m *StorageMinio) MoveObject(ctx context.Context, srcObject, dstObject string) (err error) { dst := minio.CopyDestOptions{Bucket: m.bucket, Object: dstObject} src := minio.CopySrcOptions{Bucket: m.bucket, Object: srcObject} if _, err := m.client.CopyObject(ctx, dst, src); err != nil { return fmt.Errorf("move object failed while copy: %w", err) } if err := m.client.RemoveObject(ctx, m.bucket, srcObject, minio.RemoveObjectOptions{}); err != nil { return fmt.Errorf("move object failed while remove: %w", err) } return nil } // ObjectExists implements ObjectStorage func (m *StorageMinio) ObjectStats(ctx context.Context, objectName string) (stat *minio.ObjectInfo, exists bool, err error) { obj, err := m.client.StatObject(ctx, m.bucket, objectName, minio.StatObjectOptions{}) if err != nil { switch minio.ToErrorResponse(err).Code { case "NoSuchKey", "NoSuchBucket": return nil, false, nil default: return nil, false, err } } return &obj, true, nil } // MoveObject implements ObjectStorage func (m *StorageMinio) DeleteObject(ctx context.Context, objectName string) (err error) { if err := m.client.RemoveObject(ctx, m.bucket, objectName, minio.RemoveObjectOptions{}); err != nil { return fmt.Errorf("move object failed while remove: %w", err) } return nil } // MoveObject implements ObjectStorage func (m *StorageMinio) DeleteObjects(ctx context.Context, objectNames []string) []minio.RemoveObjectError { // FIXME: why does DeleteObjects not working?? var errors []minio.RemoveObjectError for _, objectName := range objectNames { if err := m.DeleteObject(ctx, objectName); err != nil { errors = append(errors, minio.RemoveObjectError{ ObjectName: objectName, Err: err, }) } } return errors }