package app import ( "amocrm/internal/controllers" "amocrm/internal/repository" "amocrm/internal/server/http" "amocrm/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() // Инициализация репозиториев accountRepository := repository.NewAccountRepository() differentRepository := repository.NewDifferentRepository() // Инициализация сервисов accountService := service.NewAccountService(accountRepository) differentService := service.NewDifferentService(differentRepository) // Инициализация контроллеров accountController := controllers.NewAccountController(accountService) differentController := controllers.NewDifferentController(differentService) // Создание сервера server := http.NewServer(http.ServerConfig{ Controllers: []http.Controller{ accountController, differentController, }, }) 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 }