Files
compress/internal/interface/controllers/cli_controller.go
Dmitriy Fofanov ec65cfd05a Достижение: Добавлены скрипты и документация для релиза PDF Compressor.
- Добавлен release-body.md для подробных заметок о релизе на русском языке.
- Реализован release-gitea.ps1 для автоматизированного релиза Gitea с помощью PowerShell.
- Создан release-gitea.sh для автоматизированного релиза Gitea с помощью Bash.
- Добавлен release.sh для сборки и маркировки релизов с поддержкой нескольких платформ.
- Улучшен пользовательский интерфейс благодаря информативному логированию и обработке ошибок.
- Добавлена ​​поддержка переменных окружения и управления конфигурацией.
- Добавлена ​​функция создания архивов и загрузки ресурсов в Gitea.
2025-11-05 09:33:12 +03:00

159 lines
6.0 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 controllers
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"compressor/internal/domain/entities"
usecases "compressor/internal/usecase"
)
// CLIController контроллер для командной строки
//
// ⚠️ DEPRECATED / LEGACY CODE ⚠️
//
// Данный контроллер НЕ используется в текущей версии приложения.
// Приложение использует только TUI интерфейс (internal/presentation/tui/manager.go).
// Сохранен для возможной будущей поддержки CLI режима или миграции на cobra/viper.
//
// Рекомендация: при необходимости CLI использовать флаги в main.go вместо этого контроллера.
type CLIController struct {
compressPDFUseCase *usecases.CompressPDFUseCase
compressDirectoryUseCase *usecases.CompressDirectoryUseCase
}
// NewCLIController создает новый CLI контроллер
func NewCLIController(
compressPDFUseCase *usecases.CompressPDFUseCase,
compressDirectoryUseCase *usecases.CompressDirectoryUseCase,
) *CLIController {
return &CLIController{
compressPDFUseCase: compressPDFUseCase,
compressDirectoryUseCase: compressDirectoryUseCase,
}
}
// HandleSingleFile обрабатывает сжатие одного файла
func (c *CLIController) HandleSingleFile(inputPath, outputPath string) error {
fmt.Println("🔥 PDF Compressor - Сжатие PDF файлов")
fmt.Println("====================================")
// Запрашиваем уровень сжатия
compressionLevel := c.askForCompressionLevel()
fmt.Printf("\n🚀 Начинаем сжатие файла: %s\n", inputPath)
// Выполняем сжатие
result, err := c.compressPDFUseCase.Execute(inputPath, outputPath, compressionLevel)
if err != nil {
return fmt.Errorf("ошибка сжатия: %w", err)
}
// Показываем результаты
c.showCompressionResult(result, outputPath)
return nil
}
// HandleDirectory обрабатывает сжатие директории
func (c *CLIController) HandleDirectory(inputDir, outputDir string) error {
fmt.Println("🔥 PDF Compressor - Сжатие директории PDF файлов")
fmt.Println("================================================")
// Запрашиваем уровень сжатия
compressionLevel := c.askForCompressionLevel()
fmt.Printf("\n🚀 Начинаем сжатие директории: %s\n", inputDir)
// Выполняем сжатие
result, err := c.compressDirectoryUseCase.Execute(inputDir, outputDir, compressionLevel)
if err != nil {
return fmt.Errorf("ошибка сжатия директории: %w", err)
}
// Показываем результаты
c.showDirectoryResult(result)
return nil
}
// askForCompressionLevel запрашивает уровень сжатия у пользователя
func (c *CLIController) askForCompressionLevel() int {
reader := bufio.NewReader(os.Stdin)
fmt.Println("\n🎯 Выберите уровень сжатия:")
fmt.Println("10-20%: Слабое сжатие (высокое качество)")
fmt.Println("21-40%: Умеренное сжатие (хорошее качество)")
fmt.Println("41-60%: Среднее сжатие (среднее качество)")
fmt.Println("61-80%: Высокое сжатие (низкое качество)")
fmt.Println("81-90%: Максимальное сжатие (очень низкое качество)")
for {
fmt.Print("\nВведите процент сжатия (10-90): ")
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("❌ Ошибка ввода")
continue
}
input = strings.TrimSpace(input)
level, err := strconv.Atoi(input)
if err != nil {
fmt.Println("❌ Введите число")
continue
}
if level < 10 || level > 90 {
fmt.Println("❌ Уровень сжатия должен быть от 10 до 90")
continue
}
return level
}
}
// showCompressionResult показывает результат сжатия файла
func (c *CLIController) showCompressionResult(result *entities.CompressionResult, outputPath string) {
fmt.Println("\n📊 Результаты сжатия:")
fmt.Printf("Исходный размер: %.2f MB\n", float64(result.OriginalSize)/1024/1024)
fmt.Printf("Сжатый размер: %.2f MB\n", float64(result.CompressedSize)/1024/1024)
fmt.Printf("Сжатие: %.1f%%\n", result.CompressionRatio)
fmt.Printf("Сэкономлено: %.2f MB\n", float64(result.SavedSpace)/1024/1024)
if result.IsEffective() {
fmt.Println("✅ Сжатие выполнено успешно!")
} else {
fmt.Println("⚠️ Файл не был сжат (возможно, уже оптимизирован)")
}
fmt.Printf("\n🎉 Готово! Сжатый файл сохранен как: %s\n", outputPath)
}
// showDirectoryResult показывает результат сжатия директории
func (c *CLIController) showDirectoryResult(result *usecases.DirectoryCompressionResult) {
fmt.Printf("\n📊 Результаты сжатия директории:\n")
fmt.Printf("Всего файлов: %d\n", result.TotalFiles)
fmt.Printf("Успешно сжато: %d\n", result.SuccessCount)
fmt.Printf("Ошибок: %d\n", result.FailedCount)
// Показываем статистику по каждому файлу
for i, fileResult := range result.Results {
fmt.Printf("\n[%d] Сжатие: %.1f%%, Сэкономлено: %.2f MB\n",
i+1, fileResult.CompressionRatio, float64(fileResult.SavedSpace)/1024/1024)
}
// Показываем ошибки, если есть
if len(result.Errors) > 0 {
fmt.Println("\n❌ Ошибки:")
for i, err := range result.Errors {
fmt.Printf("[%d] %v\n", i+1, err)
}
}
fmt.Printf("\n🎉 Обработка завершена! Успешно сжато: %d/%d файлов\n",
result.SuccessCount, result.TotalFiles)
}