package repository import ( "context" "fmt" "github.com/minio/minio-go/v7" "io" "sync" ) const ( Bucket = "3c580be9-cf31f296-d055-49cf-b39e-30c7959dc17b" folderImages = "squizimages" bucketFonts = "squizfonts" bucketScripts = "squizscript" bucketStyle = "squizstyle" ) type S3 struct { client *minio.Client } func New(ctx context.Context, minioClient *minio.Client) (*S3, error) { return &S3{ client: minioClient, }, nil } func (s *S3) 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, Bucket, folderImages+"/"+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 *S3) 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, Bucket, 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 *S3) UploadScript(ctx context.Context, quid string, file io.Reader, size int64) error { if _, err := s.client.PutObject(ctx, Bucket, bucketScripts+"/"+fmt.Sprintf("%s.js", quid), file, size, minio.PutObjectOptions{}); err != nil { return err } return nil } func (s *S3) UploadStyle(ctx context.Context, quid string, file io.Reader, size int64) error { if _, err := s.client.PutObject(ctx, Bucket, bucketStyle+"/"+fmt.Sprintf("%s.css", quid), file, size, minio.PutObjectOptions{}); err != nil { return err } return nil }