Достижение: Добавлены скрипты и документация для релиза PDF Compressor.

- Добавлен release-body.md для подробных заметок о релизе на русском языке.
- Реализован release-gitea.ps1 для автоматизированного релиза Gitea с помощью PowerShell.
- Создан release-gitea.sh для автоматизированного релиза Gitea с помощью Bash.
- Добавлен release.sh для сборки и маркировки релизов с поддержкой нескольких платформ.
- Улучшен пользовательский интерфейс благодаря информативному логированию и обработке ошибок.
- Добавлена ​​поддержка переменных окружения и управления конфигурацией.
- Добавлена ​​функция создания архивов и загрузки ресурсов в Gitea.
This commit is contained in:
Dmitriy Fofanov
2025-11-05 09:33:12 +03:00
parent f328d67080
commit ec65cfd05a
43 changed files with 5792 additions and 2 deletions

View 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)
}