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) <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-05-13 11:40:43 +02:00
commit d33359a901

View file

@ -236,7 +236,8 @@ export function useCheckout(): UseCheckoutReturn {
async function payBolt11Raw( async function payBolt11Raw(
bolt11: string, bolt11: string,
adminkey: string adminkey: string,
extra?: Record<string, unknown>
): Promise<void> { ): Promise<void> {
const response = await fetch(`${apiBaseUrl}/api/v1/payments`, { const response = await fetch(`${apiBaseUrl}/api/v1/payments`, {
method: 'POST', method: 'POST',
@ -244,7 +245,7 @@ export function useCheckout(): UseCheckoutReturn {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'X-Api-Key': adminkey, 'X-Api-Key': adminkey,
}, },
body: JSON.stringify({ out: true, bolt11 }), body: JSON.stringify({ out: true, bolt11, ...(extra ? { extra } : {}) }),
}) })
if (!response.ok) { if (!response.ok) {
let detail = response.statusText let detail = response.statusText
@ -272,7 +273,15 @@ export function useCheckout(): UseCheckoutReturn {
state.value.step = 'paying' state.value.step = 'paying'
state.value.currentRestaurantSlug = placed.restaurantSlug state.value.currentRestaurantSlug = placed.restaurantSlug
try { 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 // Set semantics keeps `paidOrderIds` from re-renders; rebuild
// it on update so Vue picks up the change. // it on update so Vue picks up the change.
state.value.paidOrderIds = new Set([ state.value.paidOrderIds = new Set([