diff --git a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Create Incoming Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Create Incoming Payment.bru index 6fffd0742c..222f68ceb3 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Create Incoming Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Create Incoming Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{receiverOpenPaymentsHost}}/incoming-payments + url: {{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments body: json auth: none } diff --git a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Create Outgoing Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Create Outgoing Payment.bru index 4d9e3a2a63..6fb3d5c951 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Create Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Create Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsHost}}/outgoing-payments + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments body: json auth: none } @@ -35,7 +35,7 @@ script:pre-request { script:post-response { const body = res.getBody(); - + if (body?.id) { bru.setEnvVar("outgoingPaymentId", body.id.split("/").pop()); } diff --git a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get Outgoing Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get Outgoing Payment.bru index 4946e1b040..a1a4c417bd 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{senderOpenPaymentsHost}}/outgoing-payments/{{outgoingPaymentId}} + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments/{{outgoingPaymentId}} body: none auth: none } diff --git a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get receiver wallet address.bru b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get receiver wallet address.bru index 5b9b0277a9..788684b60b 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get receiver wallet address.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get receiver wallet address.bru @@ -32,6 +32,8 @@ script:post-response { bru.setEnvVar("receiverAssetScale", body?.assetScale) const authUrl = url.parse(body?.authServer) + const receiverTenantId = authUrl.pathname.split('/')[1] + bru.setEnvVar('receiverTenantId', receiverTenantId) if ( authUrl.hostname.includes('cloud-nine-wallet') || authUrl.hostname.includes('happy-life-bank') diff --git a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get sender wallet address.bru b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get sender wallet address.bru index 384cfa6282..3338e21cdd 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get sender wallet address.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Get sender wallet address.bru @@ -28,11 +28,13 @@ script:post-response { } const body = res.getBody() - + bru.setEnvVar("senderAssetCode", body?.assetCode) bru.setEnvVar("senderAssetScale", body?.assetScale) const authUrl = url.parse(body?.authServer) + const senderTenantId = authUrl.pathname.split('/')[1] + bru.setEnvVar('senderTenantId', senderTenantId) if ( authUrl.hostname.includes('cloud-nine-wallet') || authUrl.hostname.includes('happy-life-bank') diff --git a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Grant Request Incoming Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Grant Request Incoming Payment.bru index 6335a518af..70eb34c474 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Grant Request Incoming Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Grant Request Incoming Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{receiverOpenPaymentsAuthHost}}/ + url: {{receiverOpenPaymentsAuthHost}}/{{receiverTenantId}} body: json auth: none } diff --git a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Grant Request Outgoing Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Grant Request Outgoing Payment.bru index 5c8213f66a..fa033b3171 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Grant Request Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments Without Quote/Grant Request Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsAuthHost}}/ + url: {{senderOpenPaymentsAuthHost}}/{{senderTenantId}} body: json auth: none } diff --git a/bruno/collections/Rafiki/Examples/Open Payments/Create Incoming Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments/Create Incoming Payment.bru index afc6464ee6..85683d2983 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments/Create Incoming Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments/Create Incoming Payment.bru @@ -5,13 +5,14 @@ meta { } post { - url: {{receiverOpenPaymentsHost}}/incoming-payments + url: {{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments body: json auth: none } headers { Authorization: GNAP {{accessToken}} + x-operator-secret: {{operatorApiSecret}} } body:json { @@ -41,7 +42,7 @@ script:pre-request { script:post-response { const body = res.getBody(); - + if (body?.id) { bru.setEnvVar("incomingPaymentId", body.id.split("/").pop()); } diff --git a/bruno/collections/Rafiki/Examples/Open Payments/Create Outgoing Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments/Create Outgoing Payment.bru index e14eaa6536..f4f30599d3 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments/Create Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments/Create Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsHost}}/outgoing-payments + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments body: json auth: none } @@ -34,7 +34,7 @@ script:pre-request { script:post-response { const body = res.getBody(); - + if (body?.id) { bru.setEnvVar("outgoingPaymentId", body.id.split("/").pop()); } diff --git a/bruno/collections/Rafiki/Examples/Open Payments/Create Quote.bru b/bruno/collections/Rafiki/Examples/Open Payments/Create Quote.bru index a7708217f4..5f0e702830 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments/Create Quote.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments/Create Quote.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsHost}}/quotes + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/quotes body: json auth: none } @@ -17,7 +17,7 @@ headers { body:json { { "walletAddress": "{{senderWalletAddress}}", - "receiver": "{{receiverOpenPaymentsHost}}/incoming-payments/{{incomingPaymentId}}", + "receiver": "{{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments/{{incomingPaymentId}}", "method": "ilp" } } diff --git a/bruno/collections/Rafiki/Examples/Open Payments/Get Outgoing Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments/Get Outgoing Payment.bru index 4946e1b040..a1a4c417bd 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments/Get Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments/Get Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{senderOpenPaymentsHost}}/outgoing-payments/{{outgoingPaymentId}} + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments/{{outgoingPaymentId}} body: none auth: none } diff --git a/bruno/collections/Rafiki/Examples/Open Payments/Get receiver wallet address.bru b/bruno/collections/Rafiki/Examples/Open Payments/Get receiver wallet address.bru index 9e5acc50c4..9c57818fde 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments/Get receiver wallet address.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments/Get receiver wallet address.bru @@ -22,22 +22,24 @@ script:pre-request { script:post-response { const url = require('url') - + if (res.getStatus() !== 200) { return } - + const body = res.getBody() bru.setEnvVar("receiverAssetCode", body?.assetCode) bru.setEnvVar("receiverAssetScale", body?.assetScale) const authUrl = url.parse(body?.authServer) + const receiverTenantId = authUrl.pathname.split('/')[1] + bru.setEnvVar("receiverTenantId", receiverTenantId) if ( authUrl.hostname.includes('cloud-nine-wallet') || authUrl.hostname.includes('happy-life-bank') ){ const port = authUrl.hostname.includes('cloud-nine-wallet')? authUrl.port: Number(authUrl.port) + 1000 - bru.setEnvVar("receiverOpenPaymentsAuthHost", authUrl.protocol + '//localhost:' + port ); + bru.setEnvVar("receiverOpenPaymentsAuthHost", authUrl.protocol + '//localhost:' + port); } else { bru.setEnvVar("receiverOpenPaymentsAuthHost", body?.authServer); } diff --git a/bruno/collections/Rafiki/Examples/Open Payments/Get sender wallet address.bru b/bruno/collections/Rafiki/Examples/Open Payments/Get sender wallet address.bru index 9665a40e32..e371cf5f8b 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments/Get sender wallet address.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments/Get sender wallet address.bru @@ -32,15 +32,18 @@ script:post-response { bru.setEnvVar("senderAssetScale", body?.assetScale) const authUrl = url.parse(body?.authServer) + const senderTenantId = authUrl.pathname.split('/')[1] + bru.setEnvVar("senderTenantId", senderTenantId) if ( authUrl.hostname.includes('cloud-nine-wallet') || authUrl.hostname.includes('happy-life-bank') ){ const port = authUrl.hostname.includes('cloud-nine-wallet')? authUrl.port: Number(authUrl.port) + 1000 - bru.setEnvVar("senderOpenPaymentsAuthHost", authUrl.protocol + '//localhost:' + port ); + bru.setEnvVar("senderOpenPaymentsAuthHost", authUrl.protocol + '//localhost:' + port); } else { bru.setEnvVar("senderOpenPaymentsAuthHost", body?.authServer); } + } tests { diff --git a/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Incoming Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Incoming Payment.bru index 6335a518af..70eb34c474 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Incoming Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Incoming Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{receiverOpenPaymentsAuthHost}}/ + url: {{receiverOpenPaymentsAuthHost}}/{{receiverTenantId}} body: json auth: none } diff --git a/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Outgoing Payment.bru b/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Outgoing Payment.bru index 5be7a46476..5460d7a019 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsAuthHost}}/ + url: {{senderOpenPaymentsAuthHost}}/{{senderTenantId}} body: json auth: none } diff --git a/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Quote.bru b/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Quote.bru index 3c0736670d..a8df671fe5 100644 --- a/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Quote.bru +++ b/bruno/collections/Rafiki/Examples/Open Payments/Grant Request Quote.bru @@ -5,11 +5,15 @@ meta { } post { - url: {{senderOpenPaymentsAuthHost}}/ + url: {{senderOpenPaymentsAuthHost}}/{{senderTenantId}} body: json auth: none } +headers { + x-operator-secret: {{operatorApiSecret}} +} + body:json { { "access_token": { diff --git a/bruno/collections/Rafiki/Examples/Web Monetization/Create Incoming Payment.bru b/bruno/collections/Rafiki/Examples/Web Monetization/Create Incoming Payment.bru index 071e7df0be..8bb0d8ad12 100644 --- a/bruno/collections/Rafiki/Examples/Web Monetization/Create Incoming Payment.bru +++ b/bruno/collections/Rafiki/Examples/Web Monetization/Create Incoming Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{receiverOpenPaymentsHost}}/incoming-payments + url: {{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments body: json auth: none } @@ -36,7 +36,7 @@ script:pre-request { script:post-response { const body = res.getBody(); - + if (body?.id) { bru.setEnvVar("incomingPaymentId", body.id.split("/").pop()); bru.setEnvVar("quoteDebitAmount", JSON.stringify({ diff --git a/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 1.bru b/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 1.bru index 6bdb591816..5abaf4db52 100644 --- a/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 1.bru +++ b/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 1.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsHost}}/outgoing-payments + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments body: json auth: none } @@ -17,7 +17,7 @@ headers { body:json { { "walletAddress": "{{senderWalletAddress}}", - "incomingPayment": "{{receiverOpenPaymentsHost}}/incoming-payments/{{incomingPaymentId}}", + "incomingPayment": "{{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments/{{incomingPaymentId}}", "debitAmount": { "value": "300", "assetCode": "USD", @@ -40,7 +40,7 @@ script:pre-request { script:post-response { const body = res.getBody(); - + if (body?.id) { bru.setEnvVar("outgoingPaymentId", body.id.split("/").pop()); } diff --git a/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 2.bru b/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 2.bru index 6dce96ac06..82f99a5669 100644 --- a/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 2.bru +++ b/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 2.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsHost}}/outgoing-payments + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments body: json auth: none } @@ -17,7 +17,7 @@ headers { body:json { { "walletAddress": "{{senderWalletAddress}}", - "incomingPayment": "{{receiverOpenPaymentsHost}}/incoming-payments/{{incomingPaymentId}}", + "incomingPayment": "{{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments/{{incomingPaymentId}}", "debitAmount": { "value": "300", "assetCode": "USD", diff --git a/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 3.bru b/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 3.bru index 814d2171de..9b6300a5b8 100644 --- a/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 3.bru +++ b/bruno/collections/Rafiki/Examples/Web Monetization/Create Outgoing Payment 3.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsHost}}/outgoing-payments + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments body: json auth: none } @@ -17,7 +17,7 @@ headers { body:json { { "walletAddress": "{{senderWalletAddress}}", - "incomingPayment": "{{receiverOpenPaymentsHost}}/incoming-payments/{{incomingPaymentId}}", + "incomingPayment": "{{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments/{{incomingPaymentId}}", "debitAmount": { "value": "300", "assetCode": "USD", diff --git a/bruno/collections/Rafiki/Examples/Web Monetization/Get Outgoing Payment.bru b/bruno/collections/Rafiki/Examples/Web Monetization/Get Outgoing Payment.bru index 7c38f47444..3eb35e13c8 100644 --- a/bruno/collections/Rafiki/Examples/Web Monetization/Get Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Examples/Web Monetization/Get Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{senderOpenPaymentsHost}}/outgoing-payments/{{outgoingPaymentId}} + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments/{{outgoingPaymentId}} body: none auth: none } diff --git a/bruno/collections/Rafiki/Examples/Web Monetization/Get receiver wallet address.bru b/bruno/collections/Rafiki/Examples/Web Monetization/Get receiver wallet address.bru index d59f39b24f..891c33a42a 100644 --- a/bruno/collections/Rafiki/Examples/Web Monetization/Get receiver wallet address.bru +++ b/bruno/collections/Rafiki/Examples/Web Monetization/Get receiver wallet address.bru @@ -28,11 +28,13 @@ script:post-response { } const body = res.getBody() - + bru.setEnvVar("receiverAssetCode", body?.assetCode) bru.setEnvVar("receiverAssetScale", body?.assetScale) const authUrl = url.parse(body?.authServer) + const receiverTenantId = authUrl.pathname.split('/')[1] + bru.setEnvVar('receiverTenantId', receiverTenantId) if ( authUrl.hostname.includes('cloud-nine-wallet') || authUrl.hostname.includes('happy-life-bank') diff --git a/bruno/collections/Rafiki/Examples/Web Monetization/Get sender wallet address.bru b/bruno/collections/Rafiki/Examples/Web Monetization/Get sender wallet address.bru index 9665a40e32..9b63145285 100644 --- a/bruno/collections/Rafiki/Examples/Web Monetization/Get sender wallet address.bru +++ b/bruno/collections/Rafiki/Examples/Web Monetization/Get sender wallet address.bru @@ -32,6 +32,8 @@ script:post-response { bru.setEnvVar("senderAssetScale", body?.assetScale) const authUrl = url.parse(body?.authServer) + const senderTenantId = authUrl.pathname.split('/')[1] + bru.setEnvVar('senderTenantId', senderTenantId) if ( authUrl.hostname.includes('cloud-nine-wallet') || authUrl.hostname.includes('happy-life-bank') diff --git a/bruno/collections/Rafiki/Examples/Web Monetization/Grant Request Incoming Payment.bru b/bruno/collections/Rafiki/Examples/Web Monetization/Grant Request Incoming Payment.bru index 6335a518af..70eb34c474 100644 --- a/bruno/collections/Rafiki/Examples/Web Monetization/Grant Request Incoming Payment.bru +++ b/bruno/collections/Rafiki/Examples/Web Monetization/Grant Request Incoming Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{receiverOpenPaymentsAuthHost}}/ + url: {{receiverOpenPaymentsAuthHost}}/{{receiverTenantId}} body: json auth: none } diff --git a/bruno/collections/Rafiki/Examples/Web Monetization/Grant Request Outgoing Payment.bru b/bruno/collections/Rafiki/Examples/Web Monetization/Grant Request Outgoing Payment.bru index 5be7a46476..5460d7a019 100644 --- a/bruno/collections/Rafiki/Examples/Web Monetization/Grant Request Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Examples/Web Monetization/Grant Request Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsAuthHost}}/ + url: {{senderOpenPaymentsAuthHost}}/{{senderTenantId}} body: json auth: none } diff --git a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Complete Incoming Payment.bru b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Complete Incoming Payment.bru index 0debce0d02..3e8177753d 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Complete Incoming Payment.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Complete Incoming Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{receiverOpenPaymentsHost}}/incoming-payments/{{incomingPaymentId}}/complete + url: {{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments/{{incomingPaymentId}}/complete body: json auth: none } diff --git a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Create Incoming Payment.bru b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Create Incoming Payment.bru index c718828e1c..37b266901e 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Create Incoming Payment.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Create Incoming Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{receiverOpenPaymentsHost}}/incoming-payments + url: {{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments body: json auth: none } @@ -42,7 +42,7 @@ script:pre-request { script:post-response { const body = res.getBody(); - + if (body?.id) { bru.setEnvVar("incomingPaymentId", body.id.split("/").pop()); } diff --git a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Get Incoming Payment -Unauthenticated-.bru b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Get Incoming Payment -Unauthenticated-.bru index d282f8123d..abba6b742a 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Get Incoming Payment -Unauthenticated-.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Get Incoming Payment -Unauthenticated-.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{receiverOpenPaymentsHost}}/incoming-payments/{{incomingPaymentId}} + url: {{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments/{{incomingPaymentId}} body: none auth: none } diff --git a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Get Incoming Payment.bru b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Get Incoming Payment.bru index 797cf9ae66..cb3cefd4e7 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Get Incoming Payment.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/Get Incoming Payment.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{receiverOpenPaymentsHost}}/incoming-payments/{{incomingPaymentId}} + url: {{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments/{{incomingPaymentId}} body: none auth: none } diff --git a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/List Incoming Payments.bru b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/List Incoming Payments.bru index 9fd7a87872..a8a628b22d 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/List Incoming Payments.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Incoming Payments/List Incoming Payments.bru @@ -5,12 +5,12 @@ meta { } get { - url: {{receiverOpenPaymentsHost}}/incoming-payments?first=10&wallet-address={{receiverWalletAddress}} + url: {{receiverOpenPaymentsHost}}/{{receiverTenantId}}/incoming-payments?first=10&wallet-address={{receiverWalletAddress}} body: none auth: none } -query { +params:query { first: 10 wallet-address: {{receiverWalletAddress}} ~cursor: ea3bf38f-2719-4473-a0f7-4ba967d1d81b diff --git a/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/Create Outgoing Payment.bru b/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/Create Outgoing Payment.bru index 62ec4793f7..d0158e7223 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/Create Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/Create Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsHost}}/outgoing-payments + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments body: json auth: none } @@ -16,7 +16,7 @@ headers { body:json { { - "walletAddress": {{senderWalletAddress}}, + "walletAddress": "{{senderWalletAddress}}", "quoteId": "{{senderOpenPaymentsHost}}/quotes/{{quoteId}}", "metadata": { "description": "yolo", diff --git a/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/Get Outgoing Payment.bru b/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/Get Outgoing Payment.bru index a434aa6bfa..1af3991ab8 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/Get Outgoing Payment.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/Get Outgoing Payment.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{senderOpenPaymentsHost}}/outgoing-payments/{{outgoingPaymentId}} + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments/{{outgoingPaymentId}} body: none auth: none } diff --git a/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/List Outgoing Payments.bru b/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/List Outgoing Payments.bru index d85bd35fa5..17b1bce0aa 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/List Outgoing Payments.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Outgoing Payments/List Outgoing Payments.bru @@ -5,12 +5,12 @@ meta { } get { - url: {{senderOpenPaymentsHost}}/outgoing-payments?first=2&wallet-address={{senderWalletAddress}} + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/outgoing-payments?first=2&wallet-address={{senderWalletAddress}} body: none auth: none } -query { +params:query { first: 2 wallet-address: {{senderWalletAddress}} ~cursor: ea3bf38f-2719-4473-a0f7-4ba967d1d81b diff --git a/bruno/collections/Rafiki/Open Payments APIs/Quotes/Create Quote.bru b/bruno/collections/Rafiki/Open Payments APIs/Quotes/Create Quote.bru index 1e53624a2c..03bc78d913 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Quotes/Create Quote.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Quotes/Create Quote.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{senderOpenPaymentsHost}}/quotes + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/quotes body: json auth: none } @@ -37,7 +37,7 @@ script:pre-request { script:post-response { const body = res.getBody(); - + if (body?.id) { bru.setEnvVar("quoteId", body.id.split("/").pop()); bru.setEnvVar("quoteDebitAmount", JSON.stringify(body.debitAmount)) diff --git a/bruno/collections/Rafiki/Open Payments APIs/Quotes/Get Quote.bru b/bruno/collections/Rafiki/Open Payments APIs/Quotes/Get Quote.bru index 008c63222f..273b72b97d 100644 --- a/bruno/collections/Rafiki/Open Payments APIs/Quotes/Get Quote.bru +++ b/bruno/collections/Rafiki/Open Payments APIs/Quotes/Get Quote.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{senderOpenPaymentsHost}}/quotes/{{quoteId}} + url: {{senderOpenPaymentsHost}}/{{senderTenantId}}/quotes/{{quoteId}} body: none auth: none } diff --git a/bruno/collections/Rafiki/Open Payments Auth APIs/Grants/Grant Request.bru b/bruno/collections/Rafiki/Open Payments Auth APIs/Grants/Grant Request.bru index 0f5d41e8d7..5d4488504e 100644 --- a/bruno/collections/Rafiki/Open Payments Auth APIs/Grants/Grant Request.bru +++ b/bruno/collections/Rafiki/Open Payments Auth APIs/Grants/Grant Request.bru @@ -5,7 +5,7 @@ meta { } post { - url: {{receiverOpenPaymentsAuthHost}}/ + url: {{receiverOpenPaymentsAuthHost}}/{{receiverTenantId}} body: json auth: none } diff --git a/bruno/collections/Rafiki/environments/Local Playground.bru b/bruno/collections/Rafiki/environments/Local Playground.bru index 59244355df..45fb14ed6b 100644 --- a/bruno/collections/Rafiki/environments/Local Playground.bru +++ b/bruno/collections/Rafiki/environments/Local Playground.bru @@ -28,4 +28,5 @@ vars { authApiSignatureVersion: 1 authApiSignatureSecret: rPoZpe9tVyBNCigm05QDco7WLcYa0xMao7lO5KG1XG4= assetIdTigerBeetle: 1 + operatorApiSecret: tXhxCNRWuVOJs5W/CUgjsc+vBnKj0CVdqSb87EXN64E= } diff --git a/packages/auth/src/app.ts b/packages/auth/src/app.ts index dc27684dbf..c79d035cfb 100644 --- a/packages/auth/src/app.ts +++ b/packages/auth/src/app.ts @@ -267,7 +267,7 @@ export class App { /* Back-channel GNAP Routes */ // Grant Initiation router.post( - '/', + '/:tenantId', createValidatorMiddleware(openApi.authServerSpec, { path: '/', method: HttpMethod.POST diff --git a/packages/auth/src/grant/routes.ts b/packages/auth/src/grant/routes.ts index 17e6f09128..aac537877d 100644 --- a/packages/auth/src/grant/routes.ts +++ b/packages/auth/src/grant/routes.ts @@ -135,7 +135,8 @@ async function createApprovedGrant( let grant: Grant let accessToken: AccessToken try { - grant = await grantService.create(body, trx) + const { tenantId } = ctx.params + grant = await grantService.create(body, tenantId, trx) accessToken = await deps.accessTokenService.create(grant.id, trx) await trx.commit() } catch (err) { @@ -170,6 +171,7 @@ async function createPendingGrant( ctx: CreateContext ): Promise { const { body } = ctx.request + const { tenantId } = ctx.params const { grantService, interactionService, config, logger } = deps if (!body.interact) { throw new GNAPServerRouteError( @@ -191,7 +193,7 @@ async function createPendingGrant( const trx = await Grant.startTransaction() try { - const grant = await grantService.create(body, trx) + const grant = await grantService.create(body, tenantId, trx) const interaction = await interactionService.create(grant.id, trx) await trx.commit() diff --git a/packages/auth/src/grant/service.ts b/packages/auth/src/grant/service.ts index 051b3d0984..b96c0b61e7 100644 --- a/packages/auth/src/grant/service.ts +++ b/packages/auth/src/grant/service.ts @@ -24,7 +24,11 @@ interface GrantFilter { export interface GrantService { getByIdWithAccess(grantId: string): Promise - create(grantRequest: GrantRequest, trx?: Transaction): Promise + create( + grantRequest: GrantRequest, + tenantId: string, + trx?: Transaction + ): Promise markPending(grantId: string, trx?: Transaction): Promise approve(grantId: string, trx?: Transaction): Promise finalize(grantId: string, reason: GrantFinalization): Promise @@ -115,8 +119,8 @@ export async function createGrantService({ } return { getByIdWithAccess: (grantId: string) => getByIdWithAccess(grantId), - create: (grantRequest: GrantRequest, trx?: Transaction) => - create(deps, grantRequest, trx), + create: (grantRequest: GrantRequest, tenantId: string, trx?: Transaction) => + create(deps, grantRequest, tenantId, trx), markPending: (grantId: string, trx?: Transaction) => markPending(deps, grantId, trx), approve: (grantId: string) => approve(grantId), @@ -211,6 +215,7 @@ async function revokeGrant( async function create( deps: ServiceDependencies, grantRequest: GrantRequest, + tenantId: string, trx?: Transaction ): Promise { const { accessService, knex } = deps @@ -224,6 +229,7 @@ async function create( const grantTrx = trx || (await Grant.startTransaction(knex)) try { const grantData = { + tenantId, state: canSkipInteraction(deps.config, grantRequest) ? GrantState.Approved : GrantState.Pending, diff --git a/packages/backend/src/app.ts b/packages/backend/src/app.ts index dfce21d541..f9d27d80f6 100644 --- a/packages/backend/src/app.ts +++ b/packages/backend/src/app.ts @@ -490,7 +490,7 @@ export class App { // POST /incoming-payments // Create incoming payment router.post>( - '/incoming-payments', + '/:tenantId/incoming-payments', createValidatorMiddleware< ContextType> >( @@ -517,7 +517,7 @@ export class App { DefaultState, SignedCollectionContext >( - '/incoming-payments', + '/:tenantId/incoming-payments', createValidatorMiddleware< ContextType> >( @@ -541,7 +541,7 @@ export class App { // POST /outgoing-payment // Create outgoing payment router.post>( - '/outgoing-payments', + '/:tenantId/outgoing-payments', createValidatorMiddleware< ContextType> >( @@ -568,7 +568,7 @@ export class App { DefaultState, SignedCollectionContext >( - '/outgoing-payments', + '/:tenantId/outgoing-payments', createValidatorMiddleware< ContextType> >( @@ -592,7 +592,7 @@ export class App { // POST /quotes // Create quote router.post>( - '/quotes', + '/:tenantId/quotes', createValidatorMiddleware< ContextType> >( @@ -616,7 +616,7 @@ export class App { // GET /incoming-payments/{id} // Read incoming payment router.get( - '/incoming-payments/:id', + '/:tenantId/incoming-payments/:id', createValidatorMiddleware< ContextType >( @@ -641,7 +641,7 @@ export class App { // POST /incoming-payments/{id}/complete // Complete incoming payment router.post( - '/incoming-payments/:id/complete', + '/:tenantId/incoming-payments/:id/complete', createValidatorMiddleware>( resourceServerSpec, { @@ -663,7 +663,7 @@ export class App { // GET /outgoing-payments/{id} // Read outgoing payment router.get( - '/outgoing-payments/:id', + '/:tenantId/outgoing-payments/:id', createValidatorMiddleware>( resourceServerSpec, { @@ -685,7 +685,7 @@ export class App { // GET /quotes/{id} // Read quote router.get( - '/quotes/:id', + '/:tenantId/quotes/:id', createValidatorMiddleware>( resourceServerSpec, { diff --git a/packages/backend/src/graphql/resolvers/tenant.ts b/packages/backend/src/graphql/resolvers/tenant.ts index c05353051b..394c01d232 100644 --- a/packages/backend/src/graphql/resolvers/tenant.ts +++ b/packages/backend/src/graphql/resolvers/tenant.ts @@ -106,7 +106,7 @@ export function tenantToGraphql(tenant: Tenant): SchemaTenant { id: tenant.id, email: tenant.email, kratosIdentityId: tenant.kratosIdentityId, - //we should probably paginate this, but for now, that we only have like two endpoints it should be ok + // TODO: we should probably paginate this, but for now, that we only have like two endpoints it should be ok endpoints: tenant.endpoints.map(tenantEndpointToGraphql), createdAt: tenant.createdAt.toISOString(), updatedAt: tenant.updatedAt.toISOString() diff --git a/packages/backend/src/open_payments/payment/incoming/model.ts b/packages/backend/src/open_payments/payment/incoming/model.ts index 71913b1df4..c11d3805d2 100644 --- a/packages/backend/src/open_payments/payment/incoming/model.ts +++ b/packages/backend/src/open_payments/payment/incoming/model.ts @@ -146,7 +146,7 @@ export class IncomingPayment public getUrl(walletAddress: WalletAddress): string { const url = new URL(walletAddress.url) - return `${url.origin}${IncomingPayment.urlPath}/${this.id}` + return `${url.origin}/${this.tenantId}${IncomingPayment.urlPath}/${this.id}` } public async onCredit({ @@ -265,7 +265,7 @@ export class IncomingPayment } { return { receivedAmount: serializeAmount(this.receivedAmount), - authServer: authServerUrl + authServer: `${authServerUrl}/${this.tenantId}` } } } diff --git a/packages/backend/src/open_payments/payment/incoming/routes.ts b/packages/backend/src/open_payments/payment/incoming/routes.ts index ac1a38ee3c..d5cdc50dc2 100644 --- a/packages/backend/src/open_payments/payment/incoming/routes.ts +++ b/packages/backend/src/open_payments/payment/incoming/routes.ts @@ -127,6 +127,7 @@ async function createIncomingPayment( ctx: CreateContext ): Promise { const { body } = ctx.request + const { tenantId } = ctx.params let expiresAt: Date | undefined if (body.expiresAt !== undefined) { @@ -134,8 +135,8 @@ async function createIncomingPayment( } const incomingPaymentOrError = await deps.incomingPaymentService.create({ + tenantId, walletAddressId: ctx.walletAddress.id, - tenantId: ctx.tenantId, client: ctx.client, metadata: body.metadata, expiresAt, diff --git a/packages/backend/src/open_payments/payment/incoming_remote/service.ts b/packages/backend/src/open_payments/payment/incoming_remote/service.ts index 84920d13c3..9e8154ea01 100644 --- a/packages/backend/src/open_payments/payment/incoming_remote/service.ts +++ b/packages/backend/src/open_payments/payment/incoming_remote/service.ts @@ -16,6 +16,7 @@ import { isGrantError } from '../../grant/errors' interface CreateRemoteIncomingPaymentArgs { walletAddressUrl: string + tenantId: string expiresAt?: Date incomingAmount?: Amount metadata?: Record @@ -23,7 +24,8 @@ interface CreateRemoteIncomingPaymentArgs { export interface RemoteIncomingPaymentService { get( - url: string + url: string, + tenantId: string ): Promise< OpenPaymentsIncomingPaymentWithPaymentMethods | RemoteIncomingPaymentError > @@ -52,7 +54,7 @@ export async function createRemoteIncomingPaymentService( } return { - get: (url) => get(deps, url), + get: (url, tenantId) => get(deps, url, tenantId), create: (args) => create(deps, args) } } @@ -103,6 +105,7 @@ async function createIncomingPayment( const grantOptions = { authServer: walletAddress.authServer, + tenantId: createArgs.tenantId, accessType: AccessType.IncomingPayment, accessActions: [AccessAction.Create, AccessAction.ReadAll] } @@ -176,7 +179,8 @@ async function createIncomingPayment( async function get( deps: ServiceDependencies, - url: string + url: string, + tenantId: string ): Promise< OpenPaymentsIncomingPaymentWithPaymentMethods | RemoteIncomingPaymentError > { @@ -199,6 +203,7 @@ async function get( return getIncomingPayment(deps, { url, + tenantId, authServerUrl: publicIncomingPayment.authServer }) } @@ -207,13 +212,20 @@ async function getIncomingPayment( deps: ServiceDependencies, { url, + tenantId, authServerUrl, retryOnTokenError = true - }: { url: string; authServerUrl: string; retryOnTokenError?: boolean } + }: { + url: string + tenantId: string + authServerUrl: string + retryOnTokenError?: boolean + } ): Promise< OpenPaymentsIncomingPaymentWithPaymentMethods | RemoteIncomingPaymentError > { const grantOptions = { + tenantId, authServer: authServerUrl, accessType: AccessType.IncomingPayment, accessActions: [AccessAction.ReadAll] @@ -267,6 +279,7 @@ async function getIncomingPayment( return getIncomingPayment(deps, { url, + tenantId, authServerUrl, retryOnTokenError: false }) diff --git a/packages/backend/src/open_payments/payment/outgoing/routes.ts b/packages/backend/src/open_payments/payment/outgoing/routes.ts index e39e0c3baf..fa50cdc52b 100644 --- a/packages/backend/src/open_payments/payment/outgoing/routes.ts +++ b/packages/backend/src/open_payments/payment/outgoing/routes.ts @@ -97,6 +97,7 @@ async function createOutgoingPayment( ctx: CreateContext ): Promise { const { body } = ctx.request + const { tenantId } = ctx.params const baseOptions: OutgoingPaymentCreateBaseOptions = { walletAddressId: ctx.walletAddress.id, metadata: body.metadata, @@ -108,6 +109,7 @@ async function createOutgoingPayment( if (isCreateFromIncomingPayment(body)) { options = { ...baseOptions, + tenantId, incomingPayment: body.incomingPayment, debitAmount: body.debitAmount } @@ -122,6 +124,7 @@ async function createOutgoingPayment( } options = { ...baseOptions, + tenantId, quoteId } } diff --git a/packages/backend/src/open_payments/payment/outgoing/service.ts b/packages/backend/src/open_payments/payment/outgoing/service.ts index 507ef0d857..afcbd80128 100644 --- a/packages/backend/src/open_payments/payment/outgoing/service.ts +++ b/packages/backend/src/open_payments/payment/outgoing/service.ts @@ -288,7 +288,10 @@ async function createOutgoingPayment( throw OutgoingPaymentError.InsufficientGrant } } - const receiver = await deps.receiverService.get(payment.receiver) + const receiver = await deps.receiverService.get( + payment.receiver, + options.tenantId + ) if (!receiver) { throw OutgoingPaymentError.InvalidQuote } diff --git a/packages/backend/src/open_payments/quote/routes.ts b/packages/backend/src/open_payments/quote/routes.ts index bbe9c994d9..a20073fc30 100644 --- a/packages/backend/src/open_payments/quote/routes.ts +++ b/packages/backend/src/open_payments/quote/routes.ts @@ -73,9 +73,10 @@ async function createQuote( ctx: CreateContext ): Promise { const { body } = ctx.request + const { tenantId } = ctx.params const options: CreateQuoteOptions = { + tenantId, walletAddressId: ctx.walletAddress.id, - tenantId: ctx.tenantId, receiver: body.receiver, client: ctx.client, method: body.method diff --git a/packages/backend/src/open_payments/quote/service.ts b/packages/backend/src/open_payments/quote/service.ts index 8fbe06d407..0ce81fe63d 100644 --- a/packages/backend/src/open_payments/quote/service.ts +++ b/packages/backend/src/open_payments/quote/service.ts @@ -61,6 +61,7 @@ async function getQuote( interface QuoteOptionsBase { walletAddressId: string + tenantId: string receiver: string method: 'ilp' client?: string @@ -182,7 +183,10 @@ export async function resolveReceiver( deps: ServiceDependencies, options: CreateQuoteOptions ): Promise { - const receiver = await deps.receiverService.get(options.receiver) + const receiver = await deps.receiverService.get( + options.receiver, + options.tenantId + ) if (!receiver) { deps.logger.info( { receiver: options.receiver }, diff --git a/packages/backend/src/open_payments/receiver/service.ts b/packages/backend/src/open_payments/receiver/service.ts index cfd04f55f1..10a12f1c57 100644 --- a/packages/backend/src/open_payments/receiver/service.ts +++ b/packages/backend/src/open_payments/receiver/service.ts @@ -17,6 +17,7 @@ import { isRemoteIncomingPaymentError } from '../payment/incoming_remote/errors' interface CreateReceiverArgs { walletAddressUrl: string + tenantId: string expiresAt?: Date incomingAmount?: Amount metadata?: Record @@ -24,7 +25,7 @@ interface CreateReceiverArgs { // A receiver is resolved from an incoming payment export interface ReceiverService { - get(url: string): Promise + get(url: string, tenantId: string): Promise create(args: CreateReceiverArgs): Promise } @@ -50,7 +51,7 @@ export async function createReceiverService( } return { - get: (url) => getReceiver(deps, url), + get: (url, tenantId) => getReceiver(deps, url, tenantId), create: (url) => createReceiver(deps, url) } } @@ -135,7 +136,8 @@ async function createLocalIncomingPayment( async function getReceiver( deps: ServiceDependencies, - url: string + url: string, + tenantId: string ): Promise { try { const localIncomingPayment = await getLocalIncomingPayment(deps, url) @@ -143,7 +145,11 @@ async function getReceiver( return new Receiver(localIncomingPayment, true) } - const remoteIncomingPayment = await getRemoteIncomingPayment(deps, url) + const remoteIncomingPayment = await getRemoteIncomingPayment( + deps, + url, + tenantId + ) if (remoteIncomingPayment) { return new Receiver(remoteIncomingPayment, false) } @@ -212,10 +218,13 @@ export async function getLocalIncomingPayment( async function getRemoteIncomingPayment( deps: ServiceDependencies, - url: string + url: string, + tenantId: string ): Promise { - const incomingPaymentOrError = - await deps.remoteIncomingPaymentService.get(url) + const incomingPaymentOrError = await deps.remoteIncomingPaymentService.get( + url, + tenantId + ) if (isRemoteIncomingPaymentError(incomingPaymentOrError)) { return undefined diff --git a/packages/backend/src/open_payments/wallet_address/routes.ts b/packages/backend/src/open_payments/wallet_address/routes.ts index 652394985e..be78be0539 100644 --- a/packages/backend/src/open_payments/wallet_address/routes.ts +++ b/packages/backend/src/open_payments/wallet_address/routes.ts @@ -60,8 +60,8 @@ export async function getWalletAddress( ) ctx.body = walletAddress.toOpenPaymentsType({ - authServer: deps.config.authServerGrantUrl, - resourceServer: deps.config.openPaymentsUrl + authServer: `${deps.config.authServerGrantUrl}/${walletAddress.tenantId}`, + resourceServer: `${deps.config.openPaymentsUrl}/${walletAddress.tenantId}` }) } diff --git a/packages/frontend/app/lib/api/tenant.server.ts b/packages/frontend/app/lib/api/tenant.server.ts index 67cf13f486..431cdba0ed 100644 --- a/packages/frontend/app/lib/api/tenant.server.ts +++ b/packages/frontend/app/lib/api/tenant.server.ts @@ -48,6 +48,7 @@ export const listTenants = async (args: QueryTenantsArgs, cookie?: string) => { node { id createdAt + email } } pageInfo { diff --git a/packages/frontend/app/routes/tenants._index.tsx b/packages/frontend/app/routes/tenants._index.tsx index ac9dbc9b8b..14da1de40c 100644 --- a/packages/frontend/app/routes/tenants._index.tsx +++ b/packages/frontend/app/routes/tenants._index.tsx @@ -70,6 +70,7 @@ export default function TenantsPage() { onClick={() => navigate(`/tenants/${tenant.node.id}`)} > {tenant.node.id} + {tenant.node.email} )) ) : (