From d32820ee0905c4ec6614779d4ae2ffdd7c518687 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Wed, 30 Oct 2024 13:04:04 +0000 Subject: [PATCH 1/4] refactor(flow): distribute createActionStep logic to different methods in model --- .../controllers/api/v1/flows/create-step.js | 2 +- packages/backend/src/models/flow.js | 43 ++++++++---- packages/backend/src/models/flow.test.js | 67 ++++++++++++++++++- 3 files changed, 97 insertions(+), 15 deletions(-) diff --git a/packages/backend/src/controllers/api/v1/flows/create-step.js b/packages/backend/src/controllers/api/v1/flows/create-step.js index f0bb71f7..b68a8a98 100644 --- a/packages/backend/src/controllers/api/v1/flows/create-step.js +++ b/packages/backend/src/controllers/api/v1/flows/create-step.js @@ -6,7 +6,7 @@ export default async (request, response) => { .findById(request.params.flowId) .throwIfNotFound(); - const createdActionStep = await flow.createActionStep( + const createdActionStep = await flow.createActionStepAfterStepId( request.body.previousStepId ); diff --git a/packages/backend/src/models/flow.js b/packages/backend/src/models/flow.js index e67a9037..01dc98a9 100644 --- a/packages/backend/src/models/flow.js +++ b/packages/backend/src/models/flow.js @@ -151,27 +151,44 @@ class Flow extends Base { }); } - async createActionStep(previousStepId) { - const previousStep = await this.$relatedQuery('steps') - .findById(previousStepId) - .throwIfNotFound(); + async getStepById(stepId) { + return await this.$relatedQuery('steps').findById(stepId).throwIfNotFound(); + } - const createdStep = await this.$relatedQuery('steps').insertAndFetch({ + async insertActionStepAtPosition(position) { + return await this.$relatedQuery('steps').insertAndFetch({ type: 'action', - position: previousStep.position + 1, + position, }); + } - const nextSteps = await this.$relatedQuery('steps') - .where('position', '>=', createdStep.position) - .whereNot('id', createdStep.id); + async getStepsAfterPosition(position) { + return await this.$relatedQuery('steps').where('position', '>', position); + } - const nextStepQueries = nextSteps.map(async (nextStep, index) => { - return await nextStep.$query().patchAndFetch({ - position: createdStep.position + index + 1, + async alignStepsPositionsAsOfPosition(steps, startPosition) { + const nextStepQueries = steps.map(async (nextStep, index) => { + return await nextStep.$query().patch({ + position: startPosition + index, }); }); - await Promise.all(nextStepQueries); + return await Promise.all(nextStepQueries); + } + + async createActionStepAfterStepId(previousStepId) { + const previousStep = await this.getStepById(previousStepId); + + const nextSteps = await this.getStepsAfterPosition(previousStep.position); + + const createdStep = await this.insertActionStepAtPosition( + previousStep.position + 1 + ); + + await this.alignStepsPositionsAsOfPosition( + nextSteps, + createdStep.position + 1 + ); return createdStep; } diff --git a/packages/backend/src/models/flow.test.js b/packages/backend/src/models/flow.test.js index bbc88335..ed15e82a 100644 --- a/packages/backend/src/models/flow.test.js +++ b/packages/backend/src/models/flow.test.js @@ -198,7 +198,72 @@ describe('Flow model', () => { }); }); - it.todo('createActionStep'); + it('getStepById should return the step with the given ID from the flow', async () => { + const flow = await createFlow(); + + const step = await createStep({ flowId: flow.id }); + + expect(await flow.getStepById(step.id)).toStrictEqual(step); + }); + + it('insertActionStepAtPosition should insert action step at given position', async () => { + const flow = await createFlow(); + + await flow.createInitialSteps(); + + const createdStep = await flow.insertActionStepAtPosition(2); + + expect(createdStep).toMatchObject({ + type: 'action', + position: 2, + }); + }); + + it('getStepsAfterPosition should return steps after the given position', async () => { + const flow = await createFlow(); + + await flow.createInitialSteps(); + + await createStep({ flowId: flow.id }); + + expect(await flow.getStepsAfterPosition(1)).toMatchObject([ + { position: 2 }, + { position: 3 }, + ]); + }); + + it('alignStepsPositionsAsOfPosition', async () => { + const flow = await createFlow(); + + await createStep({ type: 'trigger', flowId: flow.id, position: 6 }); + await createStep({ type: 'action', flowId: flow.id, position: 8 }); + await createStep({ type: 'action', flowId: flow.id, position: 10 }); + + await flow.alignStepsPositionsAsOfPosition( + await flow.$relatedQuery('steps'), + 1 + ); + + expect(await flow.$relatedQuery('steps')).toMatchObject([ + { position: 1, type: 'trigger' }, + { position: 2, type: 'action' }, + { position: 3, type: 'action' }, + ]); + }); + + it('createActionStepAfterStep should create an action step after given step ID', async () => { + const flow = await createFlow(); + + const triggerStep = await createStep({ type: 'trigger', flowId: flow.id }); + const actionStep = await createStep({ type: 'action', flowId: flow.id }); + + const createdStep = await flow.createActionStepAfterStepId(triggerStep.id); + + const refetchedActionStep = await actionStep.$query(); + + expect(createdStep).toMatchObject({ type: 'action', position: 2 }); + expect(refetchedActionStep.position).toBe(3); + }); it.todo('delete'); From 48fcf4dda7b30d97ff588e9732a6310da18b2ca1 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 1 Nov 2024 14:06:26 +0100 Subject: [PATCH 2/4] refactor: Rename alignStepsPositionsAsOfPosition as updateStepPositionsFrom for flow --- packages/backend/src/models/flow.js | 13 +++++-------- packages/backend/src/models/flow.test.js | 7 ++----- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/backend/src/models/flow.js b/packages/backend/src/models/flow.js index 01dc98a9..c395d515 100644 --- a/packages/backend/src/models/flow.js +++ b/packages/backend/src/models/flow.js @@ -166,14 +166,14 @@ class Flow extends Base { return await this.$relatedQuery('steps').where('position', '>', position); } - async alignStepsPositionsAsOfPosition(steps, startPosition) { - const nextStepQueries = steps.map(async (nextStep, index) => { - return await nextStep.$query().patch({ + async updateStepPositionsFrom(startPosition, steps) { + const stepPositionUpdates = steps.map(async (step, index) => { + return await step.$query().patch({ position: startPosition + index, }); }); - return await Promise.all(nextStepQueries); + return await Promise.all(stepPositionUpdates); } async createActionStepAfterStepId(previousStepId) { @@ -185,10 +185,7 @@ class Flow extends Base { previousStep.position + 1 ); - await this.alignStepsPositionsAsOfPosition( - nextSteps, - createdStep.position + 1 - ); + await this.updateStepPositionsFrom(createdStep.position + 1, nextSteps); return createdStep; } diff --git a/packages/backend/src/models/flow.test.js b/packages/backend/src/models/flow.test.js index ed15e82a..7924536a 100644 --- a/packages/backend/src/models/flow.test.js +++ b/packages/backend/src/models/flow.test.js @@ -232,17 +232,14 @@ describe('Flow model', () => { ]); }); - it('alignStepsPositionsAsOfPosition', async () => { + it('updateStepPositionsFrom', async () => { const flow = await createFlow(); await createStep({ type: 'trigger', flowId: flow.id, position: 6 }); await createStep({ type: 'action', flowId: flow.id, position: 8 }); await createStep({ type: 'action', flowId: flow.id, position: 10 }); - await flow.alignStepsPositionsAsOfPosition( - await flow.$relatedQuery('steps'), - 1 - ); + await flow.updateStepPositionsFrom(1, await flow.$relatedQuery('steps')); expect(await flow.$relatedQuery('steps')).toMatchObject([ { position: 1, type: 'trigger' }, From 2c4b13e4b545eda4349eb5ab9898cd9279238381 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 1 Nov 2024 14:17:46 +0100 Subject: [PATCH 3/4] refactor: Start updateStepPositionsFrom test from step position 2 --- packages/backend/src/models/flow.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/models/flow.test.js b/packages/backend/src/models/flow.test.js index 7924536a..237e3eaa 100644 --- a/packages/backend/src/models/flow.test.js +++ b/packages/backend/src/models/flow.test.js @@ -239,12 +239,12 @@ describe('Flow model', () => { await createStep({ type: 'action', flowId: flow.id, position: 8 }); await createStep({ type: 'action', flowId: flow.id, position: 10 }); - await flow.updateStepPositionsFrom(1, await flow.$relatedQuery('steps')); + await flow.updateStepPositionsFrom(2, await flow.$relatedQuery('steps')); expect(await flow.$relatedQuery('steps')).toMatchObject([ - { position: 1, type: 'trigger' }, - { position: 2, type: 'action' }, + { position: 2, type: 'trigger' }, { position: 3, type: 'action' }, + { position: 4, type: 'action' }, ]); }); From c641e8729b56c0e43ea9634986676a2e061070f5 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 1 Nov 2024 14:24:07 +0100 Subject: [PATCH 4/4] refactor: Rename createActionStepAfterStepId as createAfterStep for flow --- packages/backend/src/controllers/api/v1/flows/create-step.js | 2 +- packages/backend/src/models/flow.js | 2 +- packages/backend/src/models/flow.test.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/controllers/api/v1/flows/create-step.js b/packages/backend/src/controllers/api/v1/flows/create-step.js index b68a8a98..b1c49e37 100644 --- a/packages/backend/src/controllers/api/v1/flows/create-step.js +++ b/packages/backend/src/controllers/api/v1/flows/create-step.js @@ -6,7 +6,7 @@ export default async (request, response) => { .findById(request.params.flowId) .throwIfNotFound(); - const createdActionStep = await flow.createActionStepAfterStepId( + const createdActionStep = await flow.createStepAfter( request.body.previousStepId ); diff --git a/packages/backend/src/models/flow.js b/packages/backend/src/models/flow.js index c395d515..3600aaf4 100644 --- a/packages/backend/src/models/flow.js +++ b/packages/backend/src/models/flow.js @@ -176,7 +176,7 @@ class Flow extends Base { return await Promise.all(stepPositionUpdates); } - async createActionStepAfterStepId(previousStepId) { + async createStepAfter(previousStepId) { const previousStep = await this.getStepById(previousStepId); const nextSteps = await this.getStepsAfterPosition(previousStep.position); diff --git a/packages/backend/src/models/flow.test.js b/packages/backend/src/models/flow.test.js index 237e3eaa..68eb3e56 100644 --- a/packages/backend/src/models/flow.test.js +++ b/packages/backend/src/models/flow.test.js @@ -248,13 +248,13 @@ describe('Flow model', () => { ]); }); - it('createActionStepAfterStep should create an action step after given step ID', async () => { + it('createStepAfter should create an action step after given step ID', async () => { const flow = await createFlow(); const triggerStep = await createStep({ type: 'trigger', flowId: flow.id }); const actionStep = await createStep({ type: 'action', flowId: flow.id }); - const createdStep = await flow.createActionStepAfterStepId(triggerStep.id); + const createdStep = await flow.createStepAfter(triggerStep.id); const refetchedActionStep = await actionStep.$query();