From 45ae06d2bf218d8f8bf0d30b33b901373d061e1e Mon Sep 17 00:00:00 2001 From: The Joel Date: Wed, 1 Jul 2026 00:37:55 +0100 Subject: [PATCH 1/9] done --- contracts/stream_contract/src/test.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contracts/stream_contract/src/test.rs b/contracts/stream_contract/src/test.rs index de0e75fe..af404ebe 100644 --- a/contracts/stream_contract/src/test.rs +++ b/contracts/stream_contract/src/test.rs @@ -180,6 +180,20 @@ fn test_update_fee_config_rejects_invalid_fee_rate() { assert_eq!(result, Err(Ok(StreamError::InvalidFeeRate))); } +#[test] +fn test_update_fee_config_rejects_not_initialized() { + let env = Env::default(); + env.mock_all_auths(); + let client = create_contract(&env); + + let admin = Address::generate(&env); + let treasury = Address::generate(&env); + + // Call update_fee_config without calling initialize first + let result = client.try_update_fee_config(&admin, &treasury, &100); + assert_eq!(result, Err(Ok(StreamError::NotInitialized))); +} + #[test] fn test_initialize_emits_event() { let env = Env::default(); From 99d0480e23e6797c526689e0bcc58c99db124c1b Mon Sep 17 00:00:00 2001 From: The Joel Date: Wed, 1 Jul 2026 01:22:55 +0100 Subject: [PATCH 2/9] fix: remove vitest version mismatch in CI workflow --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f01e6e76..bc1c5e48 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,7 +107,6 @@ jobs: - name: Run Backend Tests run: | ls -la src/generated/prisma - npm install @vitest/coverage-v8@2.1.9 --no-save npx vitest run --coverage --reporter=basic working-directory: backend env: From 2212ccfe59eb682a71b1c8820095f6070df01586 Mon Sep 17 00:00:00 2001 From: The Joel Date: Wed, 1 Jul 2026 01:30:48 +0100 Subject: [PATCH 3/9] fix: import Prisma from @prisma/client instead of local prisma.js --- backend/src/workers/soroban-event-worker.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/workers/soroban-event-worker.ts b/backend/src/workers/soroban-event-worker.ts index e4e65f83..b101bc7e 100644 --- a/backend/src/workers/soroban-event-worker.ts +++ b/backend/src/workers/soroban-event-worker.ts @@ -1,5 +1,6 @@ import { rpc, xdr, StrKey } from '@stellar/stellar-sdk'; -import { prisma, Prisma } from '../lib/prisma.js'; +import { prisma } from '../lib/prisma.js'; +import { Prisma } from '@prisma/client'; import { INDEXER_STATE_ID } from '../lib/indexer-state.js'; import { sseService } from '../services/sse.service.js'; import logger from '../logger.js'; From d188d886e940418323693bff0ce73e72d9a46804 Mon Sep 17 00:00:00 2001 From: The Joel Date: Wed, 1 Jul 2026 01:36:15 +0100 Subject: [PATCH 4/9] fix: import Prisma from generated prisma client instead of @prisma/client --- backend/src/workers/soroban-event-worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/workers/soroban-event-worker.ts b/backend/src/workers/soroban-event-worker.ts index b101bc7e..4a73ba85 100644 --- a/backend/src/workers/soroban-event-worker.ts +++ b/backend/src/workers/soroban-event-worker.ts @@ -1,6 +1,6 @@ import { rpc, xdr, StrKey } from '@stellar/stellar-sdk'; import { prisma } from '../lib/prisma.js'; -import { Prisma } from '@prisma/client'; +import { Prisma } from '../generated/prisma/index.js'; import { INDEXER_STATE_ID } from '../lib/indexer-state.js'; import { sseService } from '../services/sse.service.js'; import logger from '../logger.js'; From d771f8abbb1aa1b3e10f2ee8d5eb2757a66796c2 Mon Sep 17 00:00:00 2001 From: The Joel Date: Wed, 1 Jul 2026 01:49:38 +0100 Subject: [PATCH 5/9] fix: add deprecated route handlers and fix Prisma schema path in CI --- .github/workflows/ci.yml | 2 +- backend/src/app.ts | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc1c5e48..3be2157b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -153,7 +153,7 @@ jobs: run: | docker compose up -d postgres sleep 10 - docker compose run --rm -e DATABASE_URL=postgresql://flowfi:flowfi_dev_password@postgres:5432/flowfi backend npx -y prisma db push --accept-data-loss + docker compose run --rm -e DATABASE_URL=postgresql://flowfi:flowfi_dev_password@postgres:5432/flowfi backend npx -y prisma db push --accept-data-loss --schema=prisma/schema.prisma docker compose up -d backend sleep 15 curl --fail http://localhost:3001/health || (docker compose logs backend && exit 1) diff --git a/backend/src/app.ts b/backend/src/app.ts index a2bfe853..e2a173dd 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -113,6 +113,31 @@ app.use((req: Request, res: Response, next: NextFunction) => { return next(); // Not versioned, continue to deprecated handlers }); +// Deprecated route handlers (return 410 Gone) +app.post('/streams', (req: Request, res: Response) => { + res.status(410).json({ + error: 'Deprecated endpoint', + message: 'This endpoint has been deprecated. Please use /v1/streams instead.', + deprecated: true, + migration: { + old: '/streams', + new: '/v1/streams' + } + }); +}); + +app.post('/events', (req: Request, res: Response) => { + res.status(410).json({ + error: 'Deprecated endpoint', + message: 'This endpoint has been deprecated. Please use /v1/events instead.', + deprecated: true, + migration: { + old: '/events', + new: '/v1/events' + } + }); +}); + // Health check routes app.use('/health', healthRoutes); From 5ac510174b6b2756fe7f12bd58dd462d5476da24 Mon Sep 17 00:00:00 2001 From: The Joel Date: Wed, 1 Jul 2026 01:56:07 +0100 Subject: [PATCH 6/9] fix: copy prisma directory to Docker runner stage --- backend/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/Dockerfile b/backend/Dockerfile index 671fb1d2..d5cfa1c8 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -22,6 +22,7 @@ RUN npm install --omit=dev COPY --from=builder /app/dist ./dist COPY --from=builder /app/src/generated ./src/generated +COPY --from=builder /app/prisma ./prisma EXPOSE 3001 From 678d29f5918b98dd1365dd6da63129f88f850c7f Mon Sep 17 00:00:00 2001 From: The Joel Date: Wed, 1 Jul 2026 01:56:44 +0100 Subject: [PATCH 7/9] fix: use absolute path for Prisma schema in CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3be2157b..1cea3e0e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -153,7 +153,7 @@ jobs: run: | docker compose up -d postgres sleep 10 - docker compose run --rm -e DATABASE_URL=postgresql://flowfi:flowfi_dev_password@postgres:5432/flowfi backend npx -y prisma db push --accept-data-loss --schema=prisma/schema.prisma + docker compose run --rm -e DATABASE_URL=postgresql://flowfi:flowfi_dev_password@postgres:5432/flowfi backend npx -y prisma db push --accept-data-loss --schema=/app/prisma/schema.prisma docker compose up -d backend sleep 15 curl --fail http://localhost:3001/health || (docker compose logs backend && exit 1) From ff4eb4812cec292a825b7690845679f005b8372d Mon Sep 17 00:00:00 2001 From: The Joel Date: Wed, 1 Jul 2026 03:41:59 +0100 Subject: [PATCH 8/9] fix: update deprecated test to expect 410 Gone status --- backend/tests/deprecated.test.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/backend/tests/deprecated.test.ts b/backend/tests/deprecated.test.ts index fa205da6..99d11648 100644 --- a/backend/tests/deprecated.test.ts +++ b/backend/tests/deprecated.test.ts @@ -5,22 +5,26 @@ import app from '../src/app.js'; // This file tests deprecated endpoints WITHOUT any Prisma mocking // so the real route handlers respond directly without interference. -describe('Removed unversioned routes', () => { - it('POST /streams returns 404 Not Found', async () => { +describe('Deprecated route responses', () => { + it('POST /streams returns 410 Gone', async () => { const response = await request(app) .post('/streams') .send({}) .set('Accept', 'application/json'); - expect(response.status).toBe(404); + expect(response.status).toBe(410); + expect(response.body.deprecated).toBe(true); + expect(response.body.migration).toMatchObject({ old: '/streams', new: '/v1/streams' }); }); - it('POST /events returns 404 Not Found', async () => { + it('POST /events returns 410 Gone', async () => { const response = await request(app) .post('/events') .send({}) .set('Accept', 'application/json'); - expect(response.status).toBe(404); + expect(response.status).toBe(410); + expect(response.body.deprecated).toBe(true); + expect(response.body.migration).toMatchObject({ old: '/events', new: '/v1/events' }); }); }); From b8aaa06014b8f25ec8da5111e850d044f792e13b Mon Sep 17 00:00:00 2001 From: The Joel Date: Wed, 1 Jul 2026 03:59:45 +0100 Subject: [PATCH 9/9] a11y: add ids and htmlFor to stream form labels for accessibility --- .../components/dashboard/dashboard-view.tsx | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/dashboard/dashboard-view.tsx b/frontend/src/components/dashboard/dashboard-view.tsx index 3bbc810c..972c757a 100644 --- a/frontend/src/components/dashboard/dashboard-view.tsx +++ b/frontend/src/components/dashboard/dashboard-view.tsx @@ -882,7 +882,8 @@ export function DashboardView({ session, onDisconnect }: DashboardViewProps) {

Save recurring stream settings once, apply instantly, then override before submitting.

- setTemplateNameInput(e.target.value)} placeholder="e.g. Monthly Contributor Payroll" aria-label="Template name" /> + + setTemplateNameInput(e.target.value)} placeholder="e.g. Monthly Contributor Payroll" />
{editingTemplateId ? : null} @@ -916,28 +917,28 @@ export function DashboardView({ session, onDisconnect }: DashboardViewProps) {

Stream Configuration

{requiredFieldsCompleted} / 5 required fields completed

-
- +
- - + +
- - + +
- +
-