84 lines
3.4 KiB
Go
84 lines
3.4 KiB
Go
package gateway
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/tech/sendico/gateway/mntx/internal/service/monetix"
|
|
"github.com/tech/sendico/pkg/merrors"
|
|
mntxv1 "github.com/tech/sendico/pkg/proto/gateway/mntx/v1"
|
|
)
|
|
|
|
func validateCardPayoutRequest(req *mntxv1.CardPayoutRequest, cfg monetix.Config) error {
|
|
if req == nil {
|
|
return newPayoutError("invalid_request", merrors.InvalidArgument("request cannot be empty"))
|
|
}
|
|
|
|
if strings.TrimSpace(req.GetPayoutId()) == "" {
|
|
return newPayoutError("missing_payout_id", merrors.InvalidArgument("payout_id is required", "payout_id"))
|
|
}
|
|
if strings.TrimSpace(req.GetCustomerId()) == "" {
|
|
return newPayoutError("missing_customer_id", merrors.InvalidArgument("customer_id is required", "customer_id"))
|
|
}
|
|
if strings.TrimSpace(req.GetCustomerFirstName()) == "" {
|
|
return newPayoutError("missing_customer_first_name", merrors.InvalidArgument("customer_first_name is required", "customer_first_name"))
|
|
}
|
|
if strings.TrimSpace(req.GetCustomerLastName()) == "" {
|
|
return newPayoutError("missing_customer_last_name", merrors.InvalidArgument("customer_last_name is required", "customer_last_name"))
|
|
}
|
|
if strings.TrimSpace(req.GetCustomerIp()) == "" {
|
|
return newPayoutError("missing_customer_ip", merrors.InvalidArgument("customer_ip is required", "customer_ip"))
|
|
}
|
|
|
|
if req.GetAmountMinor() <= 0 {
|
|
return newPayoutError("invalid_amount", merrors.InvalidArgument("amount_minor must be positive", "amount_minor"))
|
|
}
|
|
|
|
currency := strings.ToUpper(strings.TrimSpace(req.GetCurrency()))
|
|
if currency == "" {
|
|
return newPayoutError("missing_currency", merrors.InvalidArgument("currency is required", "currency"))
|
|
}
|
|
if !cfg.CurrencyAllowed(currency) {
|
|
return newPayoutError("unsupported_currency", merrors.InvalidArgument("currency is not allowed for this project", "currency"))
|
|
}
|
|
|
|
pan := strings.TrimSpace(req.GetCardPan())
|
|
if pan == "" {
|
|
return newPayoutError("missing_card_pan", merrors.InvalidArgument("card_pan is required", "card_pan"))
|
|
}
|
|
if strings.TrimSpace(req.GetCardHolder()) == "" {
|
|
return newPayoutError("missing_card_holder", merrors.InvalidArgument("card_holder is required", "card_holder"))
|
|
}
|
|
if err := validateCardExpiryFields(req.GetCardExpMonth(), req.GetCardExpYear()); err != nil {
|
|
return err
|
|
}
|
|
|
|
if cfg.RequireCustomerAddress {
|
|
if strings.TrimSpace(req.GetCustomerCountry()) == "" {
|
|
return newPayoutError("missing_customer_country", merrors.InvalidArgument("customer_country is required", "customer_country"))
|
|
}
|
|
if strings.TrimSpace(req.GetCustomerCity()) == "" {
|
|
return newPayoutError("missing_customer_city", merrors.InvalidArgument("customer_city is required", "customer_city"))
|
|
}
|
|
if strings.TrimSpace(req.GetCustomerAddress()) == "" {
|
|
return newPayoutError("missing_customer_address", merrors.InvalidArgument("customer_address is required", "customer_address"))
|
|
}
|
|
if strings.TrimSpace(req.GetCustomerZip()) == "" {
|
|
return newPayoutError("missing_customer_zip", merrors.InvalidArgument("customer_zip is required", "customer_zip"))
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func validateCardExpiryFields(month uint32, year uint32) error {
|
|
if month == 0 || month > 12 {
|
|
return newPayoutError("invalid_expiry_month", merrors.InvalidArgument("card_exp_month must be between 1 and 12", "card_exp_month"))
|
|
}
|
|
yearStr := strconv.Itoa(int(year))
|
|
if len(yearStr) < 2 || year == 0 {
|
|
return newPayoutError("invalid_expiry_year", merrors.InvalidArgument("card_exp_year must be provided", "card_exp_year"))
|
|
}
|
|
return nil
|
|
}
|