package grpc import ( "context" "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "penahub.gitlab.yandexcloud.net/external/treasurer/internal/errors" "penahub.gitlab.yandexcloud.net/external/treasurer/internal/models" "penahub.gitlab.yandexcloud.net/external/treasurer/internal/proto/treasurer" ) type PaymentService interface { CreatePaymentPhone(context.Context, *models.CreatePayment[string]) (string, errors.Error) CreatePaymentBankCard(context.Context, *models.CreatePayment[*models.BankCard]) (string, errors.Error) CreatePayment(context.Context, *models.CreatePayment[*any]) (string, errors.Error) CreatePaymentLogin(context.Context, *models.CreatePayment[string]) (string, errors.Error) } type PaymentControllerDeps struct { Logger *zap.Logger PaymentService PaymentService } type PaymentController struct { logger *zap.Logger paymentService PaymentService } func NewPaymentController(deps PaymentControllerDeps) (*PaymentController, errors.Error) { if deps.Logger == nil { return nil, errors.NewWithMessage("Logger in nil on ", errors.ErrInvalidArgs) } if deps.PaymentService == nil { return nil, errors.NewWithMessage("PaymentService in nil on ", errors.ErrInvalidArgs) } return &PaymentController{ logger: deps.Logger, paymentService: deps.PaymentService, }, nil } func (receiver *PaymentController) GetPaymentLinkBankCard(ctx context.Context, in *treasurer.GetBankCardPaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePaymentBankCard(ctx, &models.CreatePayment[*models.BankCard]{ Type: models.PaymentTypeBankCard, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, Requisites: &models.BankCard{ Number: in.BankCard.Number, ExpiryYear: in.BankCard.ExpiryYear, ExpiryMonth: in.BankCard.ExpiryMonth, CSC: in.BankCard.CSC, CardHolderName: in.BankCard.CardHolderName, }, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkYooMoney(ctx context.Context, in *treasurer.GetPaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePayment(ctx, &models.CreatePayment[*any]{ Type: models.PaymentTypeYoomoney, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkQIWI(ctx context.Context, in *treasurer.GetPhonePaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePaymentPhone(ctx, &models.CreatePayment[string]{ Type: models.PaymentTypeQiwi, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, Requisites: in.Phone, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkSberPay(ctx context.Context, in *treasurer.GetPhonePaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePaymentPhone(ctx, &models.CreatePayment[string]{ Type: models.PaymentTypeSberPay, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, Requisites: in.Phone, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkAlfaClick(ctx context.Context, in *treasurer.GetLoginPaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePaymentLogin(ctx, &models.CreatePayment[string]{ Type: models.PaymentTypeAlfabank, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, Requisites: in.Login, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkTinkoff(ctx context.Context, in *treasurer.GetPaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePayment(ctx, &models.CreatePayment[*any]{ Type: models.PaymentTypeTinkoff, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkSBP(ctx context.Context, in *treasurer.GetPaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePayment(ctx, &models.CreatePayment[*any]{ Type: models.PaymentTypeSBP, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkMobile(ctx context.Context, in *treasurer.GetPhonePaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePaymentPhone(ctx, &models.CreatePayment[string]{ Type: models.PaymentTypeMobile, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, Requisites: in.Phone, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkCash(ctx context.Context, in *treasurer.GetPhonePaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePaymentPhone(ctx, &models.CreatePayment[string]{ Type: models.PaymentTypeCash, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, Requisites: in.Phone, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkInstallments(ctx context.Context, in *treasurer.GetPaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { link, err := receiver.paymentService.CreatePayment(ctx, &models.CreatePayment[*any]{ Type: models.PaymentTypeInstallments, Currency: in.MainSettings.Currency, UserID: in.MainSettings.UserID, ClientIP: in.MainSettings.ClientIP, Amount: in.MainSettings.Amount, CallbackHostGRPC: in.MainSettings.CallbackHostGRPC, ReturnURL: in.MainSettings.ReturnURL, }) if err != nil { receiver.logger.Error("failed to get payment link on of ", zap.Error(err)) return nil, errors.GRPC("failed to get payment link", err) } return &treasurer.GetPaymentLinkResponse{RedirectURL: link}, nil } func (receiver *PaymentController) GetPaymentLinkSberbankB2B(_ context.Context, _ *treasurer.GetB2BPaymentLinkRequest) (*treasurer.GetPaymentLinkResponse, error) { return nil, status.Error(codes.Unimplemented, "method not implemented") }