storer/dal/dal.go
2024-02-19 21:09:39 +03:00

145 lines
2.9 KiB
Go

package dal
import (
"context"
"fmt"
"github.com/minio/minio-go/v7"
"io"
"sync"
)
const (
bucketImages = "squizimages"
bucketFonts = "squizfonts"
bucketScripts = "squizscript"
bucketStyle = "squizstyle"
)
type Storer struct {
client *minio.Client
}
func New(ctx context.Context, minioClient *minio.Client) (*Storer, error) {
if ok, err := minioClient.BucketExists(ctx, bucketImages); !ok {
if err := minioClient.MakeBucket(ctx, bucketImages, minio.MakeBucketOptions{}); err != nil {
return nil, err
}
} else if err != nil {
return nil, err
}
if ok, err := minioClient.BucketExists(ctx, bucketFonts); !ok {
if err := minioClient.MakeBucket(ctx, bucketFonts, minio.MakeBucketOptions{}); err != nil {
return nil, err
}
} else if err != nil {
return nil, err
}
if ok, err := minioClient.BucketExists(ctx, bucketScripts); !ok {
if err := minioClient.MakeBucket(ctx, bucketScripts, minio.MakeBucketOptions{}); err != nil {
return nil, err
}
} else if err != nil {
return nil, err
}
if ok, err := minioClient.BucketExists(ctx, bucketStyle); !ok {
if err := minioClient.MakeBucket(ctx, bucketStyle, minio.MakeBucketOptions{}); err != nil {
return nil, err
}
} else if err != nil {
return nil, err
}
return &Storer{
client: minioClient,
}, nil
}
func (s *Storer) UploadImages(ctx context.Context, quid string, files map[string]io.Reader, sizes map[string]int64) []error {
var (
wg sync.WaitGroup
m sync.Mutex
errs []error
)
wg.Add(len(files))
for f, r := range files {
fname := f
reader := r
go func() {
defer wg.Done()
_, err := s.client.PutObject(ctx,
bucketImages,
fmt.Sprintf("%s/%s", quid, fname),
reader,
sizes[fname],
minio.PutObjectOptions{})
if err != nil {
m.Lock()
defer m.Unlock()
errs = append(errs, err)
}
}()
}
wg.Wait()
return errs
}
func (s *Storer) UploadFonts(ctx context.Context, quid string, files map[string]io.Reader, sizes map[string]int64) []error {
var (
wg sync.WaitGroup
m sync.Mutex
errs []error
)
wg.Add(len(files))
for f, r := range files {
fname := f
reader := r
go func() {
defer wg.Done()
if _, err := s.client.PutObject(ctx,
bucketFonts,
fmt.Sprintf("%s/%s", quid, fname),
reader,
sizes[fname],
minio.PutObjectOptions{}); err != nil {
m.Lock()
defer m.Unlock()
errs = append(errs, err)
}
}()
}
wg.Wait()
return errs
}
func (s *Storer) UploadScript(ctx context.Context, quid string, file io.Reader, size int64) error {
if _, err := s.client.PutObject(ctx,
bucketScripts,
fmt.Sprintf("%s.js", quid),
file,
size,
minio.PutObjectOptions{}); err != nil {
return err
}
return nil
}
func (s *Storer) UploadStyle(ctx context.Context, quid string, file io.Reader, size int64) error {
if _, err := s.client.PutObject(ctx,
bucketStyle,
fmt.Sprintf("%s.css", quid),
file,
size,
minio.PutObjectOptions{}); err != nil {
return err
}
return nil
}