82 lines
3.0 KiB
Go
82 lines
3.0 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"gitea.pena/PenaSide/treasurer/internal/errors"
|
|
"gitea.pena/PenaSide/treasurer/internal/models/yandex"
|
|
"gitea.pena/PenaSide/treasurer/internal/utils"
|
|
"gitea.pena/PenaSide/treasurer/pkg/client"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type YandexClientDeps struct {
|
|
Logger *zap.Logger
|
|
YooMoneyStoreID string
|
|
YooMoneySecretKey string
|
|
YooMoneyWebhooksURL string
|
|
YooMoneyPaymentsURL string
|
|
}
|
|
|
|
type YandexClient struct {
|
|
logger *zap.Logger
|
|
yooMoneyStoreID string
|
|
yooMoneySecretKey string
|
|
yooMoneyWebhooksURL string
|
|
yooMoneyPaymentsURL string
|
|
}
|
|
|
|
func NewYandexClient(deps YandexClientDeps) (*YandexClient, errors.Error) {
|
|
if deps.Logger == nil {
|
|
return nil, errors.NewWithMessage("Logger is nil on <NewYandexClient>", errors.ErrInvalidArgs)
|
|
}
|
|
|
|
return &YandexClient{
|
|
logger: deps.Logger,
|
|
yooMoneyStoreID: deps.YooMoneyStoreID,
|
|
yooMoneySecretKey: deps.YooMoneySecretKey,
|
|
yooMoneyWebhooksURL: deps.YooMoneyWebhooksURL,
|
|
yooMoneyPaymentsURL: deps.YooMoneyPaymentsURL,
|
|
}, nil
|
|
}
|
|
|
|
func (c *YandexClient) CreatePayment(ctx context.Context, idempotenceKey string, request *yandex.CreatePaymentRequest[yandex.PaymentMethodType]) (*yandex.Payment, errors.Error) {
|
|
return CreateYandexPayment(ctx, c.logger, request, c.yooMoneyPaymentsURL, idempotenceKey,
|
|
utils.ConvertYoomoneySercetsToAuth("Basic", c.yooMoneyStoreID, c.yooMoneySecretKey))
|
|
}
|
|
|
|
func (c *YandexClient) CreatePaymentB2B(ctx context.Context, idempotenceKey string, request *yandex.CreatePaymentRequest[yandex.PaymentMethodB2B]) (*yandex.Payment, errors.Error) {
|
|
return CreateYandexPayment(ctx, c.logger, request, c.yooMoneyPaymentsURL, idempotenceKey,
|
|
utils.ConvertYoomoneySercetsToAuth("Basic", c.yooMoneyStoreID, c.yooMoneySecretKey))
|
|
}
|
|
|
|
func (c *YandexClient) CreatePaymentBankCard(ctx context.Context, idempotenceKey string, request *yandex.CreatePaymentRequest[yandex.PaymentMethodBankCard]) (*yandex.Payment, errors.Error) {
|
|
return CreateYandexPayment(ctx, c.logger, request, c.yooMoneyPaymentsURL, idempotenceKey,
|
|
utils.ConvertYoomoneySercetsToAuth("Basic", c.yooMoneyStoreID, c.yooMoneySecretKey))
|
|
}
|
|
|
|
func CreateYandexPayment[T any](ctx context.Context, logger *zap.Logger, request *yandex.CreatePaymentRequest[T],
|
|
url string, idempotenceKey string, auth string) (*yandex.Payment, errors.Error) {
|
|
|
|
response, err := client.Post[yandex.Payment, any](ctx, &client.RequestSettings{
|
|
URL: url,
|
|
Body: request,
|
|
Headers: map[string]string{
|
|
"Content-Type": "application/json",
|
|
"Idempotence-Key": idempotenceKey,
|
|
"Authorization": auth,
|
|
},
|
|
})
|
|
if err != nil {
|
|
logger.Error("failed to make request", zap.Error(err))
|
|
return nil, errors.NewWithError(fmt.Errorf("failed to make request: %w", err), errors.ErrInternalError)
|
|
}
|
|
if response.Error != nil {
|
|
logger.Error("failed to create payment", zap.Any("response", response.Error))
|
|
return nil, errors.NewWithMessage("failed to create payment", errors.ErrInternalError)
|
|
}
|
|
|
|
return response.Body, nil
|
|
}
|