treasurer/internal/client/yandex.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
}