Yimaru-BackEnd/cmd/main.go

428 lines
12 KiB
Go

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/orchestration"
"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,
)
virtualGamesRepo := 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(virtualGamesRepo, *walletSvc, store, cfg, logger)
aleaService := alea.NewAleaPlayService(virtualGamesRepo, *walletSvc, cfg, logger)
veliCLient := veli.NewClient(cfg, walletSvc)
veliVirtualGameService := veli.New(virtualGameSvc, virtualGamesRepo, *store, veliCLient, walletSvc, repository.NewTransferStore(store), domain.MongoDBLogger, cfg)
orchestrationSvc := orchestration.New(
virtualGameSvc,
virtualGamesRepo,
cfg,
veliCLient,
)
atlasClient := atlas.NewClient(cfg, walletSvc)
atlasVirtualGameService := atlas.New(virtualGameSvc, virtualGamesRepo, 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.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
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,
orchestrationSvc,
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 {}
}