Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
ea7b2f7
feat(backend): tenants table v1 (#3132)
njlie Nov 26, 2024
9c6d7d9
Merge branch 'main' into 2893/multi-tenancy-v1
mkurapov Nov 28, 2024
ea7e660
feat(auth): tenants table v1 (#3133)
njlie Dec 2, 2024
349b01e
feat(auth): tenant service (#3144)
BlairCurrey Dec 3, 2024
07630c1
feat(backend): tenants service (#3123) (#3140)
njlie Dec 9, 2024
8e04749
Merge branch 'main' into 2893/multi-tenancy-v1
mkurapov Dec 9, 2024
10bc368
feat(auth, backend): seed operator tenant (#3156)
mkurapov Dec 11, 2024
1c43cdd
feat(integration): sign Admin API requests during integration tests (…
mkurapov Dec 16, 2024
a8b7ca4
feat(backend): tenant signature validation for admin api (#3164)
njlie Dec 17, 2024
fd8283b
feat: auth service-to-service api (#3148)
BlairCurrey Jan 14, 2025
0b6fb1a
feat(backend): tenanted assets (#3206)
mkurapov Jan 15, 2025
8ade26a
Merge branch 'main' into 2893/multi-tenancy-v1
mkurapov Jan 17, 2025
1bb2a9b
feat(fronted): tenanted admin api credentials (#3213)
BlairCurrey Jan 24, 2025
83c844d
feat(backend): tenant support for wallet address (#3114) (#3152)
koekiebox Jan 26, 2025
31df89e
feat(backend): backend tenant graphql resolvers (#3234)
njlie Feb 3, 2025
e7db0ad
Merge branch 'main' into 2893/multi-tenancy-v1
mkurapov Feb 6, 2025
99e7354
chore(integration): fix apollo client constructor
mkurapov Feb 10, 2025
8a863ed
chore(integration): fix & tidy integration tests
mkurapov Feb 10, 2025
a7f6b09
chore(backend): update auth apollo client signature timestamp
mkurapov Feb 10, 2025
4a4a48d
docs(localenv): add details for tenant credentials for admin ui (#3251)
BlairCurrey Feb 11, 2025
f8a61c4
feat(auth): tenanted grants (#3187)
njlie Feb 11, 2025
0b0e8a3
feat(2915): admin front-end for tenant support (#3254)
koekiebox Feb 12, 2025
f3cae25
feat(backend/frontend): 3256 able to view deleted tenant (#3299)
koekiebox Feb 14, 2025
8e227ca
feat(backend): tenanted incoming payments (#3271)
oana-lolea Feb 17, 2025
52b7c18
feat(backend): tenanted quotes and outgoing payments (#3171)
sanducb Feb 17, 2025
9d32bb6
feat(frontend): add operator-contextual dropdowns for tenant selectio…
njlie Feb 19, 2025
358332e
feat(tenantSettings): initial implementation (#3281)
golobitch Feb 24, 2025
c1ae622
feat: handle updating operator api secret (#3328)
BlairCurrey Mar 17, 2025
ab156ad
feat: tenanted peers (#3352)
oana-lolea Apr 1, 2025
3258f8c
feat(backend)!: tenanted rates endpoints (#3327)
sanducb Apr 2, 2025
3b4b0c7
feat(wallet-address)!: possibility to specify wallet address range (#…
golobitch Apr 7, 2025
fe24dc3
feat(backend): tenanted webhooks (#3317)
njlie Apr 15, 2025
cb76b93
Merge branch 'main' into 2893/multi-tenancy-v1
njlie Apr 24, 2025
e0dbac7
fix: post-main merge test fixes
njlie Apr 29, 2025
800935b
feat(backend): also publish webhooks to operators if primary recipien…
njlie May 1, 2025
0d5499f
fix(localenv): use https in openPaymentsUrl env vars in local backend…
njlie May 2, 2025
27dbb6b
Merge branch 'main' into 2893/multi-tenancy-v1
njlie May 21, 2025
f58721e
feat(backend): try to match 'wallet address not found' webhook to ten…
njlie May 27, 2025
dedf814
fix: bruno collection for open payments examples (#3421)
njlie May 28, 2025
235bcc4
feat(backend): validate tenant settings inputs (#3435)
njlie Jun 4, 2025
5baeb2c
feat(backend): make tenantId required when fetching peer by destinati…
mkurapov Jun 9, 2025
955bfb2
Merge branch 'main' into 2893/multi-tenancy-v1
mkurapov Jun 10, 2025
12752d9
test(backend): update payment method tests after minSendAmount featur…
mkurapov Jun 10, 2025
29f45cb
feat(localenv): add tenanted mock ASE to local environment (#3451)
njlie Jun 10, 2025
b529ae5
feat(backend): allow tenant id to be specified during tenant creation…
njlie Jun 10, 2025
9a719a0
feat(backend): abstract away payment method generation, add ILP_ADDRE…
mkurapov Jun 13, 2025
21c9240
feat(localenv): tenanted mock ase webhook server apollo client (#3459)
njlie Jun 16, 2025
f18c51c
feat: remove tenant id from continuation uri (#3470)
njlie Jun 24, 2025
468a7fa
fix(tests): fix performance tests for multi-tenancy (#3475)
njlie Jul 2, 2025
f51fd30
Merge branch 'main' into 2893/multi-tenancy-v1
njlie Jul 3, 2025
3d0b7c5
feat(backend): add tenantId to webhook, outgoing + combined payments …
mkurapov Jul 4, 2025
613dd70
feat(localenv): refer to admin UI url as belonging to operator or ten…
njlie Jul 6, 2025
f7f4839
chore(bruno): fix grant request outgoing payment in Open Payments exa…
mkurapov Jul 6, 2025
e122ef8
chore(bruno): fix grant request outgoing payment in Tenanted Open Pay…
mkurapov Jul 6, 2025
c2c1f24
feat(backend): add sendAllWebhooksToOperator env variable (#3503)
mkurapov Jul 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{senderOpenPaymentsAuthHost}}/continue/{{continueId}}
url: {{senderOpenPaymentsContinuationUri}}
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,21 @@ script:post-response {
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 + authUrl.path);
} else {
bru.setEnvVar("receiverOpenPaymentsAuthHost", body?.authServer);
}

const resourceUrl = url.parse(body?.resourceServer)
if (
resourceUrl.hostname.includes('cloud-nine-wallet') ||
resourceUrl.hostname.includes('happy-life-bank')
){
const port = resourceUrl.hostname.includes('cloud-nine-wallet') ? 3000 : 4000
bru.setEnvVar("receiverOpenPaymentsHost", 'http://localhost:' + port + resourceUrl.path);
} else {
bru.setEnvVar("receiverOpenPaymentsHost", body?.resourceServer);
}
}

tests {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ script:post-response {
}

const body = res.getBody()

bru.setEnvVar("senderAssetCode", body?.assetCode)
bru.setEnvVar("senderAssetScale", body?.assetScale)

Expand All @@ -38,10 +38,18 @@ script:post-response {
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 + authUrl.path);
} else {
bru.setEnvVar("senderOpenPaymentsAuthHost", body?.authServer);
}

const resourceUrl = url.parse(body?.resourceServer)
if (resourceUrl.hostname.includes('cloud-nine-wallet') || resourceUrl.hostname.includes('happy-life-bank')) {
const port = resourceUrl.hostname.includes('cloud-nine-wallet') ? bru.getEnvVar('senderOpenPaymentsPort') : bru.getEnvVar('receiverOpenPaymentsPort')
bru.setEnvVar("senderOpenPaymentsHost", 'http://localhost:' + port + resourceUrl.path);
} else {
bru.setEnvVar("senderOpenPaymentsHost", body?.resourceServer);
}
}

tests {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{receiverOpenPaymentsAuthHost}}/
url: {{receiverOpenPaymentsAuthHost}}
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{senderOpenPaymentsAuthHost}}/
url: {{senderOpenPaymentsAuthHost}}
body: json
auth: none
}
Expand All @@ -21,8 +21,7 @@ body:json {
],
"identifier": "{{senderWalletAddress}}",
"limits": {
"debitAmount": {{debitAmount}},
"receiveAmount": {{receiveAmount}}
"debitAmount": {{debitAmount}}
}
}
]
Expand All @@ -47,6 +46,9 @@ script:post-response {
const scripts = require('./scripts');

scripts.storeTokenDetails();

const body = res.getBody()
bru.setEnvVar("senderOpenPaymentsContinuationUri", body?.continue.uri)
}

tests {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{senderOpenPaymentsAuthHost}}/continue/{{continueId}}
url: {{senderOpenPaymentsContinuationUri}}
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ script:pre-request {

script:post-response {
const body = res.getBody();

if (body?.id) {
bru.setEnvVar("incomingPaymentId", body.id.split("/").pop());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ script:pre-request {

script:post-response {
const body = res.getBody();

if (body?.id) {
bru.setEnvVar("outgoingPaymentId", body.id.split("/").pop());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ 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)
Expand All @@ -37,10 +37,21 @@ script:post-response {
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 + authUrl.path);
} else {
bru.setEnvVar("receiverOpenPaymentsAuthHost", body?.authServer);
}

const resourceUrl = url.parse(body?.resourceServer)
if (
resourceUrl.hostname.includes('cloud-nine-wallet') ||
resourceUrl.hostname.includes('happy-life-bank')
){
const port = resourceUrl.hostname.includes('cloud-nine-wallet') ? 3000 : 4000
bru.setEnvVar("receiverOpenPaymentsHost", 'http://localhost:' + port + resourceUrl.path);
} else {
bru.setEnvVar("receiverOpenPaymentsHost", body?.resourceServer);
}
}

tests {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,18 @@ script:post-response {
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 + authUrl.path);
} else {
bru.setEnvVar("senderOpenPaymentsAuthHost", body?.authServer);
}

const resourceUrl = url.parse(body?.resourceServer)
if (resourceUrl.hostname.includes('cloud-nine-wallet') || resourceUrl.hostname.includes('happy-life-bank')) {
const port = resourceUrl.hostname.includes('cloud-nine-wallet') ? bru.getEnvVar('senderOpenPaymentsPort') : bru.getEnvVar('receiverOpenPaymentsPort')
bru.setEnvVar("senderOpenPaymentsHost", 'http://localhost:' + port + resourceUrl.path);
} else {
bru.setEnvVar("senderOpenPaymentsHost", body?.resourceServer);
}
}

tests {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{receiverOpenPaymentsAuthHost}}/
url: {{receiverOpenPaymentsAuthHost}}
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{senderOpenPaymentsAuthHost}}/
url: {{senderOpenPaymentsAuthHost}}
body: json
auth: none
}
Expand Down Expand Up @@ -46,6 +46,9 @@ script:post-response {
const scripts = require('./scripts');

scripts.storeTokenDetails();

const body = res.getBody()
bru.setEnvVar("senderOpenPaymentsContinuationUri", body?.continue.uri)
}

tests {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ meta {
}

post {
url: {{senderOpenPaymentsAuthHost}}/
url: {{senderOpenPaymentsAuthHost}}
body: json
auth: none
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
meta {
name: Continuation Request
type: http
seq: 8
}

post {
url: {{senderTenantOpenPaymentsContinuationUri}}
body: json
auth: none
}

headers {
Authorization: GNAP {{continueToken}}
}

script:pre-request {
const scripts = require('./scripts');

await scripts.addSignatureHeaders();
}

script:post-response {
const scripts = require('./scripts');

scripts.storeTokenDetails();
}

tests {
test("Status code is 200", function() {
expect(res.getStatus()).to.equal(200);
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
meta {
name: Create Incoming Payment
type: http
seq: 4
}

post {
url: {{receiverOpenPaymentsHost}}/incoming-payments
body: json
auth: none
}

headers {
Authorization: GNAP {{accessToken}}
}

body:json {
{
"walletAddress": "{{receiverWalletAddress}}",
"incomingAmount": {
"value": "100",
"assetCode": "{{receiverAssetCode}}",
"assetScale": {{receiverAssetScale}}
},
"expiresAt": "{{tomorrow}}",
"metadata": {
"description": "Free Money!"
}
}
}

script:pre-request {
const scripts = require('./scripts');

bru.setEnvVar("tomorrow", (new Date(new Date().setDate(new Date().getDate() + 1))).toISOString());

scripts.addHostHeader();

await scripts.addSignatureHeaders();
}

script:post-response {
const body = res.getBody();

if (body?.id) {
bru.setEnvVar("incomingPaymentId", body.id.split("/").pop());
}

}

tests {
test("Status code is 201", function() {
expect(res.getStatus()).to.equal(201);
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
meta {
name: Create Outgoing Payment
type: http
seq: 9
}

post {
url: {{senderTenantOpenPaymentsHost}}/outgoing-payments
body: json
auth: none
}

headers {
Authorization: GNAP {{accessToken}}
}

body:json {
{
"walletAddress": "{{senderTenantWalletAddress}}",
"quoteId": "{{senderTenantWalletAddress}}/quotes/{{quoteId}}",
"metadata": {
"description": "Free Money!"
}
}
}

script:pre-request {
const scripts = require('./scripts');

scripts.addHostHeader();

await scripts.addSignatureHeaders();
}

script:post-response {
const body = res.getBody();

if (body?.id) {
bru.setEnvVar("outgoingPaymentId", body.id.split("/").pop());
}

}

tests {
test("Status code is 201", function() {
expect(res.getStatus()).to.equal(201);
});
}
Loading
Loading