package app import ( "codeword/internal/controllers" "codeword/internal/repository" "codeword/internal/server/http" "codeword/internal/service" "context" "go.uber.org/zap" ) type Config struct { AppName string `env:"APP_NAME"` } func Run(ctx context.Context, config Config, logger *zap.Logger) error { defer func() { if r := recover(); r != nil { logger.Error("Recovered from a panic", zap.Any("error", r)) } }() logger.Info("App started", zap.Any("config", config)) ctx, cancel := context.WithCancel(ctx) defer cancel() // Инициализация репозиториев promocodeRepository := repository.NewPromocodeRepository() recoverRepository := repository.NewRecoverRepository() statsRepository := repository.NewStatsRepository() // Инициализация сервисов promocodeService := service.NewPromocodeService(promocodeRepository) recoverService := service.NewRecoverService(recoverRepository) statsService := service.NewStatsService(statsRepository) // Инициализация контроллеров promocodeController := controllers.NewPromocodeController(promocodeService) recoverController := controllers.NewRecoverController(recoverService) statsController := controllers.NewStatsController(statsService) // Создание сервера server := http.NewServer(http.ServerConfig{ Controllers: []http.Controller{ promocodeController, recoverController, statsController, }, }) go func() { err := server.Start("Host + : + Port") if err != nil { logger.Error("Server startup error", zap.Error(err)) cancel() } }() // Вывод маршрутов server.ListRoutes() <-ctx.Done() logger.Info("App shutting down gracefully") //TODO // Остановка сервера return nil }