refactor: разделение кода на пакеты и улучшение архитектуры
- Создана новая структура проекта с разделением на пакеты - Добавлены интерфейсы для всех сервисов (Git, Quartz, Files, Build) - Реализован Dependency Injection для сервисов - Добавлены middleware для логирования, Request ID и Response Time - Создан пакет конфигурации с валидацией - Улучшено логирование через интерфейс - Добавлены обработчики HTTP в отдельных пакетах - Создана структура для тестирования - Добавлены конфигурационные файлы и документация
This commit is contained in:
78
internal/services/files.go
Normal file
78
internal/services/files.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
|
||||
"go-webhook-server/internal/config"
|
||||
"go-webhook-server/pkg/logger"
|
||||
)
|
||||
|
||||
// FileService интерфейс для файловых операций
|
||||
type FileService interface {
|
||||
CopyBuiltSite() error
|
||||
ClearPublicDirectory() error
|
||||
EnsurePublicDirectory() error
|
||||
}
|
||||
|
||||
// fileServiceImpl реализация файлового сервиса
|
||||
type fileServiceImpl struct {
|
||||
config *config.Config
|
||||
logger logger.Logger
|
||||
}
|
||||
|
||||
// NewFileService создает новый экземпляр файлового сервиса
|
||||
func NewFileService(cfg *config.Config, log logger.Logger) FileService {
|
||||
return &fileServiceImpl{
|
||||
config: cfg,
|
||||
logger: log,
|
||||
}
|
||||
}
|
||||
|
||||
// CopyBuiltSite копирует собранные файлы в публичную директорию
|
||||
func (f *fileServiceImpl) CopyBuiltSite() error {
|
||||
f.logger.Info("Copying built site to public directory...")
|
||||
|
||||
// Очищаем публичную директорию
|
||||
if err := f.ClearPublicDirectory(); err != nil {
|
||||
return fmt.Errorf("failed to clear public directory: %w", err)
|
||||
}
|
||||
|
||||
// Создаем публичную директорию заново
|
||||
if err := f.EnsurePublicDirectory(); err != nil {
|
||||
return fmt.Errorf("failed to create public directory: %w", err)
|
||||
}
|
||||
|
||||
// Проверяем существование директории с собранными файлами
|
||||
quartzPublicPath := filepath.Join(f.config.Paths.Quartz, "public")
|
||||
if _, err := os.Stat(quartzPublicPath); os.IsNotExist(err) {
|
||||
return fmt.Errorf("Quartz public directory not found: %s", quartzPublicPath)
|
||||
}
|
||||
|
||||
// Копируем файлы с помощью cp команды
|
||||
cmd := exec.Command("cp", "-r", quartzPublicPath+"/.", f.config.Paths.Public+"/")
|
||||
if err := cmd.Run(); err != nil {
|
||||
return fmt.Errorf("failed to copy built site: %w", err)
|
||||
}
|
||||
|
||||
f.logger.Info("Site files copied successfully")
|
||||
return nil
|
||||
}
|
||||
|
||||
// ClearPublicDirectory очищает публичную директорию
|
||||
func (f *fileServiceImpl) ClearPublicDirectory() error {
|
||||
if err := os.RemoveAll(f.config.Paths.Public); err != nil {
|
||||
return fmt.Errorf("failed to clear public directory: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// EnsurePublicDirectory создает публичную директорию если она не существует
|
||||
func (f *fileServiceImpl) EnsurePublicDirectory() error {
|
||||
if err := os.MkdirAll(f.config.Paths.Public, 0755); err != nil {
|
||||
return fmt.Errorf("failed to create public directory: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user