2023-06-13 13:22:51 +00:00
package payment
import (
"context"
"fmt"
"go.uber.org/zap"
2024-12-16 13:47:40 +00:00
"gitea.pena/PenaSide/treasurer/internal/errors"
"gitea.pena/PenaSide/treasurer/internal/models"
"gitea.pena/PenaSide/treasurer/internal/models/yandex"
"gitea.pena/PenaSide/treasurer/internal/utils"
2023-06-13 13:22:51 +00:00
)
type PaymentStrategyService interface {
2024-04-17 22:35:13 +00:00
CreatePaymentBankCard ( ctx context . Context , uuid string , payment * models . CreatePayment [ yandex . Receipt ] ) ( * models . CreatePaymentResult , errors . Error )
CreatePayment ( ctx context . Context , uuid string , payment * models . CreatePayment [ yandex . Receipt ] ) ( * models . CreatePaymentResult , errors . Error )
2023-06-13 13:22:51 +00:00
}
type PaymentRepository interface {
Insert ( context . Context , * models . Payment ) ( * models . Payment , errors . Error )
}
type Deps struct {
Logger * zap . Logger
PaymentStrategyService PaymentStrategyService
PaymentRepository PaymentRepository
}
type Service struct {
logger * zap . Logger
paymentStrategyService PaymentStrategyService
paymentRepository PaymentRepository
}
func New ( deps Deps ) ( * Service , errors . Error ) {
if deps . Logger == nil {
return nil , errors . NewWithMessage ( "logger is nil on <NewCallbackClient>" , errors . ErrInvalidArgs )
}
if deps . PaymentStrategyService == nil {
return nil , errors . NewWithMessage ( "PaymentStrategyService is nil on <NewCallbackClient>" , errors . ErrInvalidArgs )
}
if deps . PaymentRepository == nil {
return nil , errors . NewWithMessage ( "PaymentRepository is nil on <NewCallbackClient>" , errors . ErrInvalidArgs )
}
return & Service {
logger : deps . Logger ,
paymentStrategyService : deps . PaymentStrategyService ,
paymentRepository : deps . PaymentRepository ,
} , nil
}
2024-04-17 22:35:13 +00:00
func ( receiver * Service ) CreatePaymentBankCard ( ctx context . Context , request * models . CreatePayment [ yandex . Receipt ] ) ( string , errors . Error ) {
2024-05-02 18:34:32 +00:00
receiver . logger . Info ( "f<CreatePaymentBankCard> of <YandexPaymentService>" , zap . Any ( "Customer" , request . Requisites . Customer ) , zap . Any ( "Items" , request . Requisites . Items ) )
2023-06-13 13:22:51 +00:00
paymentUUID , generateErr := utils . GenerateUUID ( )
if generateErr != nil {
receiver . logger . Error ( "failed to generate uuid on <CreatePaymentBankCard> of <PaymentService>" , zap . Error ( generateErr ) )
return "" , errors . NewWithError ( fmt . Errorf ( "failed to generate uuid: %w" , generateErr ) , errors . ErrInternalError )
}
response , err := receiver . paymentStrategyService . CreatePaymentBankCard ( ctx , paymentUUID , request )
if err != nil {
receiver . logger . Error ( "failed to create payment on <CreatePaymentBankCard> of <PaymentService>" , zap . Error ( err ) )
return "" , err
}
if _ , err := receiver . paymentRepository . Insert ( ctx , response . Payment ) ; err != nil {
receiver . logger . Error ( "failed to insert payment on <CreatePaymentBankCard> of <PaymentService>" , zap . Error ( err ) )
return "" , err
}
return response . RedirectURL , nil
}
2024-04-17 22:35:13 +00:00
func ( receiver * Service ) CreatePayment ( ctx context . Context , request * models . CreatePayment [ yandex . Receipt ] ) ( string , errors . Error ) {
2023-06-13 13:22:51 +00:00
paymentUUID , generateErr := utils . GenerateUUID ( )
if generateErr != nil {
receiver . logger . Error ( "failed to generate uuid on <CreatePayment> of <PaymentService>" , zap . Error ( generateErr ) )
return "" , errors . NewWithError ( fmt . Errorf ( "failed to generate uuid: %w" , generateErr ) , errors . ErrInternalError )
}
response , err := receiver . paymentStrategyService . CreatePayment ( ctx , paymentUUID , request )
if err != nil {
receiver . logger . Error ( "failed to create payment on <CreatePayment> of <PaymentService>" , zap . Error ( err ) )
return "" , err
}
if _ , err := receiver . paymentRepository . Insert ( ctx , response . Payment ) ; err != nil {
receiver . logger . Error ( "failed to insert payment on <CreatePayment> of <PaymentService>" , zap . Error ( err ) )
return "" , err
}
return response . RedirectURL , nil
}