Достижение: Добавлены скрипты и документация для релиза PDF Compressor.
- Добавлен release-body.md для подробных заметок о релизе на русском языке. - Реализован release-gitea.ps1 для автоматизированного релиза Gitea с помощью PowerShell. - Создан release-gitea.sh для автоматизированного релиза Gitea с помощью Bash. - Добавлен release.sh для сборки и маркировки релизов с поддержкой нескольких платформ. - Улучшен пользовательский интерфейс благодаря информативному логированию и обработке ошибок. - Добавлена поддержка переменных окружения и управления конфигурацией. - Добавлена функция создания архивов и загрузки ресурсов в Gitea.
This commit is contained in:
158
internal/interface/controllers/cli_controller.go
Normal file
158
internal/interface/controllers/cli_controller.go
Normal file
@@ -0,0 +1,158 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user