From cf0d5a86f2794c486ee0c71717bccf6b77fea0c3 Mon Sep 17 00:00:00 2001 From: oak Date: Sun, 26 Jul 2026 23:16:52 +0100 Subject: [PATCH 1/6] fix(lint): add missing test import in sorobanService.test.js and fix eqeqeq in userDashboardService.js --- backend/src/services/sorobanService.test.js | 2 +- backend/src/services/userDashboardService.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/services/sorobanService.test.js b/backend/src/services/sorobanService.test.js index 1abd47c7..836bcb0f 100644 --- a/backend/src/services/sorobanService.test.js +++ b/backend/src/services/sorobanService.test.js @@ -10,7 +10,7 @@ * NODE_ENV=test node --test src/services/sorobanService.test.js */ -const { describe, it, beforeEach, afterEach } = require('node:test'); +const { describe, it, test, beforeEach, afterEach } = require('node:test'); const assert = require('node:assert/strict'); // --------------------------------------------------------------------------- diff --git a/backend/src/services/userDashboardService.js b/backend/src/services/userDashboardService.js index 0f9f1eb0..66c34422 100644 --- a/backend/src/services/userDashboardService.js +++ b/backend/src/services/userDashboardService.js @@ -224,7 +224,7 @@ async function getContributorDashboard(userId) { } function csvEscape(value) { - const str = value == null ? '' : String(value); + const str = (value === null || value === undefined) ? '' : String(value); if (/[",\n]/.test(str)) { return `"${str.replace(/"/g, '""')}"`; } From 5e84d7b0bde3b5c82468eb309bfdb15d2cb79493 Mon Sep 17 00:00:00 2001 From: oak Date: Mon, 27 Jul 2026 07:55:04 +0100 Subject: [PATCH 2/6] =?UTF-8?q?fix(lint):=20fix=20remaining=20CI=20errors?= =?UTF-8?q?=20=E2=80=94=20close=20orphaned=20describe=20block=20and=20add?= =?UTF-8?q?=20global=20to=20ESLint=20test=20globals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/services/sorobanService.test.js | 20 +------------------- frontend/eslint.config.cjs | 1 + 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/backend/src/services/sorobanService.test.js b/backend/src/services/sorobanService.test.js index 836bcb0f..e8ab98ee 100644 --- a/backend/src/services/sorobanService.test.js +++ b/backend/src/services/sorobanService.test.js @@ -235,25 +235,7 @@ describe('Soroban contract integration scenario — campaign milestone release', // No calls should have completed assert.equal(__mock.getCalls().length, 0); }); -const test = require('node:test'); -const assert = require('node:assert/strict'); -const proxyquire = require('proxyquire').noCallThru(); - -function buildService() { - return proxyquire('./sorobanService', { - '../config/stellar': { - server: { - loadAccount: async () => ({ sequence: '1' }), - simulateTransaction: async () => ({ result: null }), - prepareTransaction: (tx) => tx, - submitTransaction: async () => ({ status: 'SUCCESS' }), - }, - networkPassphrase: 'Test SDF Network ; September 2015', - }, - '../config/logger': { info: () => {}, error: () => {}, warn: () => {} }, - '../config/constants': { TX_TIMEOUT_CONTRIBUTION_S: 30 }, - }); -} +}); test('mapMilestoneOnChainStatus maps numeric contract statuses', () => { const { mapMilestoneOnChainStatus } = buildService(); diff --git a/frontend/eslint.config.cjs b/frontend/eslint.config.cjs index e110654a..ac2fdc9b 100644 --- a/frontend/eslint.config.cjs +++ b/frontend/eslint.config.cjs @@ -91,6 +91,7 @@ module.exports = [ afterEach: 'readonly', vi: 'readonly', jest: 'readonly', + global: 'writable', }, }, }, From 41844a0b664cb2bcbaba1905041f27c1755217dd Mon Sep 17 00:00:00 2001 From: oak Date: Mon, 27 Jul 2026 07:59:54 +0100 Subject: [PATCH 3/6] fix(lint): restore buildService and proxyquire in sorobanService.test.js --- backend/src/services/sorobanService.test.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/backend/src/services/sorobanService.test.js b/backend/src/services/sorobanService.test.js index e8ab98ee..f88fb2e8 100644 --- a/backend/src/services/sorobanService.test.js +++ b/backend/src/services/sorobanService.test.js @@ -237,6 +237,24 @@ describe('Soroban contract integration scenario — campaign milestone release', }); }); +const proxyquire = require('proxyquire').noCallThru(); + +function buildService() { + return proxyquire('./sorobanService', { + '../config/stellar': { + server: { + loadAccount: async () => ({ sequence: '1' }), + simulateTransaction: async () => ({ result: null }), + prepareTransaction: (tx) => tx, + submitTransaction: async () => ({ status: 'SUCCESS' }), + }, + networkPassphrase: 'Test SDF Network ; September 2015', + }, + '../config/logger': { info: () => {}, error: () => {}, warn: () => {} }, + '../config/constants': { TX_TIMEOUT_CONTRIBUTION_S: 30 }, + }); +} + test('mapMilestoneOnChainStatus maps numeric contract statuses', () => { const { mapMilestoneOnChainStatus } = buildService(); assert.equal(mapMilestoneOnChainStatus(0), 'pending'); From d49cd55c9ce4484412f7876e292911bfd63a79d6 Mon Sep 17 00:00:00 2001 From: oak Date: Mon, 27 Jul 2026 08:02:12 +0100 Subject: [PATCH 4/6] =?UTF-8?q?fix(ci):=20move=20env:=20block=20to=20step?= =?UTF-8?q?=20level=20in=20deploy.yml=20=E2=80=94=20was=20incorrectly=20ne?= =?UTF-8?q?sted=20inside=20with:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b4fc9b85..308aa5a3 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -23,17 +23,8 @@ jobs: username: ${{ secrets.DEPLOY_USER }} key: ${{ secrets.DEPLOY_SSH_KEY }} envs: DATABASE_URL,JWT_SECRET,API_KEY_PEPPER,PLATFORM_SECRET_KEY,USDC_ISSUER,STELLAR_NETWORK,STELLAR_HORIZON_URL,FRONTEND_URL,DEPLOY_PATH - env: - DATABASE_URL: ${{ secrets.DATABASE_URL }} - JWT_SECRET: ${{ secrets.JWT_SECRET }} - API_KEY_PEPPER: ${{ secrets.API_KEY_PEPPER }} - PLATFORM_SECRET_KEY: ${{ secrets.PLATFORM_SECRET_KEY }} - USDC_ISSUER: ${{ secrets.USDC_ISSUER }} - STELLAR_NETWORK: ${{ secrets.STELLAR_NETWORK }} - STELLAR_HORIZON_URL: ${{ secrets.STELLAR_HORIZON_URL }} - FRONTEND_URL: ${{ secrets.FRONTEND_URL }} - DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} script: | + set -euo pipefail cd "$DEPLOY_PATH" git fetch origin main @@ -52,6 +43,16 @@ jobs: docker compose -f docker-compose.prod.yml up -d --build docker compose -f docker-compose.prod.yml exec -T backend node db/migrate.js + env: + DATABASE_URL: ${{ secrets.DATABASE_URL }} + JWT_SECRET: ${{ secrets.JWT_SECRET }} + API_KEY_PEPPER: ${{ secrets.API_KEY_PEPPER }} + PLATFORM_SECRET_KEY: ${{ secrets.PLATFORM_SECRET_KEY }} + USDC_ISSUER: ${{ secrets.USDC_ISSUER }} + STELLAR_NETWORK: ${{ secrets.STELLAR_NETWORK }} + STELLAR_HORIZON_URL: ${{ secrets.STELLAR_HORIZON_URL }} + FRONTEND_URL: ${{ secrets.FRONTEND_URL }} + DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} - name: Wait for backend to become healthy run: | From b8ad2c78e91482c7c20b5735395d789acb653eb2 Mon Sep 17 00:00:00 2001 From: oak Date: Mon, 27 Jul 2026 08:06:29 +0100 Subject: [PATCH 5/6] fix(migration): change user_id from INTEGER to UUID in 2fa_infrastructure to match users.id type --- backend/db/migrations/20260725_2fa_infrastructure.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/db/migrations/20260725_2fa_infrastructure.sql b/backend/db/migrations/20260725_2fa_infrastructure.sql index b8998ca3..1fc6f609 100644 --- a/backend/db/migrations/20260725_2fa_infrastructure.sql +++ b/backend/db/migrations/20260725_2fa_infrastructure.sql @@ -1,6 +1,6 @@ CREATE TABLE trusted_devices ( id SERIAL PRIMARY KEY, - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, device_fingerprint TEXT NOT NULL, device_name TEXT, ip_address INET, @@ -11,7 +11,7 @@ CREATE TABLE trusted_devices ( CREATE TABLE security_audit_log ( id SERIAL PRIMARY KEY, - user_id INTEGER REFERENCES users(id) ON DELETE SET NULL, + user_id UUID REFERENCES users(id) ON DELETE SET NULL, event_type TEXT NOT NULL, ip_address INET, user_agent TEXT, From e4b5f07362972821bff1ec1a8138f8fcb008aa6f Mon Sep 17 00:00:00 2001 From: oak Date: Tue, 28 Jul 2026 15:15:39 +0100 Subject: [PATCH 6/6] Merge branch 'upstream/main' into fix/ci-lint-errors: resolve merge conflicts --- backend/src/services/userDashboard.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/services/userDashboard.test.js b/backend/src/services/userDashboard.test.js index 8bc0bbeb..675cdb74 100644 --- a/backend/src/services/userDashboard.test.js +++ b/backend/src/services/userDashboard.test.js @@ -15,10 +15,10 @@ test('listCreatorCampaigns queries by creator_id', async () => { }, }); - const rows = await listCreatorCampaigns('user-1'); + const res = await listCreatorCampaigns('user-1'); assert.match(sql, /creator_id = \$1/); - assert.deepEqual(params, ['user-1']); - assert.equal(rows[0].title, 'Mine'); + assert.deepEqual(params, ['user-1', 20, 0]); + assert.equal(res.data[0].title, 'Mine'); }); test('listUserContributions includes conversion_rate', async () => {