Files
media-service/internal/application/usecases/upload.go
Дмитрий 72c57f0de3 add media service
2026-05-08 17:36:48 +03:00

50 lines
1.3 KiB
Go

package usecases
import (
"bytes"
"context"
"fmt"
"path/filepath"
"time"
"lendry-erp/media/internal/application/dto"
"lendry-erp/media/internal/infrastructure/images"
"lendry-erp/media/internal/infrastructure/storage"
)
type UploadUseCase struct {
storage storage.Storage
processor images.Processor
}
func NewUploadUseCase(s storage.Storage, p images.Processor) *UploadUseCase {
return &UploadUseCase{
storage: s,
processor: p,
}
}
func (u *UploadUseCase) Execute(ctx context.Context, input dto.UploadMediaRequest) (*dto.UploadMediaResponse, error) {
// 1. Сжатие и обработка изображения
finalBytes, contentType, err := u.processor.Process(input.Data, input.Mode)
if err != nil {
return nil, fmt.Errorf("process image: %w", err)
}
// 2. Генерация уникального имени файла
ext := filepath.Ext(input.OriginalName)
if ext == "" {
ext = ".jpg"
}
objectName := fmt.Sprintf("%d%s", time.Now().UnixNano(), ext)
// 3. Загрузка потока байтов в MinIO
if err := u.storage.UploadStream(ctx, objectName, bytes.NewReader(finalBytes), contentType); err != nil {
return nil, fmt.Errorf("upload to storage: %w", err)
}
return &dto.UploadMediaResponse{
FileName: objectName,
Size: int64(len(finalBytes)),
}, nil
}