refactor: разделение кода на пакеты и улучшение архитектуры

- Создана новая структура проекта с разделением на пакеты
- Добавлены интерфейсы для всех сервисов (Git, Quartz, Files, Build)
- Реализован Dependency Injection для сервисов
- Добавлены middleware для логирования, Request ID и Response Time
- Создан пакет конфигурации с валидацией
- Улучшено логирование через интерфейс
- Добавлены обработчики HTTP в отдельных пакетах
- Создана структура для тестирования
- Добавлены конфигурационные файлы и документация
This commit is contained in:
Andrey Epifancev
2025-08-11 19:45:54 +04:00
parent 1b340362be
commit 04cea69d6e
16 changed files with 1293 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
package services
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"go-webhook-server/internal/config"
"go-webhook-server/pkg/logger"
)
// QuartzService интерфейс для сборки Quartz сайта
type QuartzService interface {
BuildSite() error
InstallDependencies() error
}
// quartzServiceImpl реализация Quartz сервиса
type quartzServiceImpl struct {
config *config.Config
logger logger.Logger
}
// NewQuartzService создает новый экземпляр Quartz сервиса
func NewQuartzService(cfg *config.Config, log logger.Logger) QuartzService {
return &quartzServiceImpl{
config: cfg,
logger: log,
}
}
// BuildSite собирает сайт с помощью Quartz
func (q *quartzServiceImpl) BuildSite() error {
q.logger.Info("Building site with Quartz...")
// Проверяем существование package.json в директории Quartz
packageJSONPath := filepath.Join(q.config.Paths.Quartz, "package.json")
if _, err := os.Stat(packageJSONPath); os.IsNotExist(err) {
return fmt.Errorf("package.json not found in Quartz directory: %s", q.config.Paths.Quartz)
}
// Устанавливаем зависимости если необходимо
if err := q.InstallDependencies(); err != nil {
return fmt.Errorf("failed to install dependencies: %w", err)
}
// Выполняем сборку Quartz
cmd := exec.Command("npm", "run", "quartz", "build", "--", "-d", q.config.Paths.Obsidian)
cmd.Dir = q.config.Paths.Quartz
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
q.logger.Info("Executing Quartz build command...")
if err := cmd.Run(); err != nil {
return fmt.Errorf("failed to build Quartz site: %w", err)
}
q.logger.Info("Quartz build completed successfully")
return nil
}
// InstallDependencies устанавливает npm зависимости
func (q *quartzServiceImpl) InstallDependencies() error {
// Проверяем существование node_modules
nodeModulesPath := filepath.Join(q.config.Paths.Quartz, "node_modules")
if _, err := os.Stat(nodeModulesPath); os.IsNotExist(err) {
q.logger.Info("Installing npm dependencies...")
cmd := exec.Command("npm", "install")
cmd.Dir = q.config.Paths.Quartz
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return fmt.Errorf("failed to install npm dependencies: %w", err)
}
q.logger.Info("npm dependencies installed successfully")
} else {
q.logger.Debug("node_modules already exists, skipping npm install")
}
return nil
}