package client import ( "context" "fmt" "log" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "gitea.pena/PenaSide/customer/internal/errors" "gitea.pena/PenaSide/customer/internal/proto/treasurer" "gitea.pena/PenaSide/customer/pkg/validate" ) type PaymentClientDeps struct { Logger *zap.Logger PaymentServiceHost string } type PaymentClient struct { logger *zap.Logger paymentServiceHost string } func NewPaymentClient(deps PaymentClientDeps) *PaymentClient { if deps.Logger == nil { log.Panicln("logger is nil on ") } if validate.IsStringEmpty(deps.PaymentServiceHost) { log.Panicln("payment host is empty on ") } return &PaymentClient{ logger: deps.Logger, paymentServiceHost: deps.PaymentServiceHost, } } func (receiver *PaymentClient) GetPaymentLinkBankCard(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error) { client, closeConnection, connectErr := receiver.connect(ctx) if connectErr != nil { receiver.logger.Error("failed to connect on of ", zap.Error(connectErr)) return "", errors.New(fmt.Errorf("failed connect to payment service: %w", connectErr), errors.ErrInternalError) } defer closeConnection() response, err := client.GetPaymentLinkBankCard(ctx, request) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err), zap.String("host", receiver.paymentServiceHost), ) return "", errors.New(fmt.Errorf("failed to get payment link: %w", err), errors.ErrInternalError) } return response.RedirectURL, nil } func (receiver *PaymentClient) GetPaymentLinkYooMoney(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error) { client, closeConnection, connectErr := receiver.connect(ctx) if connectErr != nil { receiver.logger.Error("failed to connect on of ", zap.Error(connectErr)) return "", errors.New(fmt.Errorf("failed connect to payment service: %w", connectErr), errors.ErrInternalError) } defer closeConnection() response, err := client.GetPaymentLinkYooMoney(ctx, request) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err), zap.String("host", receiver.paymentServiceHost), ) return "", errors.New(fmt.Errorf("failed to get payment link: %w", err), errors.ErrInternalError) } return response.RedirectURL, nil } func (receiver *PaymentClient) GetPaymentLinkSberPay(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error) { client, closeConnection, connectErr := receiver.connect(ctx) if connectErr != nil { receiver.logger.Error("failed to connect on of ", zap.Error(connectErr)) return "", errors.New(fmt.Errorf("failed connect to payment service: %w", connectErr), errors.ErrInternalError) } defer closeConnection() response, err := client.GetPaymentLinkSberPay(ctx, request) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err), zap.String("host", receiver.paymentServiceHost), ) return "", errors.New(fmt.Errorf("failed to get payment link: %w", err), errors.ErrInternalError) } return response.RedirectURL, nil } func (receiver *PaymentClient) GetPaymentLinkSBP(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error) { client, closeConnection, connectErr := receiver.connect(ctx) if connectErr != nil { receiver.logger.Error("failed to connect on of ", zap.Error(connectErr)) return "", errors.New(fmt.Errorf("failed connect to payment service: %w", connectErr), errors.ErrInternalError) } defer closeConnection() response, err := client.GetPaymentLinkSBP(ctx, request) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err), zap.String("host", receiver.paymentServiceHost), ) return "", errors.New(fmt.Errorf("failed to get payment link: %w", err), errors.ErrInternalError) } return response.RedirectURL, nil } func (receiver *PaymentClient) GetPaymentLinkTinkoff(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error) { client, closeConnection, connectErr := receiver.connect(ctx) if connectErr != nil { receiver.logger.Error("failed to connect on of ", zap.Error(connectErr)) return "", errors.New(fmt.Errorf("failed connect to payment service: %w", connectErr), errors.ErrInternalError) } defer closeConnection() response, err := client.GetPaymentLinkTinkoff(ctx, request) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err), zap.String("host", receiver.paymentServiceHost), ) return "", errors.New(fmt.Errorf("failed to get payment link: %w", err), errors.ErrInternalError) } return response.RedirectURL, nil } func (receiver *PaymentClient) GetPaymentLinkSberbankB2B(ctx context.Context, request *treasurer.GetPaymentLinkRequest) (string, errors.Error) { client, closeConnection, connectErr := receiver.connect(ctx) if connectErr != nil { receiver.logger.Error("failed to connect on of ", zap.Error(connectErr)) return "", errors.New(fmt.Errorf("failed connect to payment service: %w", connectErr), errors.ErrInternalError) } defer closeConnection() response, err := client.GetPaymentLinkSberbankB2B(ctx, request) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err), zap.String("host", receiver.paymentServiceHost), ) return "", errors.New(fmt.Errorf("failed to get payment link: %w", err), errors.ErrInternalError) } return response.RedirectURL, nil } func (receiver *PaymentClient) connect(ctx context.Context) (treasurer.TreasurerServiceClient, func(), errors.Error) { connection, err := grpc.DialContext(ctx, receiver.paymentServiceHost, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { receiver.logger.Error("failed connect to payment service no of ", zap.Error(err), zap.String("host", receiver.paymentServiceHost), ) return nil, nil, errors.New(fmt.Errorf("failed connect to payment service: %w", err), errors.ErrInternalError) } closeConnect := func() { if closeErr := connection.Close(); closeErr != nil { receiver.logger.Error("failed to close connection on of ", zap.Error(closeErr)) } } client := treasurer.NewTreasurerServiceClient(connection) return client, closeConnect, nil }