package model import ( "fmt" "git.sendico.io/tech/sxchnge/bff/pkg/merrors" "go.mongodb.org/mongo-driver/v2/bson" ) // TokenPaymentData represents a network or gateway-issued card token. type TokenPaymentData struct { Token string `bson:"token" json:"token"` Network string `bson:"network,omitempty" json:"network,omitempty"` Last4 string `bson:"last4,omitempty" json:"masked_pan,omitempty"` ExpMonth *int `bson:"exp_month,omitempty" json:"exp_month,omitempty"` ExpYear *int `bson:"exp_year,omitempty" json:"exp_year,omitempty"` CardholderName string `bson:"cardholderName,omitempty" json:"cardholderName,omitempty"` Country string `bson:"country,omitempty" json:"country,omitempty"` } func (d *TokenPaymentData) UnmarshalBSON(data []byte) error { var raw map[string]any if err := bson.Unmarshal(data, &raw); err != nil { return err } d.Token = paymentDataString(raw["token"]) d.Network = paymentDataString(raw["network"]) d.Last4 = firstPaymentDataString(raw, "last4", "last_4", "masked_pan") d.ExpMonth = firstPaymentDataInt(raw, "exp_month", "expMonth") d.ExpYear = firstPaymentDataInt(raw, "exp_year", "expYear") d.CardholderName = firstPaymentDataString(raw, "cardholderName", "cardholder_name") d.Country = paymentDataString(raw["country"]) return nil } func (m *PaymentMethod) AsCardToken() (*TokenPaymentData, error) { if m.Type != PaymentTypeCardToken { return nil, merrors.InvalidArgument(fmt.Sprintf("payment method type is %s, not cardToken", m.Type), "type") } var d TokenPaymentData if err := bson.Unmarshal(m.Data, &d); err != nil { return nil, err } return &d, nil }