package main import ( // "context" // "context" "Yimaru-Backend/internal/config" "Yimaru-Backend/internal/domain" customlogger "Yimaru-Backend/internal/logger" "Yimaru-Backend/internal/logger/mongoLogger" "Yimaru-Backend/internal/repository" "Yimaru-Backend/internal/services/arifpay" "Yimaru-Backend/internal/services/authentication" "Yimaru-Backend/internal/services/currency" notificationservice "Yimaru-Backend/internal/services/notification" "Yimaru-Backend/internal/services/recommendation" referralservice "Yimaru-Backend/internal/services/referal" "Yimaru-Backend/internal/services/transaction" "Yimaru-Backend/internal/services/user" httpserver "Yimaru-Backend/internal/web_server" jwtutil "Yimaru-Backend/internal/web_server/jwt" customvalidator "Yimaru-Backend/internal/web_server/validator" "fmt" "log" "log/slog" "net/http" "os" "time" "github.com/go-playground/validator/v10" "go.uber.org/zap" ) // @title Yimaru API // @version 1.0.1 // @description This is server for Yimaru. // @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), // ) 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, ) // / := 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 := ticke.NewService( // repository.NewTicketStore(store), // // eventSvc, // // *oddsSvc, // domain.MongoDBLogger, // settingSvc, // ) // betSvc := bet.NewService( // repository.NewBetStore(store), // eventSvc, // *oddsSvc, // , // *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), settingSvc, notificationSvc, domain.MongoDBLogger, ) // virtualGamesRepo := repository.NewVirtualGameRepository(store) recommendationRepo := repository.NewRecommendationRepository(store) referalSvc := referralservice.New( repository.NewReferralStore(store), *settingSvc, cfg, logger, domain.MongoDBLogger, ) raffleSvc := raffle.NewService( repository.NewRaffleStore(store), ) // virtualGameSvc := virtualgameservice.New(virtualGamesRepo,, store, cfg, logger) // aleaService := alea.NewAleaPlayService(virtualGamesRepo,, cfg, logger) // veliCLient := veli.NewClient(cfg) // veliVirtualGameService := veli.New(virtualGameSvc, virtualGamesRepo, *store, veliCLient, repository.NewTransferStore(store), domain.MongoDBLogger, cfg) // orchestrationSvc := orchestration.New( // virtualGameSvc, // virtualGamesRepo, // cfg, // veliCLient, // ) // atlasClient := atlas.NewClient(cfg) // atlasVirtualGameService := atlas.New(virtualGameSvc, virtualGamesRepo, atlasClient, repository.NewTransferStore(store), cfg) recommendationSvc := recommendation.NewService(recommendationRepo) // chapaClient := chapa.NewClient(cfg.CHAPA_BASE_URL, cfg.CHAPA_SECRET_KEY) // chapaSvc := chapa.NewService( // 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, *userSvc, ) // reportSvc := report.NewService( // repository.NewVirtualGameReportStore(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.StartEnetPulseCron(enePulseSvc, domain.MongoDBLogger) // go httpserver.SetupReportandVirtualGameCronJobs(context.Background(), reportSvc, orchestrationSvc, "C:/Users/User/Desktop") // 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 // directdeposit := directdeposit.NewService( // repository.NewDirectDepositRepository(store), // notificationSvc, // userSvc, // ) // enetPulseSvc := enetpulse.New( // *cfg, // store, // ) // Initialize wallet monitoring service // walletMonitorSvc := monitor.NewService( // , // *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, *transactionSvc, &http.Client{ Timeout: 30 * time.Second}) // santimpayClient := santimpay.NewSantimPayClient(cfg) // santimpaySvc := santimpay.NewSantimPayService(santimpayClient, cfg, transferStore) // telebirrSvc := telebirr.NewTelebirrService(cfg, transferStore) // Initialize and start HTTP server app := httpserver.NewApp( // directdeposit, // telebirrSvc, arifpaySvc, // santimpaySvc, issueReportingSvc, instSvc, currSvc, cfg.Port, v, settingSvc, authSvc, logger, jwtutil.JwtConfig{ JwtAccessKey: cfg.JwtKey, JwtAccessExpiry: cfg.AccessExpiry, }, userSvc, // chapaSvc, transactionSvc, branchSvc, companySvc, notificationSvc, referalSvc, raffleSvc, bonusSvc, recommendationSvc, 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 {} }