Files
compress/internal/usecase/process_all_files.go
Dmitriy Fofanov eee9a4a093 Добавлены скрипты сборки для кроссплатформенных двоичных файлов и лицензия GPL.
- Добавлен файл LICENSE с лицензией GNU General Public License версии 3.0.
- Создан скрипт PowerShell (build-all.ps1) для сборки двоичных файлов Windows и Linux из Windows с использованием кросс-компиляции.
- Разработан скрипт сборки Linux (build-linux.sh) для сборки двоичных файлов Linux.
- Реализован скрипт PowerShell (build-windows.ps1) для сборки двоичных файлов Windows.
- Каждый скрипт сборки включает упаковку и генерацию контрольной суммы SHA256 для двоичных файлов.
2025-11-05 13:05:49 +03:00

138 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package usecases
import (
"fmt"
"path/filepath"
"strings"
"compress/internal/domain/entities"
"compress/internal/domain/repositories"
"compress/internal/infrastructure/compressors"
)
// ProcessAllFilesUseCase сценарий для обработки всех поддерживаемых типов файлов
type ProcessAllFilesUseCase struct {
pdfProcessor *ProcessPDFsUseCase
imageProcessor *CompressImageUseCase
logger repositories.Logger
}
// NewProcessAllFilesUseCase создает новый сценарий обработки всех файлов
func NewProcessAllFilesUseCase(
pdfProcessor *ProcessPDFsUseCase,
imageProcessor *CompressImageUseCase,
logger repositories.Logger,
) *ProcessAllFilesUseCase {
return &ProcessAllFilesUseCase{
pdfProcessor: pdfProcessor,
imageProcessor: imageProcessor,
logger: logger,
}
}
// Execute выполняет обработку всех поддерживаемых файлов
func (uc *ProcessAllFilesUseCase) Execute(config *entities.Config) error {
uc.logger.Info("Начинаем обработку файлов")
uc.logger.Info("Исходная директория: %s", config.Scanner.SourceDirectory)
var processedPDFs, processedImages bool
// Обрабатываем PDF файлы
if uc.shouldProcessPDFs(config) {
uc.logger.Info("Обработка PDF файлов...")
err := uc.pdfProcessor.Execute(config)
if err != nil {
uc.logger.Error("Ошибка обработки PDF файлов: %v", err)
return fmt.Errorf("ошибка обработки PDF файлов: %w", err)
}
processedPDFs = true
uc.logger.Info("Обработка PDF файлов завершена")
}
// Обрабатываем изображения
if uc.shouldProcessImages(config) {
uc.logger.Info("Обработка изображений...")
result, err := uc.imageProcessor.ProcessImagesInDirectory(
config.Scanner.SourceDirectory,
config.Scanner.TargetDirectory,
&config.Compression,
config.Scanner.ReplaceOriginal,
)
if err != nil {
uc.logger.Error("Ошибка обработки изображений: %v", err)
return fmt.Errorf("ошибка обработки изображений: %w", err)
}
// Логируем результаты обработки изображений
uc.logger.Info("Обработка изображений завершена. Всего файлов: %d, Успешно: %d, Ошибок: %d",
result.TotalFiles, result.SuccessfulFiles, len(result.FailedFiles))
for _, failed := range result.FailedFiles {
uc.logger.Error("Не удалось обработать изображение %s: %v", failed.FilePath, failed.Error)
}
processedImages = true
}
if !processedPDFs && !processedImages {
uc.logger.Warning("Не выбрано ни одного типа файлов для обработки")
return fmt.Errorf("не выбрано ни одного типа файлов для обработки")
}
uc.logger.Info("Обработка всех файлов завершена успешно")
return nil
}
// shouldProcessPDFs проверяет, нужно ли обрабатывать PDF файлы
func (uc *ProcessAllFilesUseCase) shouldProcessPDFs(config *entities.Config) bool {
// PDF файлы обрабатываются всегда, если есть алгоритм сжатия
return config.Compression.Algorithm != ""
}
// shouldProcessImages проверяет, нужно ли обрабатывать изображения
func (uc *ProcessAllFilesUseCase) shouldProcessImages(config *entities.Config) bool {
return config.Compression.EnableJPEG || config.Compression.EnablePNG
}
// GetSupportedFileTypes возвращает список поддерживаемых типов файлов
func (uc *ProcessAllFilesUseCase) GetSupportedFileTypes(config *entities.Config) []string {
var types []string
if uc.shouldProcessPDFs(config) {
types = append(types, "PDF")
}
if config.Compression.EnableJPEG {
types = append(types, "JPEG")
}
if config.Compression.EnablePNG {
types = append(types, "PNG")
}
return types
}
// IsFileSupported проверяет, поддерживается ли данный файл для обработки
func (uc *ProcessAllFilesUseCase) IsFileSupported(filename string, config *entities.Config) bool {
ext := strings.ToLower(filepath.Ext(filename))
// Проверяем PDF
if ext == ".pdf" && uc.shouldProcessPDFs(config) {
return true
}
// Проверяем изображения
if compressors.IsImageFile(filename) {
format := compressors.GetImageFormat(filename)
switch format {
case "jpeg":
return config.Compression.EnableJPEG
case "png":
return config.Compression.EnablePNG
}
}
return false
}