package wallet import ( "context" "errors" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" ) type Service struct { walletStore WalletStore } func NewService(walletStore WalletStore) *Service { return &Service{ walletStore: walletStore, } } var ( ErrBalanceInsufficient = errors.New("wallet balance is insufficient") ) func (s *Service) CreateWallet(ctx context.Context, wallet domain.CreateWallet) (domain.Wallet, error) { return s.walletStore.CreateWallet(ctx, wallet) } func (s *Service) CreateCustomerWallet(ctx context.Context, customerID int64, companyID int64) (domain.CustomerWallet, error) { regularWallet, err := s.CreateWallet(ctx, domain.CreateWallet{ IsWithdraw: true, IsBettable: true, UserID: customerID, }) if err != nil { return domain.CustomerWallet{}, err } staticWallet, err := s.CreateWallet(ctx, domain.CreateWallet{ IsWithdraw: false, IsBettable: true, UserID: customerID, }) if err != nil { return domain.CustomerWallet{}, err } return s.walletStore.CreateCustomerWallet(ctx, domain.CreateCustomerWallet{ CustomerID: customerID, CompanyID: companyID, RegularWalletID: regularWallet.ID, StaticWalletID: staticWallet.ID, }) } func (s *Service) GetWalletByID(ctx context.Context, id int64) (domain.Wallet, error) { return s.walletStore.GetWalletByID(ctx, id) } func (s *Service) GetAllWallets(ctx context.Context) ([]domain.Wallet, error) { return s.walletStore.GetAllWallets(ctx) } func (s *Service) GetWalletsByUser(ctx context.Context, id int64) ([]domain.Wallet, error) { return s.walletStore.GetWalletsByUser(ctx, id) } func (s *Service) GetCustomerWallet(ctx context.Context, customerID int64, companyID int64) (domain.GetCustomerWallet, error) { return s.walletStore.GetCustomerWallet(ctx, customerID, companyID) } func (s *Service) UpdateBalance(ctx context.Context, id int64, balance domain.Currency) error { return s.walletStore.UpdateBalance(ctx, id, balance) } func (s *Service) Add(ctx context.Context, id int64, amount domain.Currency) error { wallet, err := s.GetWalletByID(ctx, id) if err != nil { return err } return s.walletStore.UpdateBalance(ctx, id, wallet.Balance+amount) } func (s *Service) Deduct(ctx context.Context, id int64, amount domain.Currency) error { wallet, err := s.GetWalletByID(ctx, id) if err != nil { return err } if wallet.Balance < amount { return ErrBalanceInsufficient } return s.walletStore.UpdateBalance(ctx, id, wallet.Balance+amount) } func (s *Service) UpdateWalletActive(ctx context.Context, id int64, isActive bool) error { return s.walletStore.UpdateWalletActive(ctx, id, isActive) }