package app import ( "codeword/internal/adapters/client" controller "codeword/internal/controller/recovery" "codeword/internal/initialize" "codeword/internal/repository" httpserver "codeword/internal/server/http" "codeword/internal/services" "context" "go.uber.org/zap" "time" ) func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger) error { logger.Info("Запуск приложения", zap.String("AppName", cfg.AppName)) userRepo := repository.NewUserRepository() recoveryEmailSender := &client.RecoveryEmailSender{} recoveryService := services.NewRecoveryService(logger, userRepo, recoveryEmailSender) recoveryController := controller.NewRecoveryController(logger, recoveryService) server := httpserver.NewServer(httpserver.ServerConfig{ Logger: logger, Repo: userRepo, RecoveryController: recoveryController, }) go func() { if err := server.Start(":3000"); err != nil { logger.Error("Ошибка запуска сервера", zap.Error(err)) } }() <-ctx.Done() if err := shutdownApp(server, logger); err != nil { return err } logger.Info("Приложение остановлено") return nil } func shutdownApp(server *httpserver.Server, logger *zap.Logger) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { logger.Error("Ошибка при остановке сервера Fiber", zap.Error(err)) return err } return nil }