package main import ( // "context" // "context" "context" "fmt" "log" "log/slog" "net/http" "os" "time" "github.com/go-playground/validator/v10" "go.uber.org/zap" // "github.com/gofiber/fiber/v2" "github.com/SamuelTariku/FortuneBet-Backend/internal/config" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" customlogger "github.com/SamuelTariku/FortuneBet-Backend/internal/logger" "github.com/SamuelTariku/FortuneBet-Backend/internal/logger/mongoLogger" // mongologger "github.com/SamuelTariku/FortuneBet-Backend/internal/logger/mongoLogger" // "github.com/SamuelTariku/FortuneBet-Backend/internal/logger/mongoLogger" "github.com/SamuelTariku/FortuneBet-Backend/internal/repository" // "github.com/SamuelTariku/FortuneBet-Backend/internal/router" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/arifpay" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/authentication" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/bet" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/bonus" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/branch" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/chapa" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/company" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/currency" enetpulse "github.com/SamuelTariku/FortuneBet-Backend/internal/services/enet_pulse" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/event" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/institutions" issuereporting "github.com/SamuelTariku/FortuneBet-Backend/internal/services/issue_reporting" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/league" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/messenger" notificationservice "github.com/SamuelTariku/FortuneBet-Backend/internal/services/notification" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/odds" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/raffle" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/recommendation" referralservice "github.com/SamuelTariku/FortuneBet-Backend/internal/services/referal" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/report" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/result" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/santimpay" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/settings" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/stats" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/telebirr" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/ticket" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/transaction" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/user" virtualgameservice "github.com/SamuelTariku/FortuneBet-Backend/internal/services/virtualGame" alea "github.com/SamuelTariku/FortuneBet-Backend/internal/services/virtualGame/Alea" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/virtualGame/atlas" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/virtualGame/veli" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/wallet" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/wallet/monitor" // "github.com/SamuelTariku/FortuneBet-Backend/internal/utils" httpserver "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server" jwtutil "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/jwt" customvalidator "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/validator" ) // @title FortuneBet API // @version 1.0.1 // @description This is server for FortuneBet. // @termsOfService http://swagger.io/terms/ // @contact.name API Support // @contact.url http://www.swagger.io/support // @contact.email support@swagger.io // @license.name Apache 2.0 // @license.url http://www.apache.org/licenses/LICENSE-2.0.html // @SecurityDefinitions.apiKey Bearer // @in header // @name Authorization // @BasePath / func main() { cfg, err := config.NewConfig() if err != nil { slog.Error("Config error:", "err", err) os.Exit(1) } db, _, err := repository.OpenDB(cfg.DbUrl) if err != nil { fmt.Println("Database error:", err) os.Exit(1) } logger := customlogger.NewLogger(cfg.Env, cfg.LogLevel) domain.MongoDBLogger, err = mongoLogger.InitLogger(cfg) if err != nil { log.Fatalf("Logger initialization failed: %v", err) } defer domain.MongoDBLogger.Sync() zap.ReplaceGlobals(domain.MongoDBLogger) store := repository.NewStore(db) v := customvalidator.NewCustomValidator(validator.New()) // Initialize services settingRepo := repository.NewSettingStore(store) if err := settingRepo.EnsureAllSettingsExist(context.Background()); err != nil { log.Fatalf("failed to ensure settings: %v", err) } settingSvc := settings.NewService(settingRepo) messengerSvc := messenger.NewService(settingSvc, cfg) statSvc := stats.NewService( repository.NewCompanyStatStore(store), repository.NewBranchStatStore(store), repository.NewEventStatStore(store), repository.NewBetStatStore(store), repository.NewWalletStatStore(store), ) authSvc := authentication.NewService( repository.NewUserStore(store), repository.NewTokenStore(store), cfg.RefreshExpiry, ) userSvc := user.NewService( repository.NewUserStore(store), repository.NewOTPStore(store), messengerSvc, cfg, ) leagueSvc := league.New(repository.NewLeagueStore(store)) eventSvc := event.New( cfg.Bet365Token, repository.NewEventStore(store), repository.NewEventHistoryStore(store), *leagueSvc, settingSvc, domain.MongoDBLogger, cfg, ) marketSettingRepo := repository.NewMarketSettingStore(store) if err := marketSettingRepo.EnsureAllMarketSettingsExist(context.Background()); err != nil { log.Fatalf("failed to ensure market settings: %v", err) } oddsSvc := odds.New( repository.NewOddStore(store), marketSettingRepo, cfg, eventSvc, logger, domain.MongoDBLogger, ) // virtuaGamesRepo := repository.NewVirtualGameRepository(store) // Initialize producer // topic := "wallet-balance-topic" // producer := kafka.NewProducer(cfg.KafkaBrokers, topic) notificationSvc := notificationservice.New( repository.NewNotificationStore(store), domain.MongoDBLogger, logger, cfg, messengerSvc, userSvc, ) walletSvc := wallet.NewService( repository.NewWalletStore(store), repository.NewTransferStore(store), repository.NewDirectDepositStore(store), notificationSvc, userSvc, domain.MongoDBLogger, logger, ) branchSvc := branch.NewService(repository.NewBranchStore(store)) companySvc := company.NewService(repository.NewCompanyStore(store)) ticketSvc := ticket.NewService( repository.NewTicketStore(store), eventSvc, *oddsSvc, domain.MongoDBLogger, settingSvc, ) betSvc := bet.NewService( repository.NewBetStore(store), eventSvc, *oddsSvc, *walletSvc, *branchSvc, *companySvc, *settingSvc, *userSvc, notificationSvc, logger, domain.MongoDBLogger, ) resultSvc := result.NewService( repository.NewResultLogStore(store), cfg, logger, domain.MongoDBLogger, *betSvc, *oddsSvc, eventSvc, leagueSvc, notificationSvc, messengerSvc, *userSvc, ) bonusSvc := bonus.NewService( repository.NewBonusStore(store), walletSvc, settingSvc, notificationSvc, domain.MongoDBLogger, ) vitualGameRepo := repository.NewVirtualGameRepository(store) recommendationRepo := repository.NewRecommendationRepository(store) referalSvc := referralservice.New( repository.NewReferralStore(store), *walletSvc, *settingSvc, cfg, logger, domain.MongoDBLogger, ) raffleSvc := raffle.NewService( repository.NewRaffleStore(store), ) virtualGameSvc := virtualgameservice.New(vitualGameRepo, *walletSvc, store, cfg, logger) aleaService := alea.NewAleaPlayService(vitualGameRepo, *walletSvc, cfg, logger) veliCLient := veli.NewClient(cfg, walletSvc) veliVirtualGameService := veli.New(virtualGameSvc, vitualGameRepo, veliCLient, walletSvc, repository.NewTransferStore(store), domain.MongoDBLogger, cfg) atlasClient := atlas.NewClient(cfg, walletSvc) atlasVirtualGameService := atlas.New(virtualGameSvc, vitualGameRepo, atlasClient, walletSvc, repository.NewTransferStore(store), cfg) recommendationSvc := recommendation.NewService(recommendationRepo) chapaClient := chapa.NewClient(cfg.CHAPA_BASE_URL, cfg.CHAPA_SECRET_KEY) chapaSvc := chapa.NewService( repository.NewTransferStore(store), *walletSvc, repository.NewUserStore(store), cfg, chapaClient, ) currRepo := repository.NewCurrencyPostgresRepository(store) fixerFertcherSvc := currency.NewFixerFetcher( cfg.FIXER_API_KEY, cfg.FIXER_BASE_URL, ) transactionSvc := transaction.NewService( repository.NewTransactionStore(store), *branchSvc, *betSvc, *walletSvc, *userSvc, ) reportSvc := report.NewService( repository.NewReportStore(store), repository.NewBetStore(store), repository.NewWalletStore(store), repository.NewTransactionStore(store), repository.NewBranchStore(store), repository.NewUserStore(store), repository.NewOldRepositoryStore(store), repository.NewCompanyStore(store), repository.NewVirtualGameRepository(store), repository.NewNotificationStore(store), notificationSvc, statSvc, logger, domain.MongoDBLogger, cfg, ) enePulseSvc := enetpulse.New( *cfg, store, ) go httpserver.SetupReportandVirtualGameCronJobs(context.Background(), reportSvc, veliVirtualGameService, "C:/Users/User/Desktop") go httpserver.StartEnetPulseCron(enePulseSvc, domain.MongoDBLogger) go httpserver.ProcessBetCashback(context.TODO(), betSvc) bankRepository := repository.NewBankRepository(store) instSvc := institutions.New(bankRepository) // Initialize report worker with CSV exporter // csvExporter := infrastructure.CSVExporter{ // ExportPath: cfg.ReportExportPath, // Make sure to add this to your config // } // reportWorker := worker.NewReportWorker( // reportSvc, // csvExporter, // ) // Start cron jobs for automated reporting enetPulseSvc := enetpulse.New( *cfg, store, ) // Initialize wallet monitoring service walletMonitorSvc := monitor.NewService( *walletSvc, *branchSvc, notificationSvc, logger, 5*time.Minute, ) currSvc := currency.NewService( currRepo, cfg.BASE_CURRENCY, fixerFertcherSvc, ) exchangeWorker := currency.NewExchangeRateWorker(fixerFertcherSvc, logger, cfg) exchangeWorker.Start(context.Background()) defer exchangeWorker.Stop() go walletMonitorSvc.Start() httpserver.StartBetAPIDataFetchingCrons(eventSvc, *oddsSvc, resultSvc, domain.MongoDBLogger) httpserver.StartCleanupCrons(*ticketSvc, notificationSvc, domain.MongoDBLogger) httpserver.StartStatCrons(statSvc, domain.MongoDBLogger) httpserver.StartReportCrons(reportSvc, domain.MongoDBLogger) issueReportingRepo := repository.NewReportedIssueRepository(store) issueReportingSvc := issuereporting.New(issueReportingRepo) transferStore := repository.NewTransferStore(store) // walletStore := wallet.WalletStore(store) arifpaySvc := arifpay.NewArifpayService(cfg, transferStore, walletSvc, &http.Client{ Timeout: 30 * time.Second}) santimpayClient := santimpay.NewSantimPayClient(cfg) santimpaySvc := santimpay.NewSantimPayService(santimpayClient, cfg, transferStore, walletSvc) telebirrSvc := telebirr.NewTelebirrService(cfg, transferStore, walletSvc) // Initialize and start HTTP server app := httpserver.NewApp( enetPulseSvc, atlasVirtualGameService, veliVirtualGameService, telebirrSvc, arifpaySvc, santimpaySvc, issueReportingSvc, instSvc, currSvc, cfg.Port, v, settingSvc, authSvc, logger, jwtutil.JwtConfig{ JwtAccessKey: cfg.JwtKey, JwtAccessExpiry: cfg.AccessExpiry, }, userSvc, ticketSvc, betSvc, reportSvc, // Make sure httpserver.NewApp accepts this parameter chapaSvc, walletSvc, transactionSvc, branchSvc, companySvc, notificationSvc, oddsSvc, eventSvc, leagueSvc, referalSvc, raffleSvc, bonusSvc, virtualGameSvc, aleaService, // veliService, recommendationSvc, resultSvc, statSvc, cfg, domain.MongoDBLogger, ) logger.Info("Starting server", "port", cfg.Port) if err := app.Run(); err != nil { logger.Error("Failed to start server", "error", err) os.Exit(1) } select {} }