treasurer/internal/interface/controller/grpc/payment.go
2023-06-13 13:22:51 +00:00

241 lines
10 KiB
Go

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 <NewPaymentController>", errors.ErrInvalidArgs)
}
if deps.PaymentService == nil {
return nil, errors.NewWithMessage("PaymentService in nil on <NewPaymentController>", 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 <GetPaymentLinkBankCard> of <PaymentController>", 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 <GetPaymentLinkYooMoney> of <PaymentController>", 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 <GetPaymentLinkQIWI> of <PaymentController>", 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 <GetPaymentLinkSberPay> of <PaymentController>", 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 <GetPaymentLinkAlfaClick> of <PaymentController>", 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 <GetPaymentLinkTinkoff> of <PaymentController>", 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 <GetPaymentLinkSBP> of <PaymentController>", 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 <GetPaymentLinkMobile> of <PaymentController>", 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 <GetPaymentLinkCash> of <PaymentController>", 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 <GetPaymentLinkInstallments> of <PaymentController>", 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")
}