From d33359a9019af55f4d5508c0543d45be296d777c Mon Sep 17 00:00:00 2001 From: Padreug Date: Wed, 13 May 2026 11:40:43 +0200 Subject: [PATCH] feat(restaurant/checkout): tag outgoing payment with restaurant + order id Adds extra={tag:'restaurant', restaurant_id, order_id} to the POST /api/v1/payments body when paying a placed-order's bolt11. Mirrors the same extras the extension stamps on its incoming invoice, so a customer's wallet history can later filter or surface restaurant orders rather than showing them as generic Lightning sends. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/modules/restaurant/composables/useCheckout.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/modules/restaurant/composables/useCheckout.ts b/src/modules/restaurant/composables/useCheckout.ts index f42e6c8..fdf75ab 100644 --- a/src/modules/restaurant/composables/useCheckout.ts +++ b/src/modules/restaurant/composables/useCheckout.ts @@ -236,7 +236,8 @@ export function useCheckout(): UseCheckoutReturn { async function payBolt11Raw( bolt11: string, - adminkey: string + adminkey: string, + extra?: Record ): Promise { const response = await fetch(`${apiBaseUrl}/api/v1/payments`, { method: 'POST', @@ -244,7 +245,7 @@ export function useCheckout(): UseCheckoutReturn { 'Content-Type': 'application/json', 'X-Api-Key': adminkey, }, - body: JSON.stringify({ out: true, bolt11 }), + body: JSON.stringify({ out: true, bolt11, ...(extra ? { extra } : {}) }), }) if (!response.ok) { let detail = response.statusText @@ -272,7 +273,15 @@ export function useCheckout(): UseCheckoutReturn { state.value.step = 'paying' state.value.currentRestaurantSlug = placed.restaurantSlug try { - await payBolt11Raw(placed.invoice.bolt11, adminkey) + // Tag the outgoing payment so the customer's wallet history + // can later surface it as a restaurant order. Mirrors the + // `extra={"tag": "restaurant", ...}` the extension stamps on + // its incoming invoice. + await payBolt11Raw(placed.invoice.bolt11, adminkey, { + tag: 'restaurant', + restaurant_id: placed.restaurantId, + order_id: placed.order.id, + }) // Set semantics keeps `paidOrderIds` from re-renders; rebuild // it on update so Vue picks up the change. state.value.paidOrderIds = new Set([