2023-12-29 11:30:20 +00:00
|
|
|
package app
|
|
|
|
|
|
|
|
import (
|
2024-01-11 18:20:33 +00:00
|
|
|
"codeword/internal/controller/promocode"
|
|
|
|
"codeword/internal/controller/recovery"
|
2023-12-29 11:30:20 +00:00
|
|
|
"codeword/internal/initialize"
|
|
|
|
"codeword/internal/repository"
|
|
|
|
httpserver "codeword/internal/server/http"
|
|
|
|
"codeword/internal/services"
|
2024-01-05 11:37:06 +00:00
|
|
|
"codeword/internal/worker/purge_worker"
|
2024-01-01 14:13:54 +00:00
|
|
|
"codeword/internal/worker/recovery_worker"
|
2023-12-29 11:30:20 +00:00
|
|
|
"context"
|
2023-12-29 18:02:50 +00:00
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
2023-12-29 11:30:20 +00:00
|
|
|
"go.uber.org/zap"
|
|
|
|
)
|
|
|
|
|
|
|
|
func Run(ctx context.Context, cfg initialize.Config, logger *zap.Logger) error {
|
|
|
|
logger.Info("Запуск приложения", zap.String("AppName", cfg.AppName))
|
|
|
|
|
2024-01-15 08:43:55 +00:00
|
|
|
ctx, cancel := context.WithCancel(ctx)
|
|
|
|
defer cancel()
|
|
|
|
|
2024-01-11 12:07:17 +00:00
|
|
|
mdb, err := initialize.MongoDB(ctx, cfg)
|
2023-12-29 12:41:26 +00:00
|
|
|
if err != nil {
|
|
|
|
logger.Error("Failed to initialize MongoDB", zap.Error(err))
|
2024-01-15 08:43:55 +00:00
|
|
|
cancel()
|
2023-12-29 12:41:26 +00:00
|
|
|
}
|
|
|
|
|
2024-01-11 12:07:17 +00:00
|
|
|
rdb, err := initialize.Redis(ctx, cfg)
|
|
|
|
encrypt := initialize.Encrypt(cfg)
|
2024-01-11 16:29:53 +00:00
|
|
|
|
2024-01-11 18:20:33 +00:00
|
|
|
promoCodeRepo := repository.NewPromoCodeRepository(mdb.Collection("promoCodes"))
|
2023-12-31 12:22:03 +00:00
|
|
|
codewordRepo := repository.NewCodewordRepository(repository.Deps{Rdb: rdb, Mdb: mdb.Collection("codeword")})
|
|
|
|
userRepo := repository.NewUserRepository(repository.Deps{Rdb: nil, Mdb: mdb.Collection("users")})
|
2024-01-11 16:29:53 +00:00
|
|
|
|
2024-01-05 11:37:06 +00:00
|
|
|
recoveryEmailSender := initialize.RecoveryEmailSender(cfg, logger)
|
|
|
|
authClient := initialize.AuthClient(cfg, logger)
|
2023-12-29 18:02:50 +00:00
|
|
|
|
|
|
|
recoveryService := services.NewRecoveryService(services.Deps{
|
2023-12-31 12:22:03 +00:00
|
|
|
Logger: logger,
|
|
|
|
CodewordRepository: codewordRepo,
|
|
|
|
UserRepository: userRepo,
|
2024-01-04 11:27:50 +00:00
|
|
|
Encrypt: encrypt,
|
2024-01-04 14:57:30 +00:00
|
|
|
AuthClient: authClient,
|
2023-12-29 18:02:50 +00:00
|
|
|
})
|
|
|
|
|
2024-01-11 16:29:53 +00:00
|
|
|
promoService := services.NewPromoCodeService(services.PromoDeps{
|
|
|
|
Logger: logger,
|
|
|
|
PromoCodeRepo: promoCodeRepo,
|
|
|
|
})
|
|
|
|
|
2024-01-11 18:20:33 +00:00
|
|
|
recoveryController := recovery.NewRecoveryController(logger, recoveryService, cfg.DefaultRedirectionURL)
|
|
|
|
promoCodeController := promocode.NewPromoCodeController(logger, promoService)
|
2023-12-29 12:41:26 +00:00
|
|
|
|
2024-01-03 13:50:11 +00:00
|
|
|
recoveryWC := recovery_worker.NewRecoveryWC(recovery_worker.Deps{
|
|
|
|
Logger: logger,
|
|
|
|
Redis: rdb,
|
|
|
|
EmailSender: recoveryEmailSender,
|
2024-01-03 15:45:41 +00:00
|
|
|
Mongo: mdb.Collection("codeword"),
|
2024-01-03 13:50:11 +00:00
|
|
|
})
|
2024-01-01 14:13:54 +00:00
|
|
|
|
2024-01-05 11:37:06 +00:00
|
|
|
purgeWC := purge_worker.NewRecoveryWC(purge_worker.Deps{
|
|
|
|
Logger: logger,
|
|
|
|
Mongo: mdb.Collection("codeword"),
|
|
|
|
})
|
|
|
|
|
2024-01-01 14:13:54 +00:00
|
|
|
go recoveryWC.Start(ctx)
|
2024-01-05 11:37:06 +00:00
|
|
|
go purgeWC.Start(ctx)
|
2024-01-01 14:13:54 +00:00
|
|
|
|
2023-12-29 11:30:20 +00:00
|
|
|
server := httpserver.NewServer(httpserver.ServerConfig{
|
2024-01-11 16:29:53 +00:00
|
|
|
Logger: logger,
|
|
|
|
RecoveryController: recoveryController,
|
|
|
|
PromoCodeController: promoCodeController,
|
2023-12-29 11:30:20 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
go func() {
|
2023-12-29 12:41:26 +00:00
|
|
|
if err := server.Start(cfg.HTTPHost + ":" + cfg.HTTPPort); err != nil {
|
2024-01-05 11:37:06 +00:00
|
|
|
logger.Error("Server startup error", zap.Error(err))
|
2023-12-29 11:30:20 +00:00
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
<-ctx.Done()
|
|
|
|
|
2024-01-11 12:07:17 +00:00
|
|
|
if err := shutdownApp(ctx, server, mdb, logger); err != nil {
|
2023-12-29 11:30:20 +00:00
|
|
|
return err
|
|
|
|
}
|
2024-01-05 11:37:06 +00:00
|
|
|
logger.Info("The application has stopped")
|
2023-12-29 11:30:20 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2023-12-29 18:02:50 +00:00
|
|
|
// TODO возможно стоит вынести в отдельные файлы или отказаться от разделения на отдельные методы
|
|
|
|
|
2024-01-11 12:07:17 +00:00
|
|
|
func shutdownApp(ctx context.Context, server *httpserver.Server, mdb *mongo.Database, logger *zap.Logger) error {
|
|
|
|
if err := shutdownHTTPServer(ctx, server, logger); err != nil {
|
2023-12-29 18:02:50 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2024-01-11 12:07:17 +00:00
|
|
|
if err := shutdownMongoDB(ctx, mdb, logger); err != nil {
|
2023-12-29 18:02:50 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2024-01-11 12:07:17 +00:00
|
|
|
func shutdownHTTPServer(ctx context.Context, server *httpserver.Server, logger *zap.Logger) error {
|
2023-12-29 11:30:20 +00:00
|
|
|
if err := server.Shutdown(ctx); err != nil {
|
2024-01-05 11:37:06 +00:00
|
|
|
logger.Error("Error stopping HTTP server", zap.Error(err))
|
2023-12-29 18:02:50 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2024-01-11 12:07:17 +00:00
|
|
|
func shutdownMongoDB(ctx context.Context, mdb *mongo.Database, logger *zap.Logger) error {
|
2023-12-29 18:02:50 +00:00
|
|
|
if err := mdb.Client().Disconnect(ctx); err != nil {
|
2024-01-05 11:37:06 +00:00
|
|
|
logger.Error("Error when closing MongoDB connection", zap.Error(err))
|
2023-12-29 11:30:20 +00:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|