feat(stripe): add booking_id metadata to payment links
Some checks failed
CI / checks (push) Has been cancelled

Refactored payment link creation to ensure booking_id is set in both the
PaymentLink and PaymentIntent metadata. Extracted parameter building
logic
into a helper for improved testability. Added a unit test to verify
metadata propagation.
This commit is contained in:
Ruidy 2025-11-10 20:23:33 +01:00
parent 4bd47dc6e9
commit 508de01116
No known key found for this signature in database
GPG key ID: 705C24D202990805
2 changed files with 54 additions and 13 deletions

View file

@ -125,18 +125,37 @@ type CreatePaymentLinkParams struct {
// CreatePaymentLink creates a payment link for the provided booking metadata and amount.
func (c *Client) CreatePaymentLink(ctx context.Context, params CreatePaymentLinkParams) (string, error) {
linkParams, err := buildPaymentLinkCreateParams(params)
if err != nil {
return "", err
}
linkParams.Context = ctx
pl, err := c.api.V1PaymentLinks.Create(ctx, linkParams)
if err != nil {
return "", fmt.Errorf("failed to create payment link: %w", err)
}
return pl.URL, nil
}
func buildPaymentLinkCreateParams(params CreatePaymentLinkParams) (*stripe.PaymentLinkCreateParams, error) {
if params.Amount <= 0 {
return "", errors.New("amount must be greater than zero")
return nil, errors.New("amount must be greater than zero")
}
currency := strings.ToLower(strings.TrimSpace(params.Currency))
if currency == "" {
return "", errors.New("currency is required")
return nil, errors.New("currency is required")
}
if params.BookingID == 0 {
return "", errors.New("booking id is required")
return nil, errors.New("booking id is required")
}
amountCents := int64(math.Round(params.Amount * 100))
metadata := map[string]string{
"booking_id": strconv.FormatUint(uint64(params.BookingID), 10),
}
linkParams := &stripe.PaymentLinkCreateParams{
LineItems: []*stripe.PaymentLinkCreateLineItemParams{
@ -151,8 +170,9 @@ func (c *Client) CreatePaymentLink(ctx context.Context, params CreatePaymentLink
Quantity: stripe.Int64(1),
},
},
Metadata: map[string]string{
"booking_id": strconv.FormatUint(uint64(params.BookingID), 10),
Metadata: metadata,
PaymentIntentData: &stripe.PaymentLinkCreatePaymentIntentDataParams{
Metadata: metadata,
},
}
@ -164,14 +184,7 @@ func (c *Client) CreatePaymentLink(ctx context.Context, params CreatePaymentLink
linkParams.PaymentMethodTypes = stripe.StringSlice(params.PaymentMethodTypes)
}
linkParams.Context = ctx
pl, err := c.api.V1PaymentLinks.Create(ctx, linkParams)
if err != nil {
return "", fmt.Errorf("failed to create payment link: %w", err)
}
return pl.URL, nil
return linkParams, nil
}
func deriveMethod(pi *stripe.PaymentIntent) string {

View file

@ -0,0 +1,28 @@
package stripe
import "testing"
func TestBuildPaymentLinkCreateParamsSetsBookingMetadataOnPaymentIntent(t *testing.T) {
params, err := buildPaymentLinkCreateParams(CreatePaymentLinkParams{
Amount: 120.50,
Currency: "EUR",
BookingID: 42,
Description: "Villa booking",
PaymentMethodTypes: []string{"card"},
})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if params.Metadata["booking_id"] != "42" {
t.Fatalf("payment link metadata missing booking id: %+v", params.Metadata)
}
if params.PaymentIntentData == nil {
t.Fatal("payment intent data should not be nil")
}
if params.PaymentIntentData.Metadata["booking_id"] != "42" {
t.Fatalf("payment intent metadata missing booking id: %+v", params.PaymentIntentData.Metadata)
}
}