371 lines
9.9 KiB
Go
371 lines
9.9 KiB
Go
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/assessment"
|
|
"Yimaru-Backend/internal/services/authentication"
|
|
issuereporting "Yimaru-Backend/internal/services/issue_reporting"
|
|
"Yimaru-Backend/internal/services/messenger"
|
|
notificationservice "Yimaru-Backend/internal/services/notification"
|
|
"Yimaru-Backend/internal/services/recommendation"
|
|
"Yimaru-Backend/internal/services/settings"
|
|
"context"
|
|
|
|
// 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),
|
|
*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)
|
|
|
|
assessmentSvc := assessment.NewService(
|
|
repository.NewUserStore(store),
|
|
repository.NewInitialAssessmentStore(store),
|
|
notificationSvc,
|
|
cfg,
|
|
)
|
|
|
|
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(
|
|
assessmentSvc,
|
|
arifpaySvc,
|
|
issueReportingSvc,
|
|
cfg.Port,
|
|
v,
|
|
settingSvc,
|
|
authSvc,
|
|
logger,
|
|
jwtutil.JwtConfig{
|
|
JwtAccessKey: cfg.JwtKey,
|
|
JwtAccessExpiry: cfg.AccessExpiry,
|
|
},
|
|
userSvc,
|
|
transactionSvc,
|
|
notificationSvc,
|
|
recommendationSvc,
|
|
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 {}
|
|
}
|