Skip to content

Conversation

@oana-lolea
Copy link
Contributor

@oana-lolea oana-lolea commented Oct 22, 2025

Changes proposed in this pull request

  • Allow filtering incoming payments by initiatedBy

Context

Fixes #3648 | RAF-1165

Checklist

  • Related issues linked using fixes #number
  • Tests added/updated
  • Make sure that all checks pass
  • Bruno collection updated (if necessary)
  • Documentation issue created with user-docs label (if necessary)
  • OpenAPI specs updated (if necessary)

@github-actions github-actions bot added type: tests Testing related pkg: backend Changes in the backend package. pkg: frontend Changes in the frontend package. type: source Changes business logic pkg: mock-ase pkg: mock-account-service-lib labels Oct 22, 2025
@github-actions
Copy link

github-actions bot commented Oct 22, 2025

🚀 Performance Test Results

Test Configuration:

  • VUs: 4
  • Duration: 1m0s

Test Metrics:

  • Requests/s: 44.29
  • Iterations/s: 14.76
  • Failed Requests: 0.00% (0 of 2665)
📜 Logs

> [email protected] run-tests:testenv /home/runner/work/rafiki/rafiki/test/performance
> ./scripts/run-tests.sh -e test "-k" "-q" "--vus" "4" "--duration" "1m"

Cloud Nine GraphQL API is up: http://localhost:3101/graphql
Cloud Nine Wallet Address is up: http://localhost:3100/
Happy Life Bank Address is up: http://localhost:4100/
cloud-nine-wallet-test-backend already set
cloud-nine-wallet-test-auth already set
happy-life-bank-test-backend already set
happy-life-bank-test-auth already set
     data_received..................: 962 kB 16 kB/s
     data_sent......................: 2.0 MB 34 kB/s
     http_req_blocked...............: avg=6.03µs   min=2.15µs   med=5.18µs   max=650.82µs p(90)=6.25µs   p(95)=6.77µs  
     http_req_connecting............: avg=430ns    min=0s       med=0s       max=614.98µs p(90)=0s       p(95)=0s      
     http_req_duration..............: avg=89.67ms  min=7.93ms   med=73.85ms  max=532.26ms p(90)=152.12ms p(95)=172.69ms
       { expected_response:true }...: avg=89.67ms  min=7.93ms   med=73.85ms  max=532.26ms p(90)=152.12ms p(95)=172.69ms
     http_req_failed................: 0.00%  ✓ 0         ✗ 2665
     http_req_receiving.............: avg=84.94µs  min=25.04µs  med=76.56µs  max=1.3ms    p(90)=112.21µs p(95)=139.55µs
     http_req_sending...............: avg=34.29µs  min=10.54µs  med=27.16µs  max=1.59ms   p(90)=40.25µs  p(95)=54.3µs  
     http_req_tls_handshaking.......: avg=0s       min=0s       med=0s       max=0s       p(90)=0s       p(95)=0s      
     http_req_waiting...............: avg=89.55ms  min=7.76ms   med=73.68ms  max=532.2ms  p(90)=152.01ms p(95)=172.59ms
     http_reqs......................: 2665   44.286114/s
     iteration_duration.............: avg=270.72ms min=178.73ms med=256.92ms max=1.04s    p(90)=324.86ms p(95)=359.48ms
     iterations.....................: 888    14.756499/s
     vus............................: 4      min=4       max=4 
     vus_max........................: 4      min=4       max=4 

@oana-lolea oana-lolea requested a review from mkurapov October 22, 2025 08:04
@oana-lolea oana-lolea marked this pull request as ready for review October 22, 2025 08:04
Comment on lines 630 to 636
if (
[IncomingPaymentState.Pending, IncomingPaymentState.Expired].includes(
payment.state
)
) {
return BigInt(0)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should include the received amount regardless of the incoming payment state

return payment
}

async function getPage(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can have the getWalletAddressPage use this function also, just need to add in the wallet address filter in the options

"Specify the sort order of incoming payments based on their creation date, either ascending or descending."
sortOrder: SortOrder
"Filter incoming payments based on specific criteria such as initiation reason."
filter: IncomingPaymentFilter
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's add this filter to the walletAddress.incomingPayments resolver (since that is the resolver we will be using for the POS service API)

function validateReceiveAmount(
deps: ServiceDependencies,
payment: IncomingPayment,
sentAmount: bigint | undefined
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
sentAmount: bigint | undefined
receivedAmount: bigint | undefined

const { sortOrder, filter, ...pagination } = args
const order = sortOrder === 'ASC' ? SortOrder.Asc : SortOrder.Desc
const incomingPayments = await incomingPaymentService.getWalletAddressPage({
const incomingPayments = await incomingPaymentService.getPage({
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Used getPage to be able to use the filter

if (walletAddressId) {
query.where('walletAddressId', walletAddressId)
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added client and walletAddressId so that getWalletAddressPage can use getPage

@oana-lolea oana-lolea requested a review from mkurapov October 24, 2025 07:20
Copy link
Contributor

@mkurapov mkurapov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, a few comments

@oana-lolea oana-lolea requested a review from mkurapov October 28, 2025 15:50
Copy link
Contributor

@mkurapov mkurapov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Final comment

getPage: (pagination_: Pagination, sortOrder_?: SortOrder) =>
getPageFn(pagination_, sortOrder_),
page: incomingPayments,
sortOrder: order
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to add filter in this as well, otherwise the payment results won't match the page info results

@oana-lolea oana-lolea merged commit 99f64ed into pos-card-services Oct 29, 2025
52 checks passed
@oana-lolea oana-lolea deleted the oana/raf-1165 branch October 29, 2025 09:58
mkurapov added a commit that referenced this pull request Oct 31, 2025
* feat: created the backbone for the card service (#3508)

* Created the backbone for the card service

* Format fix

* feat: add card service to docker compose

---------

Co-authored-by: Nathan Lie <[email protected]>

* feat: initialize POS service (#3509)

* feat(wip): pos service

* Completed POS service init

* Added docker files and missing scripts

* Removed editor code after handling conflicts

* Updated docker-compose for cloud 9 localenv and removed unnecessary telemetry command from dockerfile

* Updated docker compose files for c9 and hlb

* Updated ports and env var names from config

* fix: install ts-node-dev, add main script to index.ts

---------

Co-authored-by: Nathan Lie <[email protected]>

* feat(card-service): card payments table (#3514)

* migration & model for card payments

* feat(pos): create merchants table (#3519)

* merchants table migrations and model

* typo

* Docker compose fix (for slower PCs) on localenv (#3522)

* fix(cards-service): add dependencies to package.json (#3530)

* fix(cards-service): add dependencies to package.json

* chore(cards-service): lockfile

* feat: Added CardService client in rafiki backend (#3510)

* feat(pos): pos card services table (#3526)

* merchants table migrations and model

* feat(card-service): introduce testcontainers for database and redis (#3533)

* feat(card-service): add testcontainers setup

* chore(cards-service): lockfile

* feat(cards-service): fix test containers setup

* fix(cards-service): fix type issue

* feat(pos): merchants services (#3528)

* merchant service

* jest setup

* tests

* feat: Integrate Redis client in Card Service for (requestId, posServiceHost) mapping (#3524)

* Integrate Redis client in Card Service for (requestId, posServiceHost) mapping

* remove unused dep

* prettier fix

* Separate logging params from the message itself

* ttl

* prettier fix

* Rewrite redis service tests to use testcontainers instead of mocks

---------

Co-authored-by: Antoniu Neacsu <[email protected]>

* feat(pos): create merchant route (#3538)

* post merchants route

---------

Co-authored-by: Nathan Lie <[email protected]>

* feat(card-service): introduce AuditLogService (#3525)

* feat(card-service): introduce AuditLogService

* feat(card-service): add testcontainers setup

* chore(cards-service): lockfile

* fix service update method and add tests.
card_payemnts migration index added

* chore(cards-service): remove unnecessary app container start in tests

* chore(cards-service): add uuid as a placeholder for open payments tennantId for clarity

* chore(cards-service): format imports

* fix(localenv): add required env vars to docker-compose (#3550)

* feat(point-of-sale): POS Device service (#3548)

* pos device service

* Added algorithm as param on registering device, updated tests so that we check the device obj

* feat(pos): RAF-1121-revoke merchant route (#3553)

* feat(ci/cd): add ci jobs for testing point of sale and card-service (#3554)

[CLOSES RAF-1109](https://linear.app/interledger/issue/RAF-1109/devops-cicd-github-actions-to-test-card-and-pos-service)

* fix: (rafiki backend) Augment Wallet Address response with cardService field (#3552)

* feat: add cardServiceUrl configuration and update related routes

* feat: rename CARD_SERVICE_HOST to CARD_SERVICE_URL for consistency

* fix format

---------

Co-authored-by: HRadry <[email protected]>

* fix(localenv): rename CARD_SERVICE_HOST to CARD_SERVICE_URL

* feat(point-of-sale): added route for registering a POS device (#3555)

* Route for registering a POS device

* Fixed issue addressed in comments, tried to fix the port issue of jest

* Changed test container port to 0, format fix

* fix: typo in route

* feat: bruno calls for creating merchant and registering POS device (#3558)

* feat: [RAF-1083][POS Service]: Add GQL Client for Rafiki BE calls for incoming payment operations  (#3546)

* feat(pos): device revoke (#3560)

* feat(pos): nested routing for devices, device revoke route & error handling

* feat(pos-service): pos devices router and service specific error handling

* feat(pos): test app now uses dynamic ports to avoid jest worker conflicts

* fix(pos): fix tests

* chore(pos-service): PR suggestions

* fix(pos): extend error handling approach to register route in pos devices

* chore(pos): remove unused knex in routes

* chore(pos): rename DeviceRoutes

* chore(pos): pnpm-lock

* chore(pos): format

* feat: added card service client to initiate a payment from pos service (#3535)

* Added card service client to initiate a payment

* feat(backend): Raul/raf 1095 augment outgoing payments for card (#3539)

* feat(backend): add card information to outgoing payment graph ql

* fix(backend): save expiry as string MM/YY

* feature(backend): add mm/yy validation

* fix(backend): run prittier

* fix(backend): comments and set type to table name and relation

* fix(backend): remove unused deps

* feat(backend): add tests for outgoing payments with card details

* fix(backend): fix pr comments

---------

Co-authored-by: Raul Ranete <[email protected]>

* feat(point-of-sale): service for obtaining walletAddress by its url from Rafiki Backend (#3578)

* Added axios call to rafiki backend for getting wallet address by its url

* Handled the case when cardServiceUrl may not be set on wallet address

* feat(card-service): add endpoints to initiate payment and receive payment result (#3547)

* feat(card-service): add endpoints to initiate payment and recieve payment result

* fix: improve open api spec validation

* fix: rename paymetn timeout var and comment terminal cert prop

* fix: add PaymentRouteError

* fix: rename env var and remove deleted prop

* fix(backend): made CARD_SERVICE_URL optional (#3600)

* Made CARD_SERVICE_URL optional

* Created cardService container only if cardServiceUrl is set in config

* Added noop card service when cardServiceUrl is not provided

* Regenerated graphql

* Added warning when CARD_SERVICE_URL is not set

* feat(point-of-sale): POST payment route (#3597)

* Payment route structure

* Added routes test file

* Removed some comments

* Added test for unknown error

* Updated graphql generated files

* feat(backend): publish webhooks to POS service if applicable (#3596)

* feat: created the backbone for the card service (#3508)

* Created the backbone for the card service

* Format fix

* feat: add card service to docker compose

---------

Co-authored-by: Nathan Lie <[email protected]>

* feat: Integrate Redis client in Card Service for (requestId, posServiceHost) mapping (#3524)

* Integrate Redis client in Card Service for (requestId, posServiceHost) mapping

* remove unused dep

* prettier fix

* Separate logging params from the message itself

* ttl

* prettier fix

* Rewrite redis service tests to use testcontainers instead of mocks

---------

Co-authored-by: Antoniu Neacsu <[email protected]>

* feat(point-of-sale): added route for registering a POS device (#3555)

* Route for registering a POS device

* Fixed issue addressed in comments, tried to fix the port issue of jest

* Changed test container port to 0, format fix

* feat(backend): publish webhooks to POS service if applicable

* feat: add column to incoming payment

* fix: tests

* feat: add warn log

* fix: better logger requirements for finalizing webhook recipients

* fix: make open payments default reason for incoming payment initialization

* fix: improve optional env var function

* fix: warn log, better optional env, backfill migration, tests

* fix: rebase bugs

* chore: regenerate lockfile

* chore: regenerate gql

* fix: tests

* fix: remove metadata; better tests

* fix: build errors

* fix: tests, add type file

---------

Co-authored-by: oana-lolea <[email protected]>
Co-authored-by: zeppelin44 <[email protected]>
Co-authored-by: Antoniu Neacsu <[email protected]>

* feat(point-of-sale): handle incoming payment completed webhooks from backend (#3613)

* feat: created the backbone for the card service (#3508)

* Created the backbone for the card service

* Format fix

* feat: add card service to docker compose

---------

Co-authored-by: Nathan Lie <[email protected]>

* feat: initialize POS service (#3509)

* feat(wip): pos service

* Completed POS service init

* Added docker files and missing scripts

* Removed editor code after handling conflicts

* Updated docker-compose for cloud 9 localenv and removed unnecessary telemetry command from dockerfile

* Updated docker compose files for c9 and hlb

* Updated ports and env var names from config

* fix: install ts-node-dev, add main script to index.ts

---------

Co-authored-by: Nathan Lie <[email protected]>

* feat: Integrate Redis client in Card Service for (requestId, posServiceHost) mapping (#3524)

* Integrate Redis client in Card Service for (requestId, posServiceHost) mapping

* remove unused dep

* prettier fix

* Separate logging params from the message itself

* ttl

* prettier fix

* Rewrite redis service tests to use testcontainers instead of mocks

---------

Co-authored-by: Antoniu Neacsu <[email protected]>

* feat(point-of-sale): added route for registering a POS device (#3555)

* Route for registering a POS device

* Fixed issue addressed in comments, tried to fix the port issue of jest

* Changed test container port to 0, format fix

* feat(wip): merge pos-card-services

* feat(point-of-sale): handle incoming payment completed webhooks from backend

* fix: typo, expose incoming payment url in gql

* fix: typo & unintended changes

* chore: regenerate gql

* feat: clean up request map if wehbook times out

---------

Co-authored-by: oana-lolea <[email protected]>
Co-authored-by: zeppelin44 <[email protected]>
Co-authored-by: Antoniu Neacsu <[email protected]>

* fix: test

* feat(card-service): call outgoing payment creation during payment route (#3614)

* feat(card-service): call outgoing payment creation during payment route

* chore: regenerate graphql

* chore: regenerate gql

* chore(backend): remove tenant id from card service path in WA response (#3627)

* chore(point-of-sale): add expiry for incoming payments created by pos service (#3623)

* chore(point-of-sale): add expiry for incoming payments created by pos service

* chore(point-of-sale): use jest timers for incoming payment expiry in tests

* feat(card-service): remove `debitAmount` from outgoing payment creation admin API request (#3632)

* chore(pos, card-service): update generated graphql types

* feat(card-service): remove debitAmount from outgoing payment creation mutation

* feat(backend): add custom webhook URL for POS (#3628)

* feat(backend): add custom webhook URL for POS

* fix(backend): remove fallback webhook URL for POS

* fix(point-of-sale): added bruno script + added missing env variables to local docker compose file (#3629)

* Added bruno script + added missing env variables to local docker containers

* Added missing env variables for card-service

* Sent tenant id to backend for now, updated bruno req, fixed createIncPayment mutation

* Removed unnecessary header

* Fixed a test after mutation update

* Updated generated graphql files

* Fixed connection between payment service calls

* Fixed env variables and mutation type for creating inc payment

* fix: match payment bodies for pos and card service (#3653)

* Matched bodies between pos and card services /payment

* Forgot to stage this

* Fixed test

* Updated graphql types

* feat(card-service, pos-service): updating payment routes with new payload (#3655)

* chore: update docker compose file to make webhook signatures work

* feat(pos): update /payment request payload

* feat(card-service): updating payment handler with new payload

* chore(bruno): update initiate Payment request

* chore: lint OpenAPI

* feat(backend): additional webhook events for outgoing payments (#3651)

* feat(backend): add additional webhook events for outgoing payments

* feat(backend): update webhook recipients logic

* chore(backend): extract funded and cancelled events into a new type

* chore(backend): move IncomingPaymentInitiationReason to separate file

* chore(backend): simplify webhook recipients logic

* feat(backend): Update handling of `OutgoingPaymentCardDetails` (#3658)

* feat(backend): update CardDetailsInput GraphQL type

* feat(backend): update OutgoingPaymentCardDetails model

* feat(backend): start publishing cardDetails in outgoing_payment.created webhook

* chore(backend): remove old expiry check

* test(backend): update outgoing payment resolver test

* chore(backend): remove unused cardDetails from GraphQL API

* test(backend): update outgoing payment resolver test

* chore(backend): update migration to not add already included requestId

* chore(backend): update outgoing payment test

* feat(card-service): update outgoing payment creation with new payload

* test(backend): update outgoing payment test

* fix(backend):  fix webhook resolver filter for OP funded and cancelled events (#3662)

* chore: add sha.js override to fix security vulnerability

* feat(card-service): handle payment cancelled & funded events (#3667)

* feat(card-service): handle payment cancelled & funded events

* feat(card-service): fix tests

* fix: updates to make e2e payment flow work (#3668)

* chore(localenv): add CARD_WEBHOOK_SERVICE_URL to cloud nine wallet backend

* feat(backend): fetch cardDetails during outgoing payment funded and cancelled

* chore(pos): correctly handle response from card service

* test(pos): update card service client test

* chore(card-service): add paymentRoutes to AppServices

* chore(backend): fix withGraphFetched query

* test(pos): remove unused test

* fix(card-service): update payment result type

* chore(card-service): format

---------

Co-authored-by: Max Kurapov <[email protected]>

* chore: add card-service and pos-service image build steps in CI (#3657)

* Added card-service and point-of-sale images when pushing to registry

* Added dockerfile.prod for card-service

* Added spectral to validate card-service open api specs

* Fix on building the packages

* Fixed dockerfile

* Added token-introspection

* trying to fix crypto issue

* Another try to fix card-service pipeline

* Still trying

* Testing if crypto is actually the issue here

* Trying to debug

* Added @types/node so it can see the crypto package

* Updated yaml for card-service, removed unnecessary changes

* Fix format

* Updated axios version of pos

* Added tags to card-service.yaml

* Removed token-introspection from pos and card services

* Added command to run pos and card services in docker file

* chore(point-of-sale): update pos service response structure (#3675)

* chore(point-of-sale): update pos service response structure

* fix: map cleanup in finally block

* feat: add integration test for pos-card flow (#3678)

* added integration test for pos flow

* updated pnpm lock

* Added webhook urls and signature secrets to c9 and hlf env

* Set up hosts for card service and pos for IT

* Added test env to performance test job

* Updated IT structure and test name, removed unnecessary formatting

* Forgot to remove 'card_expired' from result

* Updated result model after merging pos-cards branch

* Used prod docker files for pos and card services, added open api files to card-service build, fixed axios dependency issue

* feat: added sender wallet address to incoming payment (#3705)

* Added sender wallet address to incoming payment

* chore(card,pos-service): update alpine image

* chore(card-service, pos-service): cleanup unused code (#3718)

* chore(point-of-sale): remove merchant service, knex, db connections

* chore(card-service): remove knex, objection, db connection

* chore(localenv): remove db connections for pos and card service

* chore(pos): remove migration folder from dockerfile

* chore(bruno): remove unused POS service APIs

* chore(testenv): remove db connection for card and pos services

* chore(pos, card-service): use core imports from apollo client

* chore(point-of-sale, card-service): update webhook handling (#3725)

* chore(card-service): rename `/payment-event` route to `/webhook`

* chore(point-of-sale): make webhook signature signing optional

* chore(testenv): update CARD_WEBHOOK_SERVICE_URL

* test(point-of-sale): allow optional webhook signature

* feat(point-of-sale): pos service API for getting incoming payments (#3708)

* feat(point-of-sale): API for getting pos service's incoming payments

* fix: tests

* feat: filter out unnecessary fields in response

* chore: bruno collection urls

* feat: include senderWalletAddress in query

* fix: bruno urls

* fix: serialize query params properly for gql requests

* fix: expose tenant id in payment gql requests

* feat: use open payments-esque response format

* feat: include metadata

* feat: remove unnecessary fields

* fix: regenerate gql

* fix: imports

* fix: proper object assign use and pr comments

* feat(backend): add filtering incoming payments by initiatedBy (#3714)

* add filtering incoming payments by initiatedBy

* Added filter to walletAddress.incomingPayments resolver

* added filtering by initiatedBy to also work with notIn

* Added filter to getPage functions

* feat(point-of-sale): filter incoming payments by those initiated by card payemnt (#3734)

* chore(card-service): remove unused components (#3736)

* chore(card-service): remove pos-store

* chore(backend): remove redis from instantiation

* chore: remove unused pos & card service components (#3737)

* chore(testenv): remove port

* chore(localenv): removed card & pos volumes, ports, seed

* chore(card-service): remove init script

* chore(backend): remove unused card service

* chore(backend): remove card expiry from outgoing payment errors

* feat(point-of-sale): add `senderWalletAddress` to incoming payment creation (#3738)

* feat(point-of-sale): add USE_HTTP flag

* feat(point-of-sale): pass in senderWalletAddress into incoming payment creation

* chore(testenv): add USE_HTTP to point-of-sale service

* chore(point-of-sale): update card service client log service name

* test(point-of-sale): update payment route & service tests

---------

Co-authored-by: oana-lolea <[email protected]>
Co-authored-by: Nathan Lie <[email protected]>
Co-authored-by: Arpi Lengyel <[email protected]>
Co-authored-by: Arpi Lengyel <[email protected]>
Co-authored-by: xplicit <[email protected]>
Co-authored-by: zeppelin44 <[email protected]>
Co-authored-by: Antoniu Neacsu <[email protected]>
Co-authored-by: MiguelLescasJorgeSebastian <[email protected]>
Co-authored-by: HRadry <[email protected]>
Co-authored-by: Raul <[email protected]>
Co-authored-by: Raul Ranete <[email protected]>
Co-authored-by: dragosp1011 <[email protected]>
Co-authored-by: Bogdan S <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pkg: backend Changes in the backend package. pkg: frontend Changes in the frontend package. pkg: mock-account-service-lib pkg: mock-ase type: source Changes business logic type: tests Testing related

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants