From 9fad4f587601da873df2f460e03e7bdfd4ecfc26 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Wed, 26 Mar 2025 16:07:22 +0100 Subject: [PATCH] feat: Implement status filter for executions --- .../controllers/api/v1/executions/get-executions.js | 1 + packages/backend/src/models/user.js | 9 ++++++++- packages/backend/src/models/user.test.js | 10 ++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/controllers/api/v1/executions/get-executions.js b/packages/backend/src/controllers/api/v1/executions/get-executions.js index e2862ab9..62db44d8 100644 --- a/packages/backend/src/controllers/api/v1/executions/get-executions.js +++ b/packages/backend/src/controllers/api/v1/executions/get-executions.js @@ -14,5 +14,6 @@ export default async (request, response) => { const executionParams = (request) => { return { name: request.query.name, + status: request.query.status, }; }; diff --git a/packages/backend/src/models/user.js b/packages/backend/src/models/user.js index 8ace0c8d..7e92ac78 100644 --- a/packages/backend/src/models/user.js +++ b/packages/backend/src/models/user.js @@ -566,7 +566,7 @@ class User extends Base { .orderBy('updated_at', 'desc'); } - getExecutions({ name }) { + getExecutions({ name, status }) { return this.authorizedExecutions .clone() .withSoftDeleted() @@ -580,9 +580,16 @@ class User extends Base { }) .where((builder) => { builder.withSoftDeleted(); + if (name) { builder.where('flow.name', 'ilike', `%${name}%`); } + + if (status === 'success') { + builder.where('executions.status', 'success'); + } else if (status === 'failure') { + builder.where('executions.status', 'failure'); + } }) .orderBy('created_at', 'desc'); } diff --git a/packages/backend/src/models/user.test.js b/packages/backend/src/models/user.test.js index ddc08f7c..d0e750ff 100644 --- a/packages/backend/src/models/user.test.js +++ b/packages/backend/src/models/user.test.js @@ -1377,16 +1377,19 @@ describe('User model', () => { executionOne = await createExecution({ flowId: flow.id, testRun: false, + status: 'success', }); executionTwo = await createExecution({ flowId: flow.id, testRun: true, + status: 'failure', }); executionThree = await createExecution({ flowId: anotherUserFlow.id, testRun: false, + status: 'success', }); await createPermission({ @@ -1411,6 +1414,13 @@ describe('User model', () => { expect(executions[1].id).toBe(executionOne.id); }); + it('should return executions filtered by status', async () => { + const executions = await currentUser.getExecutions({ status: 'failure' }); + + expect(executions).toHaveLength(1); + expect(executions[0].id).toBe(executionTwo.id); + }); + it('should return all executions when no filter is applied', async () => { const executions = await currentUser.getExecutions({});