Files
go-webhook/cmd/server/main.go
Andrey Epifancev 04cea69d6e refactor: разделение кода на пакеты и улучшение архитектуры
- Создана новая структура проекта с разделением на пакеты
- Добавлены интерфейсы для всех сервисов (Git, Quartz, Files, Build)
- Реализован Dependency Injection для сервисов
- Добавлены middleware для логирования, Request ID и Response Time
- Создан пакет конфигурации с валидацией
- Улучшено логирование через интерфейс
- Добавлены обработчики HTTP в отдельных пакетах
- Создана структура для тестирования
- Добавлены конфигурационные файлы и документация
2025-08-11 19:45:54 +04:00

77 lines
2.2 KiB
Go
Raw Permalink 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 main
import (
"context"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"go-webhook-server/api"
"go-webhook-server/internal/config"
"go-webhook-server/internal/handlers"
"go-webhook-server/internal/services"
"go-webhook-server/pkg/logger"
)
func main() {
// Инициализация логгера
log := logger.New()
log.Info("Starting go-webhook-server...")
// Загрузка конфигурации
cfg := config.Load()
if err := cfg.Validate(); err != nil {
log.Fatalf("Configuration validation failed: %v", err)
}
log.Infof("Configuration loaded: Port=%s, ObsidianPath=%s, QuartzPath=%s, PublicPath=%s, GitBranch=%s, GitRemote=%s",
cfg.Server.Port, cfg.Paths.Obsidian, cfg.Paths.Quartz, cfg.Paths.Public, cfg.Git.Branch, cfg.Git.Remote)
// Инициализация сервисов
gitService := services.NewGitService(cfg, log)
quartzService := services.NewQuartzService(cfg, log)
fileService := services.NewFileService(cfg, log)
buildService := services.NewBuildService(cfg, log, gitService, quartzService, fileService)
// Инициализация обработчиков
webhookHandler := handlers.NewWebhookHandler(buildService, log)
healthHandler := handlers.NewHealthHandler(log)
// Настройка роутов
router := api.SetupRoutes(webhookHandler, healthHandler, log)
// Создание HTTP сервера
addr := ":" + cfg.Server.Port
server := &http.Server{
Addr: addr,
Handler: router,
}
// Запуск сервера в горутине
go func() {
log.Infof("Starting webhook server on port %s", cfg.Server.Port)
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("Failed to start server: %v", err)
}
}()
// Ожидаем сигнал для graceful shutdown
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Info("Shutting down server...")
// Graceful shutdown с таймаутом
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(cfg.Server.Timeout)*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
log.Errorf("Server forced to shutdown: %v", err)
}
log.Info("Server exited")
}