From 6068b6c7460735c345ccf6028711f2a735052d13 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Thu, 27 Mar 2025 23:22:22 +0100 Subject: [PATCH 1/3] feat: Implement time based filters for executions API endpoint --- .../api/v1/executions/get-executions.js | 2 ++ packages/backend/src/models/user.js | 16 +++++++++++++++- 2 files changed, 17 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 62db44d8..eb89ed40 100644 --- a/packages/backend/src/controllers/api/v1/executions/get-executions.js +++ b/packages/backend/src/controllers/api/v1/executions/get-executions.js @@ -15,5 +15,7 @@ const executionParams = (request) => { return { name: request.query.name, status: request.query.status, + startDateTime: request.query.startDateTime, + endDateTime: request.query.endDateTime, }; }; diff --git a/packages/backend/src/models/user.js b/packages/backend/src/models/user.js index 7e92ac78..4499381d 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, status }) { + getExecutions({ name, status, startDateTime, endDateTime }) { return this.authorizedExecutions .clone() .withSoftDeleted() @@ -590,6 +590,20 @@ class User extends Base { } else if (status === 'failure') { builder.where('executions.status', 'failure'); } + + if (startDateTime && endDateTime) { + const startDate = DateTime.fromMillis(Number(startDateTime)); + + if (startDate.isValid) { + builder.where('executions.created_at', '>=', startDate.toISO()); + } + + const endDate = DateTime.fromMillis(Number(endDateTime)); + + if (endDate.isValid) { + builder.where('executions.created_at', '<=', endDate.toISO()); + } + } }) .orderBy('created_at', 'desc'); } From f7e81ec687e77c40e1e95d24c6276c1cda5c9b78 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Thu, 27 Mar 2025 23:27:18 +0100 Subject: [PATCH 2/3] test: Implement get executions method time filters tests --- packages/backend/src/models/user.test.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/backend/src/models/user.test.js b/packages/backend/src/models/user.test.js index d0e750ff..2b5ef387 100644 --- a/packages/backend/src/models/user.test.js +++ b/packages/backend/src/models/user.test.js @@ -1380,12 +1380,18 @@ describe('User model', () => { status: 'success', }); + // sleep for 10 milliseconds to make sure the created_at values are different + await new Promise((resolve) => setTimeout(resolve, 10)); + executionTwo = await createExecution({ flowId: flow.id, testRun: true, status: 'failure', }); + // sleep for 10 milliseconds to make sure the created_at values are different + await new Promise((resolve) => setTimeout(resolve, 10)); + executionThree = await createExecution({ flowId: anotherUserFlow.id, testRun: false, @@ -1421,6 +1427,17 @@ describe('User model', () => { expect(executions[0].id).toBe(executionTwo.id); }); + it('should return executions filtered by startDateTime and endDateTime', async () => { + const executions = await currentUser.getExecutions({ + startDateTime: executionOne.createdAt, + endDateTime: executionTwo.createdAt, + }); + + expect(executions).toHaveLength(2); + expect(executions[0].id).toBe(executionTwo.id); + expect(executions[1].id).toBe(executionOne.id); + }); + it('should return all executions when no filter is applied', async () => { const executions = await currentUser.getExecutions({}); From 9b5f33058c1d90eb5faaf830a37ba5fdb62ff88a Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 28 Mar 2025 16:16:01 +0100 Subject: [PATCH 3/3] fix: Do not require start and end date time for execution filters --- packages/backend/src/models/user.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/models/user.js b/packages/backend/src/models/user.js index 4499381d..35d2c25e 100644 --- a/packages/backend/src/models/user.js +++ b/packages/backend/src/models/user.js @@ -591,13 +591,15 @@ class User extends Base { builder.where('executions.status', 'failure'); } - if (startDateTime && endDateTime) { + if (startDateTime) { const startDate = DateTime.fromMillis(Number(startDateTime)); if (startDate.isValid) { builder.where('executions.created_at', '>=', startDate.toISO()); } + } + if (endDateTime) { const endDate = DateTime.fromMillis(Number(endDateTime)); if (endDate.isValid) {