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 }