codeword/internal/app/app.go
2023-12-29 14:30:20 +03:00

53 lines
1.5 KiB
Go

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
}