2023-06-22 09:36:43 +00:00
package callback
import (
"context"
"log"
2024-05-09 18:14:53 +00:00
"fmt"
2023-06-22 09:36:43 +00:00
"go.uber.org/zap"
2024-11-18 07:23:41 +00:00
"gitea.pena/PenaSide/customer/internal/errors"
"gitea.pena/PenaSide/customer/internal/models"
2024-05-09 18:14:53 +00:00
tb "gopkg.in/tucnak/telebot.v2"
2023-06-22 09:36:43 +00:00
)
type accountRepository interface {
FindByUserID ( context . Context , string ) ( * models . Account , errors . Error )
}
type historyService interface {
CreateHistory ( ctx context . Context , history * models . History ) ( * models . History , errors . Error )
}
type walletService interface {
ReplenishAccountWallet ( context . Context , * models . ReplenishAccountWallet ) ( * models . Account , errors . Error )
}
type PaymentCallbackServiceDeps struct {
Logger * zap . Logger
AccountRepository accountRepository
WalletService walletService
HistoryService historyService
2024-05-09 18:14:53 +00:00
Notifier * tb . Bot
NotifyChannel int64
AdminURL string
2023-06-22 09:36:43 +00:00
}
type PaymentCallbackService struct {
logger * zap . Logger
accountRepository accountRepository
walletService walletService
historyService historyService
2024-05-09 18:14:53 +00:00
notifier * tb . Bot
notifyChannel int64
adminURL string
2023-06-22 09:36:43 +00:00
}
func NewPaymentCallbackService ( deps PaymentCallbackServiceDeps ) * PaymentCallbackService {
if deps . Logger == nil {
log . Panicln ( "logger is nil on <New (payment callback service)>" )
}
if deps . AccountRepository == nil {
log . Panicln ( "AccountRepository is nil on <New (payment callback service)>" )
}
if deps . WalletService == nil {
log . Panicln ( "WalletService is nil on <New (payment callback service)>" )
}
if deps . HistoryService == nil {
log . Panicln ( "HistoryService is nil on <New (payment callback service)>" )
}
return & PaymentCallbackService {
logger : deps . Logger ,
accountRepository : deps . AccountRepository ,
walletService : deps . WalletService ,
historyService : deps . HistoryService ,
2024-05-09 18:14:53 +00:00
notifier : deps . Notifier ,
notifyChannel : deps . NotifyChannel ,
adminURL : deps . AdminURL ,
2023-06-22 09:36:43 +00:00
}
}
func ( receiver * PaymentCallbackService ) SuccessEvent ( ctx context . Context , event * models . PaymentEvent ) errors . Error {
account , err := receiver . accountRepository . FindByUserID ( ctx , event . UserID )
if err != nil {
receiver . logger . Error ( "failed to get account on <SuccessEvent> of <PaymentCallbackService>" , zap . Error ( err ) )
return err
}
if account . Wallet . LastPaymentID == event . PaymentID {
receiver . logger . Info ( "payment already was executed on <SuccessEvent> of <PaymentCallbackService>" , zap . String ( "paymentID" , event . PaymentID ) )
return nil
}
if _ , err := receiver . walletService . ReplenishAccountWallet ( ctx , & models . ReplenishAccountWallet {
Cash : event . Amount ,
Currency : event . Currency ,
PaymentID : event . PaymentID ,
Account : account ,
} ) ; err != nil {
receiver . logger . Error ( "failed to replenish wallet on <SuccessEvent> of <PaymentCallbackService>" , zap . Error ( err ) )
return err
}
2024-03-17 22:13:56 +00:00
//go func() {
2024-07-12 09:37:56 +00:00
if _ , err := receiver . historyService . CreateHistory ( ctx , & models . History {
UserID : account . UserID ,
Comment : event . Message ,
Key : event . Key ,
RawDetails : models . RawDetails {
Price : event . Amount ,
Comment : event . Type + ":" + event . Currency ,
} ,
} ) ; err != nil {
receiver . logger . Error ( "failed to create history on <SuccessEvent> of <PaymentCallbackService>" , zap . Error ( err ) )
return err
}
2024-03-17 22:13:56 +00:00
//}()
2024-05-09 18:14:53 +00:00
go func ( ) {
if _ , err := receiver . notifier . Send ( tb . ChatID ( receiver . notifyChannel ) , fmt . Sprintf ( ` Внесены деньги %.2f, пользователем %s ` , float64 ( event . Amount / 100 ) , receiver . adminURL + "/users/" + account . UserID ) ) ; err != nil {
fmt . Println ( "TBOER" , err )
}
} ( )
2023-06-22 09:36:43 +00:00
return nil
}
func ( receiver * PaymentCallbackService ) FailureEvent ( ctx context . Context , event * models . PaymentEvent ) errors . Error {
if _ , err := receiver . historyService . CreateHistory ( ctx , & models . History {
2024-07-12 09:37:56 +00:00
UserID : event . UserID ,
Comment : event . Message ,
Key : event . Key ,
// RawDetails: fmt.Sprintf("%d%s", event.Amount, event.Currency),
2023-06-22 09:36:43 +00:00
} ) ; err != nil {
receiver . logger . Error ( "failed to create history on <FailureEvent> of <PaymentCallbackService>" , zap . Error ( err ) )
return err
}
return nil
}