diff --git a/.github/workflows/node-build.yml b/.github/workflows/node-build.yml index 7561b94973..6ec9147bcc 100644 --- a/.github/workflows/node-build.yml +++ b/.github/workflows/node-build.yml @@ -3,10 +3,10 @@ name: Node Build on: workflow_dispatch: schedule: - - cron: '0 21 * * *' + - cron: "0 21 * * *" pull_request: branches: - - '**' + - "**" push: branches: - main @@ -17,9 +17,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 steps: - - uses: actions/checkout@v4 - - uses: ./.github/workflows/rafiki/env-setup - - run: pnpm checks + - uses: actions/checkout@v4 + - uses: ./.github/workflows/rafiki/env-setup + - run: pnpm checks backend: runs-on: ubuntu-latest @@ -141,7 +141,7 @@ jobs: - name: fail if GraphQL was generated if: steps.verify-changed-files.outputs.files_changed == 'true' run: exit 1 - + codeql-analyze: runs-on: ubuntu-latest needs: prerequisite @@ -153,20 +153,20 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'javascript' ] + language: ["javascript"] config: - - './.github/codeql/source.yml' - - './.github/codeql/tests.yml' + - "./.github/codeql/source.yml" + - "./.github/codeql/tests.yml" steps: - - uses: actions/checkout@v4 - - uses: ./.github/workflows/rafiki/env-setup - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - config-file: ${{ matrix.config }} - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + - uses: actions/checkout@v4 + - uses: ./.github/workflows/rafiki/env-setup + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + config-file: ${{ matrix.config }} + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 integration-test: runs-on: ubuntu-22.04 @@ -186,8 +186,10 @@ jobs: run: | echo "127.0.0.1 cloud-nine-wallet-test-backend" | sudo tee -a /etc/hosts echo "127.0.0.1 cloud-nine-wallet-test-auth" | sudo tee -a /etc/hosts + echo "127.0.0.1 cloud-nine-wallet-test-card-service" | sudo tee -a /etc/hosts echo "127.0.0.1 happy-life-bank-test-backend" | sudo tee -a /etc/hosts echo "127.0.0.1 happy-life-bank-test-auth" | sudo tee -a /etc/hosts + echo "127.0.0.1 happy-life-bank-test-point-of-sale" | sudo tee -a /etc/hosts - name: Build dependencies run: pnpm --filter integration build:deps @@ -214,9 +216,11 @@ jobs: - name: Setup hosts run: | echo "127.0.0.1 cloud-nine-wallet-test-backend" | sudo tee -a /etc/hosts + echo "127.0.0.1 cloud-nine-wallet-test-card-service" | sudo tee -a /etc/hosts echo "127.0.0.1 cloud-nine-wallet-test-auth" | sudo tee -a /etc/hosts echo "127.0.0.1 happy-life-bank-test-backend" | sudo tee -a /etc/hosts echo "127.0.0.1 happy-life-bank-test-auth" | sudo tee -a /etc/hosts + echo "127.0.0.1 happy-life-bank-test-point-of-sale" | sudo tee -a /etc/hosts - name: Build dependencies run: pnpm --filter performance build:deps @@ -338,8 +342,20 @@ jobs: node-build: runs-on: ubuntu-latest timeout-minutes: 5 - needs: [auth, backend, frontend, token-introspection, card-service, point-of-sale, mock-account-servicing-entity, graphql, codeql-analyze, integration-test] - steps: + needs: + [ + auth, + backend, + frontend, + token-introspection, + card-service, + point-of-sale, + mock-account-servicing-entity, + graphql, + codeql-analyze, + integration-test, + ] + steps: - uses: actions/checkout@v4 - uses: ./.github/workflows/rafiki/env-setup - run: pnpm build @@ -453,7 +469,7 @@ jobs: with: path: /tmp/${{ github.sha }}-${{ matrix.package }}-${{ matrix.platform.name }}-${{ needs.version-generator.outputs.version }}.tar key: ${{ github.sha }}-${{ matrix.package }}-${{ matrix.platform.name }}-${{ needs.version-generator.outputs.version }} - + docker-grype: name: Docker Grype Scan needs: [version-generator, docker-build] @@ -553,10 +569,10 @@ jobs: platform_name: ${{ matrix.platform.name }} version: ${{ needs.version-generator.outputs.version }} gh_token: ${{ secrets.GITHUB_TOKEN }} - + push-manifest: name: Push multi-arch manifest list - needs: [version-generator,push] + needs: [version-generator, push] runs-on: ubuntu-latest if: needs.version-generator.outputs.dockerPush == 'true' strategy: @@ -576,7 +592,7 @@ jobs: package: ${{ matrix.package }} gh_token: ${{ secrets.GITHUB_TOKEN }} version: ${{ needs.version-generator.outputs.version }} - + generate-release: runs-on: ubuntu-latest needs: [push-manifest, version-generator] @@ -597,7 +613,7 @@ jobs: allowUpdates: true draft: false makeLatest: true - prerelease: endsWith(needs.version-generator.outputs.version, '-alpha') + prerelease: endsWith(needs.version-generator.outputs.version, '-alpha') name: ${{ needs.version-generator.outputs.version }} body: ${{ steps.changelog.outputs.changes }} tag: ${{ needs.version-generator.outputs.version }} diff --git a/packages/card-service/package.json b/packages/card-service/package.json index 8debb11c6a..928fa018bb 100644 --- a/packages/card-service/package.json +++ b/packages/card-service/package.json @@ -2,13 +2,14 @@ "name": "card-service", "main": "index.js", "scripts": { - "build": "pnpm clean && tsc --build tsconfig.json", + "build": "pnpm clean && tsc --build tsconfig.json && pnpm copy-files", "clean": "rm -fr dist/", "test": "NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests --maxWorkers=50%", "test:ci": "NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests --maxWorkers=2", "test:cov": "pnpm test -- --coverage", "dev": "ts-node-dev --inspect=0.0.0.0:9229 --respawn --transpile-only src/index.ts", - "knex": "knex" + "knex": "knex", + "copy-files": "cp -r ./src/openapi ./dist/" }, "dependencies": { "@adonisjs/fold": "^8.2.0", diff --git a/packages/point-of-sale/package.json b/packages/point-of-sale/package.json index 1b892e87e3..0f6f407c35 100644 --- a/packages/point-of-sale/package.json +++ b/packages/point-of-sale/package.json @@ -20,6 +20,7 @@ "license": "ISC", "dependencies": { "@adonisjs/fold": "^8.2.0", + "@apollo/client": "^3.11.8", "@apollo/server": "^4.11.2", "@faker-js/faker": "^8.4.1", "@koa/cors": "^5.0.0", @@ -39,7 +40,6 @@ "uuid": "^9.0.1" }, "devDependencies": { - "@apollo/client": "^3.11.8", "@faker-js/faker": "^8.4.1", "@graphql-codegen/cli": "5.0.4", "@graphql-codegen/introspection": "4.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 228e0047c4..e5884dce91 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -813,6 +813,9 @@ importers: '@adonisjs/fold': specifier: ^8.2.0 version: 8.2.0 + '@apollo/client': + specifier: ^3.11.8 + version: 3.11.8(@types/react@18.2.73)(graphql@16.11.0)(react-dom@18.2.0)(react@18.2.0) '@apollo/server': specifier: ^4.11.2 version: 4.11.2(graphql@16.11.0) @@ -865,9 +868,6 @@ importers: specifier: ^9.0.1 version: 9.0.1 devDependencies: - '@apollo/client': - specifier: ^3.11.8 - version: 3.11.8(@types/react@18.2.73)(graphql@16.11.0)(react-dom@18.2.0)(react@18.2.0) '@graphql-codegen/cli': specifier: 5.0.4 version: 5.0.4(@babel/core@7.27.4)(@types/node@20.14.15)(graphql@16.11.0) @@ -1026,6 +1026,9 @@ importers: '@types/node': specifier: ^20.14.15 version: 20.14.15 + axios: + specifier: 1.8.2 + version: 1.8.2 graphql: specifier: ^16.11.0 version: 16.11.0 @@ -9387,7 +9390,7 @@ packages: /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 is-array-buffer: 3.0.2 dev: true @@ -9395,7 +9398,7 @@ packages: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 is-array-buffer: 3.0.4 dev: true @@ -9490,7 +9493,7 @@ packages: engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 get-intrinsic: 1.2.6 is-array-buffer: 3.0.2 @@ -9502,7 +9505,7 @@ packages: engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.22.5 es-errors: 1.3.0 @@ -9715,11 +9718,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - /available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -9748,7 +9746,6 @@ packages: proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: false /axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -10241,7 +10238,7 @@ packages: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.6 @@ -11921,19 +11918,19 @@ packages: dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.1 - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 es-set-tostringtag: 2.1.0 es-to-primitive: 1.2.1 function.prototype.name: 1.1.5 get-intrinsic: 1.2.6 get-symbol-description: 1.0.0 globalthis: 1.0.3 - gopd: 1.0.1 + gopd: 1.2.0 has: 1.0.3 has-property-descriptors: 1.0.2 has-proto: 1.0.3 - has-symbols: 1.0.3 + has-symbols: 1.1.0 internal-slot: 1.0.5 is-array-buffer: 3.0.2 is-callable: 1.2.7 @@ -11941,7 +11938,7 @@ packages: is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.10 + is-typed-array: 1.1.13 is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 @@ -11952,12 +11949,12 @@ packages: string.prototype.trim: 1.2.7 string.prototype.trimend: 1.0.6 string.prototype.trimstart: 1.0.6 - typed-array-buffer: 1.0.0 + typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.0 typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 + which-typed-array: 1.1.16 dev: true /es-abstract@1.22.5: @@ -11968,7 +11965,7 @@ packages: arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 call-bind: 1.0.7 - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 es-to-primitive: 1.2.1 @@ -11976,10 +11973,10 @@ packages: get-intrinsic: 1.2.6 get-symbol-description: 1.0.2 globalthis: 1.0.3 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.0.3 - has-symbols: 1.0.3 + has-symbols: 1.1.0 hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 @@ -12061,12 +12058,6 @@ packages: which-typed-array: 1.1.16 dev: true - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.6 - /es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -12084,7 +12075,7 @@ packages: define-properties: 1.2.1 es-abstract: 1.23.6 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 get-intrinsic: 1.2.6 globalthis: 1.0.4 @@ -12110,15 +12101,6 @@ packages: dependencies: es-errors: 1.3.0 - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.6 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - dev: true - /es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} @@ -13327,7 +13309,7 @@ packages: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.22.1 functions-have-names: 1.2.3 @@ -13337,7 +13319,7 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.22.5 functions-have-names: 1.2.3 @@ -13391,7 +13373,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 - has-symbols: 1.0.3 + has-symbols: 1.1.0 hasown: 2.0.2 /get-intrinsic@1.2.6: @@ -13439,7 +13421,7 @@ packages: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 get-intrinsic: 1.2.6 dev: true @@ -13447,7 +13429,7 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 get-intrinsic: 1.2.6 dev: true @@ -13615,11 +13597,6 @@ packages: minimatch: 3.0.8 dev: false - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.6 - /gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -13968,7 +13945,7 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: - has-symbols: 1.1.0 + has-symbols: 1.0.3 /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} @@ -14724,16 +14701,16 @@ packages: /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 get-intrinsic: 1.2.6 - is-typed-array: 1.1.10 + is-typed-array: 1.1.13 dev: true /is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 get-intrinsic: 1.2.6 dev: true @@ -14777,7 +14754,7 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-tostringtag: 1.0.2 dev: true @@ -15010,14 +14987,14 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 dev: true /is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 dev: true /is-stream@2.0.1: @@ -15064,22 +15041,11 @@ packages: isstream: 0.1.2 dev: false - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - dev: true - /is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.16 /is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} @@ -15113,7 +15079,7 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 dev: true /is-weakref@1.1.0: @@ -18088,7 +18054,7 @@ packages: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -18100,7 +18066,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - has-symbols: 1.0.3 + has-symbols: 1.1.0 object-keys: 1.1.1 dev: true @@ -19572,7 +19538,7 @@ packages: resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 functions-have-names: 1.2.3 dev: true @@ -19581,7 +19547,7 @@ packages: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.1 @@ -20156,7 +20122,7 @@ packages: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 get-intrinsic: 1.2.6 has-symbols: 1.1.0 isarray: 2.0.5 @@ -20166,9 +20132,9 @@ packages: resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 get-intrinsic: 1.2.6 - has-symbols: 1.0.3 + has-symbols: 1.1.0 isarray: 2.0.5 dev: true @@ -20196,7 +20162,7 @@ packages: /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 get-intrinsic: 1.2.6 is-regex: 1.1.4 dev: true @@ -20385,7 +20351,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.6 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 /set-function-length@1.2.2: @@ -21006,7 +20972,7 @@ packages: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.22.1 dev: true @@ -21015,7 +20981,7 @@ packages: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.22.5 dev: true @@ -21023,7 +20989,7 @@ packages: /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.22.1 dev: true @@ -21031,7 +20997,7 @@ packages: /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.22.5 dev: true @@ -21049,7 +21015,7 @@ packages: /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.22.1 dev: true @@ -21057,7 +21023,7 @@ packages: /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.22.5 dev: true @@ -21820,20 +21786,11 @@ packages: mime-types: 3.0.1 dev: false - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.6 - is-typed-array: 1.1.10 - dev: true - /typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-typed-array: 1.1.13 dev: true @@ -21851,19 +21808,19 @@ packages: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 has-proto: 1.0.3 - is-typed-array: 1.1.10 + is-typed-array: 1.1.13 dev: true /typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-proto: 1.0.3 is-typed-array: 1.1.13 dev: true @@ -21872,11 +21829,11 @@ packages: resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 has-proto: 1.0.3 - is-typed-array: 1.1.10 + is-typed-array: 1.1.13 dev: true /typed-array-byte-offset@1.0.2: @@ -21884,9 +21841,9 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-proto: 1.0.3 is-typed-array: 1.1.13 dev: true @@ -21907,18 +21864,18 @@ packages: /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - is-typed-array: 1.1.10 + is-typed-array: 1.1.13 dev: true /typed-array-length@1.0.5: resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 @@ -21975,9 +21932,9 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-bigints: 1.0.2 - has-symbols: 1.0.3 + has-symbols: 1.1.0 which-boxed-primitive: 1.0.2 dev: true @@ -23099,26 +23056,16 @@ packages: engines: {node: '>=4'} dev: false - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - dev: true - /which-typed-array@1.1.14: resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 + dev: true /which-typed-array@1.1.16: resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} diff --git a/test/integration/integration.test.ts b/test/integration/integration.test.ts index 2a6cd20df7..605a14e05b 100644 --- a/test/integration/integration.test.ts +++ b/test/integration/integration.test.ts @@ -4,6 +4,7 @@ import { WebhookEventType } from 'mock-account-service-lib' import { poll } from './lib/utils' import { TestActions, createTestActions } from './lib/test-actions' import { IncomingPaymentState } from 'test-lib/dist/generated/graphql' +import { Result } from 'test-lib/dist/pos-service' jest.setTimeout(20_000) @@ -707,4 +708,31 @@ describe('Integration tests', (): void => { }) }) }) + + describe('Card-POS Payments', () => { + let testActions: TestActions + + beforeAll(async () => { + testActions = createTestActions({ sendingASE: c9, receivingASE: hlb }) + }) + + test('Completes payment successfully', async () => { + const { createPayment } = testActions.pos + const result = await createPayment({ + signature: 'signature', + payload: 'payload', + amount: { + value: '500', + assetScale: 2, + assetCode: 'USD' + }, + senderWalletAddress: + 'https://cloud-nine-wallet-test-backend:3100/accounts/gfranklin', + receiverWalletAddress: + 'https://happy-life-bank-test-backend:4100/accounts/pfry', + timestamp: 1758105181325 + }) + expect(result).toStrictEqual({ result: { code: Result.APPROVED } }) + }) + }) }) diff --git a/test/integration/lib/test-actions/index.ts b/test/integration/lib/test-actions/index.ts index d940be51f1..e9e84ffb54 100644 --- a/test/integration/lib/test-actions/index.ts +++ b/test/integration/lib/test-actions/index.ts @@ -4,6 +4,7 @@ import { parseCookies, urlWithoutTenantId } from '../utils' import { WalletAddress, PendingGrant } from '@interledger/open-payments' import { AdminActions, createAdminActions } from './admin' import { OpenPaymentsActions, createOpenPaymentsActions } from './open-payments' +import { POSActions, createPOSActions } from './pos' export interface TestActionsDeps { sendingASE: MockASE @@ -21,6 +22,7 @@ export interface TestActions { ): Promise admin: AdminActions openPayments: OpenPaymentsActions + pos: POSActions } export function createTestActions(deps: TestActionsDeps): TestActions { @@ -37,7 +39,8 @@ export function createTestActions(deps: TestActionsDeps): TestActions { senderWalletAddress ), admin: createAdminActions(deps), - openPayments: createOpenPaymentsActions(deps) + openPayments: createOpenPaymentsActions(deps), + pos: createPOSActions(deps) } } diff --git a/test/integration/lib/test-actions/pos.ts b/test/integration/lib/test-actions/pos.ts new file mode 100644 index 0000000000..aaf03d1c1f --- /dev/null +++ b/test/integration/lib/test-actions/pos.ts @@ -0,0 +1,24 @@ +import type { MockASE } from 'test-lib' +import { PaymentDetails, PaymentResponse } from 'test-lib/dist/pos-service' + +interface POSActionsDeps { + sendingASE: MockASE + receivingASE: MockASE +} + +export interface POSActions { + createPayment(input: PaymentDetails): Promise +} + +export function createPOSActions(deps: POSActionsDeps): POSActions { + return { + createPayment: (input) => createPayment(deps, input) + } +} + +async function createPayment( + deps: POSActionsDeps, + input: PaymentDetails +): Promise { + return await deps.receivingASE.posService.createPayment(input) +} diff --git a/test/integration/scripts/run-tests.sh b/test/integration/scripts/run-tests.sh index eb995d3030..182425a7ed 100755 --- a/test/integration/scripts/run-tests.sh +++ b/test/integration/scripts/run-tests.sh @@ -44,8 +44,10 @@ addHost() { } addHost "cloud-nine-wallet-test-backend" addHost "cloud-nine-wallet-test-auth" +addHost "cloud-nine-wallet-test-card-service" addHost "happy-life-bank-test-backend" addHost "happy-life-bank-test-auth" +addHost "happy-life-bank-test-point-of-sale" # idempotent start pnpm --filter integration testenv:compose down --volumes diff --git a/test/test-lib/package.json b/test/test-lib/package.json index 35a1d30b53..84ed1349e1 100644 --- a/test/test-lib/package.json +++ b/test/test-lib/package.json @@ -20,6 +20,7 @@ "@types/koa": "2.15.0", "@types/koa-bodyparser": "^4.3.12", "@types/node": "^20.14.15", + "axios": "1.8.2", "graphql": "^16.11.0", "json-canonicalize": "^1.0.6", "koa": "^2.15.3", diff --git a/test/test-lib/src/config.ts b/test/test-lib/src/config.ts index 26f62f4203..1bca966c3a 100644 --- a/test/test-lib/src/config.ts +++ b/test/test-lib/src/config.ts @@ -14,6 +14,8 @@ export type TestConfig = Config & { signatureSecret: string signatureVersion: string operatorTenantId: string + cardServiceUrl?: string + posServiceUrl?: string } type EnvConfig = { @@ -31,6 +33,8 @@ type EnvConfig = { IS_TENANT: string AUTH_IDP_SERVICE_DOMAIN: string INTERACTION_RETURN_URL: string + CARD_SERVICE_URL?: string + POS_SERVICE_URL?: string } const REQUIRED_KEYS: (keyof EnvConfig)[] = [ @@ -88,7 +92,9 @@ const createConfig = (name: string): TestConfig => { operatorTenantId: env.OPERATOR_TENANT_ID, isTenant: env.IS_TENANT === 'true', authIdpServiceDomain: env.AUTH_IDP_SERVICE_DOMAIN, - interactionReturnUrl: env.INTERACTION_RETURN_URL + interactionReturnUrl: env.INTERACTION_RETURN_URL, + cardServiceUrl: env.CARD_SERVICE_URL, + posServiceUrl: env.POS_SERVICE_URL } } diff --git a/test/test-lib/src/mock-ase.ts b/test/test-lib/src/mock-ase.ts index d84604d54e..0277977380 100644 --- a/test/test-lib/src/mock-ase.ts +++ b/test/test-lib/src/mock-ase.ts @@ -8,6 +8,7 @@ import { generateApolloClientFactory } from './apollo-client' import { AdminClient } from './admin-client' import { IntegrationServer } from './integration-server' import { TestConfig } from './config' +import { PosService } from './pos-service' /** Mock Account Servicing Entity */ export class MockASE { @@ -18,6 +19,7 @@ export class MockASE { public accounts: AccountProvider public opClient!: AuthenticatedClient public integrationServer: IntegrationServer + public posService: PosService // Use .create factory because async construction public static async create(config: TestConfig): Promise { @@ -43,6 +45,7 @@ export class MockASE { this.adminClient, this.accounts ) + this.posService = new PosService(this.config.posServiceUrl) this.integrationServer.start(this.config.integrationServerPort) } diff --git a/test/test-lib/src/pos-service.ts b/test/test-lib/src/pos-service.ts new file mode 100644 index 0000000000..a6751c872e --- /dev/null +++ b/test/test-lib/src/pos-service.ts @@ -0,0 +1,54 @@ +import axios, { Axios, AxiosRequestConfig } from 'axios' + +export interface PaymentDetails { + signature: string + payload: string + amount: { + value: string + assetScale: number + assetCode: string + } + senderWalletAddress: string + receiverWalletAddress: string + timestamp: number +} + +export interface PaymentResponse { + result: { + code: Result + } +} + +export enum Result { + APPROVED = 'approved', + INVALID_SIGNATURE = 'invalid_signature' +} + +export class PosService { + private client: Axios | undefined + constructor(baseURL?: string) { + if (baseURL) { + this.client = axios.create({ + baseURL, + timeout: 30_000 + }) + } + } + + async createPayment(args: PaymentDetails): Promise { + if (!this.client) { + throw new Error('POS service not configured') + } + const config: AxiosRequestConfig = { + headers: { + Accept: 'application/json' + } + } + const result = await this.client.post( + '/payment', + args, + config + ) + return result.data + } +} diff --git a/test/testenv/cloud-nine-wallet/.env b/test/testenv/cloud-nine-wallet/.env index 23aa3996c0..cc339dc112 100644 --- a/test/testenv/cloud-nine-wallet/.env +++ b/test/testenv/cloud-nine-wallet/.env @@ -4,6 +4,7 @@ INTERACTION_SERVER=http://cloud-nine-wallet-test-auth:3109 INTEGRATION_SERVER_PORT=8888 WALLET_ADDRESS_URL=https://cloud-nine-wallet-test-backend:3100/.well-known/pay GRAPHQL_URL=http://cloud-nine-wallet-test-backend:3101/graphql +CARD_SERVICE_URL=http://cloud-nine-wallet-test-card-service:3104 IDP_SECRET=2pEcn2kkCclbOHQiGNEwhJ0rucATZhrA807HTm2rNXE= SIGNATURE_VERSION=1 SIGNATURE_SECRET=iyIgCprjb9uL8wFckR+pLEkJWMB7FJhgkvqhTQR/964= diff --git a/test/testenv/cloud-nine-wallet/docker-compose.yml b/test/testenv/cloud-nine-wallet/docker-compose.yml index 75a9d889a7..9df8d866c4 100644 --- a/test/testenv/cloud-nine-wallet/docker-compose.yml +++ b/test/testenv/cloud-nine-wallet/docker-compose.yml @@ -30,7 +30,7 @@ services: KEY_ID: keyid-97a3a431-8ee1-48fc-ac85-70e2f5eba8e5 PRIVATE_KEY_FILE: /workspace/private-key.pem AUTH_SERVER_INTROSPECTION_URL: http://cloud-nine-wallet-test-auth:3107 - CARD_SERVICE_URL: http://cloud-nine-wallet-card-service:3007 + CARD_SERVICE_URL: http://cloud-nine-wallet-test-card-service:3104 AUTH_SERVER_GRANT_URL: http://cloud-nine-wallet-test-auth:3106 AUTH_ADMIN_API_URL: 'http://cloud-nine-wallet-test-auth:3003/graphql' AUTH_ADMIN_API_SECRET: 'test-secret' @@ -45,6 +45,9 @@ services: OPERATOR_TENANT_ID: 438fa74a-fa7d-4317-9ced-dde32ece1787 API_SECRET: iyIgCprjb9uL8wFckR+pLEkJWMB7FJhgkvqhTQR/964= API_SIGNATURE_VERSION: 1 + CARD_WEBHOOK_SERVICE_URL: http://cloud-nine-wallet-test-card-service:3104/payment-event + SIGNATURE_SECRET: iyIgCprjb9uL8wFckR+pLEkJWMB7FJhgkvqhTQR/964= # webhook signature + SIGNATURE_VERSION: 1 volumes: - ../private-key.pem:/workspace/private-key.pem depends_on: @@ -82,4 +85,28 @@ services: OPERATOR_TENANT_ID: 438fa74a-fa7d-4317-9ced-dde32ece1787 depends_on: - shared-database - - shared-redis \ No newline at end of file + - shared-redis + cloud-nine-wallet-test-card-service: + hostname: cloud-nine-wallet-test-card-service + image: rafiki-card-service + build: + context: ../../.. + dockerfile: ./packages/card-service/Dockerfile.prod + restart: always + networks: + - rafiki-test + ports: + - '3104:3104' + environment: + NODE_ENV: ${NODE_ENV:-development} + INSTANCE_NAME: CLOUD-NINE + TRUST_PROXY: ${TRUST_PROXY} + LOG_LEVEL: debug + CARD_SERVICE_PORT: 3104 + DATABASE_URL: postgresql://cloud_nine_wallet_test_card_service:cloud_nine_wallet_test_card_service@shared-database/cloud_nine_wallet_test_card_service + GRAPHQL_URL: http://cloud-nine-wallet-test-backend:3101/graphql + TENANT_ID: 438fa74a-fa7d-4317-9ced-dde32ece1787 + TENANT_SECRET: iyIgCprjb9uL8wFckR+pLEkJWMB7FJhgkvqhTQR/964= + TENANT_SIGNATURE_VERSION: 1 + depends_on: + - shared-database diff --git a/test/testenv/dbinit.sql b/test/testenv/dbinit.sql index c01bef2187..fc5a011b3a 100644 --- a/test/testenv/dbinit.sql +++ b/test/testenv/dbinit.sql @@ -6,10 +6,18 @@ CREATE USER cloud_nine_wallet_test_auth WITH PASSWORD 'cloud_nine_wallet_test_au CREATE DATABASE cloud_nine_wallet_test_auth; ALTER DATABASE cloud_nine_wallet_test_auth OWNER TO cloud_nine_wallet_test_auth; +CREATE USER cloud_nine_wallet_test_card_service WITH PASSWORD 'cloud_nine_wallet_test_card_service'; +CREATE DATABASE cloud_nine_wallet_test_card_service; +ALTER DATABASE cloud_nine_wallet_test_card_service OWNER TO cloud_nine_wallet_test_card_service; + CREATE USER happy_life_bank_test_backend WITH PASSWORD 'happy_life_bank_test_backend'; CREATE DATABASE happy_life_bank_test_backend; ALTER DATABASE happy_life_bank_test_backend OWNER TO happy_life_bank_test_backend; CREATE USER happy_life_bank_test_auth WITH PASSWORD 'happy_life_bank_test_auth'; CREATE DATABASE happy_life_bank_test_auth; -ALTER DATABASE happy_life_bank_test_auth OWNER TO happy_life_bank_test_auth; \ No newline at end of file +ALTER DATABASE happy_life_bank_test_auth OWNER TO happy_life_bank_test_auth; + +CREATE USER happy_life_bank_test_point_of_sale WITH PASSWORD 'happy_life_bank_test_point_of_sale'; +CREATE DATABASE happy_life_bank_test_point_of_sale; +ALTER DATABASE happy_life_bank_test_point_of_sale OWNER TO happy_life_bank_test_point_of_sale; \ No newline at end of file diff --git a/test/testenv/happy-life-bank/.env b/test/testenv/happy-life-bank/.env index 4037251585..18c8e0e2cb 100644 --- a/test/testenv/happy-life-bank/.env +++ b/test/testenv/happy-life-bank/.env @@ -4,6 +4,7 @@ INTERACTION_SERVER=http://happy-life-bank-test-auth:4109 INTEGRATION_SERVER_PORT=8889 WALLET_ADDRESS_URL=https://happy-life-bank-test-backend:4100/accounts/pfry GRAPHQL_URL=http://happy-life-bank-test-backend:4101/graphql +POS_SERVICE_URL=http://happy-life-bank-test-point-of-sale:4105 IDP_SECRET=2pEcn2kkCclbOHQiGNEwhJ0rucATZhrA807HTm2rNXE= SIGNATURE_VERSION=1 SIGNATURE_SECRET=iyIgCprjb9uL8wFckR+pLEkJWMB7FJhgkvqhTQR/964= diff --git a/test/testenv/happy-life-bank/docker-compose.yml b/test/testenv/happy-life-bank/docker-compose.yml index 20e0f8211d..d79060f1ab 100644 --- a/test/testenv/happy-life-bank/docker-compose.yml +++ b/test/testenv/happy-life-bank/docker-compose.yml @@ -7,13 +7,13 @@ services: restart: always privileged: true ports: - - "4100:4100" - - "4101:4101" - - "4102:4102" + - '4100:4100' + - '4101:4101' + - '4102:4102' networks: - rafiki-test extra_hosts: - - 'host.docker.internal:host-gateway' + - 'host.docker.internal:host-gateway' environment: NODE_ENV: development LOG_LEVEL: debug @@ -43,6 +43,9 @@ services: OPERATOR_TENANT_ID: cf5fd7d3-1eb1-4041-8e43-ba45747e9e5d API_SECRET: iyIgCprjb9uL8wFckR+pLEkJWMB7FJhgkvqhTQR/964= API_SIGNATURE_VERSION: 1 + POS_WEBHOOK_SERVICE_URL: http://happy-life-bank-test-point-of-sale:4105/webhook + SIGNATURE_SECRET: iyIgCprjb9uL8wFckR+pLEkJWMB7FJhgkvqhTQR/964= # webhook signature + SIGNATURE_VERSION: 1 volumes: - ../private-key.pem:/workspace/private-key.pem depends_on: @@ -82,4 +85,30 @@ services: AUTH_CHOICE_PORT: 4109 OPERATOR_TENANT_ID: cf5fd7d3-1eb1-4041-8e43-ba45747e9e5d depends_on: - - cloud-nine-wallet-test-auth \ No newline at end of file + - cloud-nine-wallet-test-auth + happy-life-bank-test-point-of-sale: + hostname: happy-life-bank-test-point-of-sale + image: rafiki-point-of-sale + build: + context: ../../.. + dockerfile: ./packages/point-of-sale/Dockerfile.prod + restart: always + networks: + - rafiki-test + ports: + - '4105:4105' + environment: + NODE_ENV: ${NODE_ENV:-development} + INSTANCE_NAME: HAPPY-LIFE + TRUST_PROXY: ${TRUST_PROXY} + LOG_LEVEL: debug + PORT: 4105 + DATABASE_URL: postgresql://happy_life_bank_test_point_of_sale:happy_life_bank_test_point_of_sale@shared-database/happy_life_bank_test_point_of_sale + TENANT_ID: cf5fd7d3-1eb1-4041-8e43-ba45747e9e5d + TENANT_SECRET: iyIgCprjb9uL8wFckR+pLEkJWMB7FJhgkvqhTQR/964= + GRAPHQL_URL: http://happy-life-bank-test-backend:4101/graphql + WEBHOOK_SIGNATURE_SECRET: iyIgCprjb9uL8wFckR+pLEkJWMB7FJhgkvqhTQR/964= + WEBHOOK_SIGNATURE_VERSION: 1 + WEBHOOK_TIMEOUT_MS: 10_000 + depends_on: + - shared-database