infoalloggi-monorepo/apps/backend/storage_handlers/minio.go

136 lines
3.1 KiB
Go
Raw Normal View History

2025-08-04 17:45:44 +02:00
package storagehandlers
import (
"backend/config"
2025-08-04 17:45:44 +02:00
"context"
"fmt"
"log"
"mime/multipart"
"path/filepath"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
var (
useSSL = false
bucketName = "storage"
)
2025-10-23 15:16:42 +02:00
var _ StorageHandler = (*S3_Handler)(nil)
2025-08-04 17:45:44 +02:00
type S3_Handler struct {
minioClient *minio.Client
}
func (s *S3_Handler) Init() error {
found, err := s.minioClient.BucketExists(context.Background(), bucketName)
if err != nil {
log.Println(err)
return err
}
if !found {
err = s.minioClient.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{})
if err != nil {
log.Println(err)
return err
}
log.Println("Bucket created successfully")
}
log.Println("Bucket found")
return nil
}
func NewS3Handler() (*S3_Handler, error) {
minioClient, err := minio.New(config.Cfg.Storage.Minio.URL, &minio.Options{
Creds: credentials.NewStaticV4(config.Cfg.Storage.Minio.RootUser, config.Cfg.Storage.Minio.Password, ""),
2025-08-04 17:45:44 +02:00
Secure: useSSL,
})
if err != nil {
log.Fatalln(err)
}
return &S3_Handler{
minioClient,
}, nil
}
func (s *S3_Handler) Add(file *multipart.FileHeader, fileId string) error {
ctx := context.Background()
src, err := file.Open()
if err != nil {
log.Printf("Error opening file: %v\n", err)
return err
}
defer src.Close()
extension := filepath.Ext(file.Filename)
objectName := fileId + extension
info, err := s.minioClient.PutObject(ctx, bucketName, objectName, src, file.Size, minio.PutObjectOptions{ContentType: "application/octet-stream"})
if err != nil {
log.Fatalln(err)
return err
}
log.Printf("Successfully uploaded %s of size %d\n", objectName, info.Size)
return nil
}
func (s *S3_Handler) Delete(filename string) error {
opts := minio.RemoveObjectOptions{
GovernanceBypass: true,
}
err := s.minioClient.RemoveObject(context.Background(), bucketName, filename, opts)
if err != nil {
log.Fatalln(err)
return err
}
return nil
}
// func (s *S3_Handler) DeleteM(filename string) error {
// opts := minio.RemoveObjectOptions{
// GovernanceBypass: true,
// }
// err := s.minioClient.RemoveObjects(context.Background(), bucketName, filename, opts)
// if err != nil {
// log.Fatalln(err)
// return err
// }
// return nil
// }
func (s *S3_Handler) Get(filename string) (string, error) {
localPath := filepath.Join(config.Cfg.Storage.Path, "/tmp/", filename)
2025-08-04 17:45:44 +02:00
err := s.minioClient.FGetObject(context.Background(), bucketName, filename, localPath, minio.GetObjectOptions{})
if err != nil {
fmt.Println(err)
return "", fmt.Errorf("error downloading file %s: %w", filename, err)
}
log.Printf("Successfully downloaded %s\n", filename)
return localPath, nil
}
func (s *S3_Handler) List() ([]string, error) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
objectCh := s.minioClient.ListObjects(ctx, bucketName, minio.ListObjectsOptions{
Prefix: "",
Recursive: true,
})
var list []string
for object := range objectCh {
if object.Err != nil {
log.Println(object.Err)
return nil, object.Err
}
list = append(list, object.Key)
}
return list, nil
}