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 ", 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 }