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 (receiver *YandexClient) CreatePayment(ctx context.Context, idempotenceKey string, request *yandex.CreatePaymentRequest[yandex.PaymentMethodType]) (*yandex.Payment, errors.Error) { receiver.logger.Info("fai of ", zap.Any("CRP", request)) response, err := client.Post[yandex.Payment, any](ctx, &client.RequestSettings{ URL: receiver.yooMoneyPaymentsURL, Body: request, Headers: map[string]string{ "Content-Type": "application/json", "Idempotence-Key": idempotenceKey, "Authorization": utils.ConvertYoomoneySercetsToAuth("Basic", receiver.yooMoneyStoreID, receiver.yooMoneySecretKey), }, }) if err != nil { receiver.logger.Error("failed to make request on of ", zap.Error(err)) return nil, errors.NewWithError(fmt.Errorf("failed to make request: %w", err), errors.ErrInternalError) } if response.Error != nil { receiver.logger.Error("failed to create payment on of ", zap.Any("response", response.Error)) return nil, errors.NewWithMessage("failed to create payment", errors.ErrInternalError) } return response.Body, nil } func (receiver *YandexClient) CreatePaymentB2B(ctx context.Context, idempotenceKey string, request *yandex.CreatePaymentRequest[yandex.PaymentMethodB2B]) (*yandex.Payment, errors.Error) { receiver.logger.Info("fai2 of ", zap.Any("CRP", request)) response, err := client.Post[yandex.Payment, any](ctx, &client.RequestSettings{ URL: receiver.yooMoneyPaymentsURL, Body: request, Headers: map[string]string{ "Content-Type": "application/json", "Idempotence-Key": idempotenceKey, "Authorization": utils.ConvertYoomoneySercetsToAuth("Basic", receiver.yooMoneyStoreID, receiver.yooMoneySecretKey), }, }) if err != nil { receiver.logger.Error("failed to make request on of ", zap.Error(err)) return nil, errors.NewWithError(fmt.Errorf("failed to make request: %w", err), errors.ErrInternalError) } if response.Error != nil { receiver.logger.Error("failed to create payment on of ", zap.Any("response", response.Error)) return nil, errors.NewWithMessage("failed to create payment", errors.ErrInternalError) } return response.Body, nil } func (receiver *YandexClient) CreatePaymentBankCard(ctx context.Context, idempotenceKey string, request *yandex.CreatePaymentRequest[yandex.PaymentMethodBankCard]) (*yandex.Payment, errors.Error) { receiver.logger.Info("fai3 of ", zap.Any("CRP", request)) response, err := client.Post[yandex.Payment, any](ctx, &client.RequestSettings{ URL: receiver.yooMoneyPaymentsURL, Body: request, Headers: map[string]string{ "Content-Type": "application/json", "Idempotence-Key": idempotenceKey, "Authorization": utils.ConvertYoomoneySercetsToAuth("Basic", receiver.yooMoneyStoreID, receiver.yooMoneySecretKey), }, }) if err != nil { receiver.logger.Error("failed to make request on of ", zap.Error(err)) return nil, errors.NewWithError(fmt.Errorf("failed to make request: %w", err), errors.ErrInternalError) } if response.Error != nil { receiver.logger.Error("failed to create payment on of ", zap.Any("response", response.Error)) return nil, errors.NewWithMessage("failed to create payment", errors.ErrInternalError) } return response.Body, nil }