2023-06-22 09:36:43 +00:00
|
|
|
package payment
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"log"
|
|
|
|
|
2024-11-18 07:23:41 +00:00
|
|
|
"gitea.pena/PenaSide/customer/internal/errors"
|
|
|
|
"gitea.pena/PenaSide/customer/internal/models"
|
|
|
|
"gitea.pena/PenaSide/customer/internal/proto/treasurer"
|
2024-11-26 15:28:42 +00:00
|
|
|
"go.uber.org/zap"
|
2023-06-22 09:36:43 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type paymentClient interface {
|
2024-04-18 17:10:23 +00:00
|
|
|
GetPaymentLinkBankCard(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error)
|
|
|
|
GetPaymentLinkYooMoney(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error)
|
|
|
|
GetPaymentLinkSberPay(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error)
|
|
|
|
GetPaymentLinkTinkoff(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error)
|
|
|
|
GetPaymentLinkSberbankB2B(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error)
|
2023-06-22 09:36:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type authClient interface {
|
|
|
|
GetUser(ctx context.Context, userID string) (*models.User, errors.Error)
|
|
|
|
}
|
|
|
|
|
|
|
|
type Deps struct {
|
2024-11-26 15:28:42 +00:00
|
|
|
Logger *zap.Logger
|
|
|
|
GRPCDomain string
|
|
|
|
PaymentClient paymentClient
|
|
|
|
AuthClient authClient
|
2023-06-22 09:36:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type Service struct {
|
2024-11-26 15:28:42 +00:00
|
|
|
logger *zap.Logger
|
|
|
|
grpcDomain string
|
|
|
|
paymentClient paymentClient
|
|
|
|
authClient authClient
|
2023-06-22 09:36:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func New(deps Deps) *Service {
|
|
|
|
if deps.Logger == nil {
|
|
|
|
log.Panicln("logger is nil on <New (payment service)>")
|
|
|
|
}
|
|
|
|
|
2024-11-26 15:28:42 +00:00
|
|
|
if deps.GRPCDomain == "" {
|
2023-06-22 09:36:43 +00:00
|
|
|
log.Panicln("ConfigurationGRPC is nil on <New (payment service)>")
|
|
|
|
}
|
|
|
|
|
|
|
|
if deps.PaymentClient == nil {
|
|
|
|
log.Panicln("PaymentClient is nil on <New (payment service)>")
|
|
|
|
}
|
|
|
|
|
|
|
|
if deps.AuthClient == nil {
|
|
|
|
log.Panicln("AuthClient is nil on <New (payment service)>")
|
|
|
|
}
|
|
|
|
|
|
|
|
return &Service{
|
2024-11-26 15:28:42 +00:00
|
|
|
logger: deps.Logger,
|
|
|
|
paymentClient: deps.PaymentClient,
|
|
|
|
authClient: deps.AuthClient,
|
|
|
|
grpcDomain: deps.GRPCDomain,
|
2023-06-22 09:36:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (receiver *Service) GetPaymentLink(ctx context.Context, request *models.GetPaymentLinkRequest) (string, errors.Error) {
|
|
|
|
if _, userErr := receiver.authClient.GetUser(ctx, request.UserID); userErr != nil {
|
|
|
|
receiver.logger.Error("failed to get user on <GetPaymentLink> on <PaymentService>",
|
|
|
|
zap.Error(userErr),
|
|
|
|
zap.String("userID", request.UserID),
|
|
|
|
)
|
|
|
|
|
|
|
|
return "", userErr
|
|
|
|
}
|
|
|
|
|
|
|
|
switch request.Body.Type {
|
|
|
|
case models.PaymentTypeBankCard:
|
|
|
|
return receiver.GetPaymentLinkBankCard(ctx, request)
|
|
|
|
case models.PaymentTypeYoomoney:
|
|
|
|
return receiver.GetPaymentLinkYooMoney(ctx, request)
|
|
|
|
case models.PaymentTypeSberPay:
|
|
|
|
return receiver.GetPaymentLinkSberPay(ctx, request)
|
|
|
|
case models.PaymentTypeTinkoff:
|
|
|
|
return receiver.GetPaymentLinkTinkoff(ctx, request)
|
|
|
|
}
|
|
|
|
|
|
|
|
return "", errors.NewWithMessage("invalid payment method type", errors.ErrInvalidArgs)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (receiver *Service) GetPaymentLinkBankCard(ctx context.Context, request *models.GetPaymentLinkRequest) (string, errors.Error) {
|
2024-04-18 17:10:23 +00:00
|
|
|
link, err := receiver.paymentClient.GetPaymentLinkBankCard(ctx, &treasurer.GetPaymentLinkRequest{
|
2023-06-22 09:36:43 +00:00
|
|
|
MainSettings: &treasurer.MainPaymentSettings{
|
|
|
|
Currency: request.Body.Currency,
|
|
|
|
Amount: request.Body.Amount,
|
|
|
|
UserID: request.UserID,
|
|
|
|
ClientIP: request.ClientIP,
|
2024-11-26 15:28:42 +00:00
|
|
|
CallbackHostGRPC: []string{receiver.grpcDomain},
|
2023-06-22 09:36:43 +00:00
|
|
|
ReturnURL: request.Body.ReturnURL,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
receiver.logger.Error("failed to get bankcard payment link on <GetPaymentLinkBankCard> of <PaymentService>", zap.Error(err))
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return link, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (receiver *Service) GetPaymentLinkYooMoney(ctx context.Context, request *models.GetPaymentLinkRequest) (string, errors.Error) {
|
2024-04-18 17:10:23 +00:00
|
|
|
link, err := receiver.paymentClient.GetPaymentLinkYooMoney(ctx, &treasurer.GetPaymentLinkRequest{
|
2023-06-22 09:36:43 +00:00
|
|
|
MainSettings: &treasurer.MainPaymentSettings{
|
|
|
|
Currency: request.Body.Currency,
|
|
|
|
Amount: request.Body.Amount,
|
|
|
|
UserID: request.UserID,
|
|
|
|
ClientIP: request.ClientIP,
|
2024-11-26 15:28:42 +00:00
|
|
|
CallbackHostGRPC: []string{receiver.grpcDomain},
|
2023-06-22 09:36:43 +00:00
|
|
|
ReturnURL: request.Body.ReturnURL,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
receiver.logger.Error("failed to get yoomoney payment link on <GetPaymentLinkYooMoney> of <PaymentService>", zap.Error(err))
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return link, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (receiver *Service) GetPaymentLinkSberPay(ctx context.Context, request *models.GetPaymentLinkRequest) (string, errors.Error) {
|
2024-04-18 17:10:23 +00:00
|
|
|
link, err := receiver.paymentClient.GetPaymentLinkSberPay(ctx, &treasurer.GetPaymentLinkRequest{
|
2023-06-22 09:36:43 +00:00
|
|
|
MainSettings: &treasurer.MainPaymentSettings{
|
|
|
|
Currency: request.Body.Currency,
|
|
|
|
Amount: request.Body.Amount,
|
|
|
|
UserID: request.UserID,
|
|
|
|
ClientIP: request.ClientIP,
|
2024-11-26 15:28:42 +00:00
|
|
|
CallbackHostGRPC: []string{receiver.grpcDomain},
|
2023-06-22 09:36:43 +00:00
|
|
|
ReturnURL: request.Body.ReturnURL,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
receiver.logger.Error("failed to get sberpay payment link on <GetPaymentLinkSberPay> of <PaymentService>", zap.Error(err))
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return link, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (receiver *Service) GetPaymentLinkTinkoff(ctx context.Context, request *models.GetPaymentLinkRequest) (string, errors.Error) {
|
2024-04-18 17:10:23 +00:00
|
|
|
link, err := receiver.paymentClient.GetPaymentLinkTinkoff(ctx, &treasurer.GetPaymentLinkRequest{
|
2023-06-22 09:36:43 +00:00
|
|
|
MainSettings: &treasurer.MainPaymentSettings{
|
|
|
|
Currency: request.Body.Currency,
|
|
|
|
Amount: request.Body.Amount,
|
|
|
|
UserID: request.UserID,
|
|
|
|
ClientIP: request.ClientIP,
|
2024-11-26 15:28:42 +00:00
|
|
|
CallbackHostGRPC: []string{receiver.grpcDomain},
|
2023-06-22 09:36:43 +00:00
|
|
|
ReturnURL: request.Body.ReturnURL,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
receiver.logger.Error("failed to get tinkoff payment link on <GetPaymentLinkTinkoff> of <PaymentService>", zap.Error(err))
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return link, nil
|
|
|
|
}
|