From 935865031f68f46c5cdb51aad952d7f689180052 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Tue, 11 Jul 2023 13:43:17 +0100 Subject: [PATCH 01/30] log task and workspace IDs --- functions/taskrouterListeners/transfersListener.private.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 1db8ccce..d5931d1f 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -189,6 +189,8 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); + console.log('isChatTransferToWorkerAccepted', originalTaskSid, context.TWILIO_WORKSPACE_SID); + await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) @@ -212,6 +214,8 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); + console.log('isChatTransferToQueueComplete', originalTaskSid, context.TWILIO_WORKSPACE_SID); + await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) From 04b92bf1906490572e39a7c3051d6a969ae533a1 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 10:50:40 +0100 Subject: [PATCH 02/30] fx: update isChatTransferToQueueComplete to pending --- functions/taskrouterListeners/transfersListener.private.ts | 4 +++- functions/webhooks/line/FlexToLine.protected.ts | 1 + functions/webhooks/line/LineToFlex.ts | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index d5931d1f..37893b4d 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -220,7 +220,7 @@ export const handleEvent = async (context: Context, event: EventFields) .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) .update({ - assignmentStatus: 'completed', + assignmentStatus: 'pending', reason: 'task transferred into queue', }); @@ -241,6 +241,8 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); + console.log('isChatTransferToWorkerRejected', originalTaskSid, context.TWILIO_WORKSPACE_SID); + const originalTask = await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) diff --git a/functions/webhooks/line/FlexToLine.protected.ts b/functions/webhooks/line/FlexToLine.protected.ts index b5a3922f..481f9ce7 100644 --- a/functions/webhooks/line/FlexToLine.protected.ts +++ b/functions/webhooks/line/FlexToLine.protected.ts @@ -122,6 +122,7 @@ export const handler = async ( switch (result.status) { case 'sent': resolve(success(result.response)); + console.log('result.response 1', result.response); return; case 'ignored': resolve(success('Ignored event.')); diff --git a/functions/webhooks/line/LineToFlex.ts b/functions/webhooks/line/LineToFlex.ts index 5f8ee328..1d97cea0 100644 --- a/functions/webhooks/line/LineToFlex.ts +++ b/functions/webhooks/line/LineToFlex.ts @@ -157,6 +157,7 @@ export const handler = async ( switch (result.status) { case 'sent': responses.push(result.response); + console.log('result.response 2', result.response, responses); break; case 'ignored': responses.push('Ignored event.'); From de6efbe42e23401cde8c235c10174efd56b7cbf8 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 11:03:26 +0100 Subject: [PATCH 03/30] ch: add testClient --- .../taskrouterListeners/transfersListener.private.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 37893b4d..c29b89de 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -179,6 +179,14 @@ export const handleEvent = async (context: Context, event: EventFields) const taskAttributes = JSON.parse(taskAttributesString); + const clients = context.getTwilioClient(); + + const testClient = clients.taskrouter + .workspaces(context.TWILIO_WORKSPACE_SID) + .tasks(taskAttributes.transferMeta.originalTask.originalTaskSid); + + console.log('testClient', testClient); + /** * If a chat transfer gets accepted, it should: * 1) Complete the original task From 054895e70ab352e27719cc12aebef9ddb10dc514 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 11:39:43 +0100 Subject: [PATCH 04/30] ch: add transferStatus to isChatTransferToWorkerRejected --- .../transfersListener.private.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index c29b89de..b8e7266f 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -183,7 +183,8 @@ export const handleEvent = async (context: Context, event: EventFields) const testClient = clients.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(taskAttributes.transferMeta.originalTask.originalTaskSid); + .tasks(taskAttributes.transferMeta.originalTask.originalTaskSid) + .update(); console.log('testClient', testClient); @@ -228,7 +229,7 @@ export const handleEvent = async (context: Context, event: EventFields) .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) .update({ - assignmentStatus: 'pending', + assignmentStatus: 'completed', reason: 'task transferred into queue', }); @@ -266,6 +267,7 @@ export const handleEvent = async (context: Context, event: EventFields) transferMeta: { ...originalAttributes.transferMeta, sidWithTaskControl: originalAttributes.transferMeta.originalReservation, + transferStatus: 'rejected', }, }; @@ -276,10 +278,10 @@ export const handleEvent = async (context: Context, event: EventFields) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'canceled', - reason: 'task transferred rejected', - }), + // client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + // // assignmentStatus: 'canceled', + // reason: 'task transferred rejected', + // }), ]); console.log('Finished handling chat transfer rejected.'); From 8d420dc13ee0502e02d8ea11c601649ed6a7df7c Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 11:50:17 +0100 Subject: [PATCH 05/30] ch: update log --- .../transfersListener.private.ts | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index b8e7266f..e3fd0ba3 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -179,14 +179,14 @@ export const handleEvent = async (context: Context, event: EventFields) const taskAttributes = JSON.parse(taskAttributesString); - const clients = context.getTwilioClient(); + // const clients = context.getTwilioClient(); - const testClient = clients.taskrouter - .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(taskAttributes.transferMeta.originalTask.originalTaskSid) - .update(); + // const testClient = clients.taskrouter + // .workspaces(context.TWILIO_WORKSPACE_SID) + // .tasks(taskAttributes.transferMeta.originalTask.originalTaskSid) + // .update(); - console.log('testClient', testClient); + // console.log('testClient', testClient); /** * If a chat transfer gets accepted, it should: @@ -198,7 +198,7 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); - console.log('isChatTransferToWorkerAccepted', originalTaskSid, context.TWILIO_WORKSPACE_SID); + console.log('isChatTransferToWorkerAccepted', originalTaskSid, eventType); await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) @@ -223,13 +223,13 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); - console.log('isChatTransferToQueueComplete', originalTaskSid, context.TWILIO_WORKSPACE_SID); + console.log('isChatTransferToQueueComplete', originalTaskSid, eventType); await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) .update({ - assignmentStatus: 'completed', + assignmentStatus: 'reserved', reason: 'task transferred into queue', }); @@ -250,7 +250,7 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); - console.log('isChatTransferToWorkerRejected', originalTaskSid, context.TWILIO_WORKSPACE_SID); + console.log('isChatTransferToWorkerRejected', originalTaskSid, eventType); const originalTask = await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) @@ -278,10 +278,10 @@ export const handleEvent = async (context: Context, event: EventFields) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), - // client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - // // assignmentStatus: 'canceled', - // reason: 'task transferred rejected', - // }), + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + assignmentStatus: 'canceled', + reason: 'task transferred rejected', + }), ]); console.log('Finished handling chat transfer rejected.'); From 3f090817b9fec460b58111c0697ca68accbe3330 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 12:16:06 +0100 Subject: [PATCH 06/30] ft: modify TaskrouterCallback --- .../transfersListener.private.ts | 4 +-- .../webhooks/taskrouterCallback.protected.ts | 25 +++++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index e3fd0ba3..e79024ac 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -84,7 +84,7 @@ const isChatTransferToWorkerRejected = ( isChatTransfer(taskChannelUniqueName, taskAttributes) && taskAttributes.transferTargetType === 'worker'; -const isChatTransferToQueueComplete = ( +export const isChatTransferToQueueComplete = ( eventType: EventType, taskChannelUniqueName: string, taskAttributes: ChatTransferTaskAttributes, @@ -229,7 +229,7 @@ export const handleEvent = async (context: Context, event: EventFields) .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) .update({ - assignmentStatus: 'reserved', + assignmentStatus: 'completed', reason: 'task transferred into queue', }); diff --git a/functions/webhooks/taskrouterCallback.protected.ts b/functions/webhooks/taskrouterCallback.protected.ts index 2ac23336..6dc33524 100644 --- a/functions/webhooks/taskrouterCallback.protected.ts +++ b/functions/webhooks/taskrouterCallback.protected.ts @@ -25,6 +25,7 @@ import '@twilio-labs/serverless-runtime-types'; import { Context, ServerlessCallback } from '@twilio-labs/serverless-runtime-types/types'; import { responseWithCors, bindResolve, success, error500 } from '@tech-matters/serverless-helpers'; import { TaskrouterListener, EventFields } from '@tech-matters/serverless-helpers/taskrouter'; +import { isChatTransferToQueueComplete } from '../taskrouterListeners/transfersListener.private'; const LISTENERS_FOLDER = 'taskrouterListeners/'; @@ -67,9 +68,29 @@ export const handler = async ( try { console.log(`===== Executing TaskrouterCallback for event: ${event.EventType} =====`); - await runTaskrouterListeners(context, event, callback); - const { EventType: eventType } = event; + const { + EventType: eventType, + TaskChannelUniqueName: taskChannelUniqueName, + TaskAttributes: taskAttributesString, + } = event; + + const taskAttributes = JSON.parse(taskAttributesString); + + const { originalTask: originalTaskSid } = taskAttributes.transferMeta; + const client = context.getTwilioClient(); + + if (isChatTransferToQueueComplete(eventType, taskChannelUniqueName, taskAttributes)) { + await client.taskrouter + .workspaces(context.TWILIO_WORKSPACE_SID) + .tasks(originalTaskSid) + .update({ + assignmentStatus: 'pending', + reason: 'task transferred into queue', + }); + } + + await runTaskrouterListeners(context, event, callback); resolve(success(JSON.stringify({ eventType }))); } catch (err) { From 70c8b20576e703917a525140088aab3ef9697200 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 12:33:22 +0100 Subject: [PATCH 07/30] ft: modify TaskrouterCallback-2 --- .../webhooks/taskrouterCallback.protected.ts | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/functions/webhooks/taskrouterCallback.protected.ts b/functions/webhooks/taskrouterCallback.protected.ts index 6dc33524..44c3e318 100644 --- a/functions/webhooks/taskrouterCallback.protected.ts +++ b/functions/webhooks/taskrouterCallback.protected.ts @@ -24,16 +24,51 @@ import '@twilio-labs/serverless-runtime-types'; import { Context, ServerlessCallback } from '@twilio-labs/serverless-runtime-types/types'; import { responseWithCors, bindResolve, success, error500 } from '@tech-matters/serverless-helpers'; -import { TaskrouterListener, EventFields } from '@tech-matters/serverless-helpers/taskrouter'; -import { isChatTransferToQueueComplete } from '../taskrouterListeners/transfersListener.private'; +import { + TaskrouterListener, + EventFields, + EventType, + TASK_QUEUE_ENTERED, +} from '@tech-matters/serverless-helpers/taskrouter'; const LISTENERS_FOLDER = 'taskrouterListeners/'; +export const eventTypes: EventType[] = [TASK_QUEUE_ENTERED]; + type EnvVars = { TWILIO_WORKSPACE_SID: string; CHAT_SERVICE_SID: string; }; +export type TransferMeta = { + mode: 'COLD' | 'WARM'; + transferStatus: 'transferring' | 'accepted' | 'rejected'; + sidWithTaskControl: string; +}; + +type ChatTransferTaskAttributes = { + transferMeta?: TransferMeta; + transferTargetType: 'worker' | 'queue'; +}; + +const isChatTransfer = ( + taskChannelUniqueName: string, + taskAttributes: { transferMeta?: TransferMeta }, +) => + taskChannelUniqueName !== 'voice' && + taskAttributes.transferMeta && + taskAttributes.transferMeta.mode === 'COLD' && + taskAttributes.transferMeta.transferStatus === 'accepted'; + +export const isChatTransferToQueueComplete = ( + eventType: EventType, + taskChannelUniqueName: string, + taskAttributes: ChatTransferTaskAttributes, +) => + eventType === TASK_QUEUE_ENTERED && + isChatTransfer(taskChannelUniqueName, taskAttributes) && + taskAttributes.transferTargetType === 'queue'; + /** * Fetch all taskrouter listeners from the listeners folder */ From c01cf7f77bcbc5edebe23a7e530a433021e39102 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 13:08:50 +0100 Subject: [PATCH 08/30] ft: modify TaskrouterCallback-3 --- functions/webhooks/taskrouterCallback.protected.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/webhooks/taskrouterCallback.protected.ts b/functions/webhooks/taskrouterCallback.protected.ts index 44c3e318..f3a6caee 100644 --- a/functions/webhooks/taskrouterCallback.protected.ts +++ b/functions/webhooks/taskrouterCallback.protected.ts @@ -115,6 +115,8 @@ export const handler = async ( const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); + await runTaskrouterListeners(context, event, callback); + if (isChatTransferToQueueComplete(eventType, taskChannelUniqueName, taskAttributes)) { await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) @@ -125,8 +127,6 @@ export const handler = async ( }); } - await runTaskrouterListeners(context, event, callback); - resolve(success(JSON.stringify({ eventType }))); } catch (err) { if (err instanceof Error) resolve(error500(err)); From 5c1dc168a7bae7034bdeecd7d3601e045f59e5fb Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 14:01:35 +0100 Subject: [PATCH 09/30] ch: update isChatTransferToQueueComplete --- .../transfersListener.private.ts | 32 ++++++++-- .../webhooks/taskrouterCallback.protected.ts | 60 +------------------ 2 files changed, 30 insertions(+), 62 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index e79024ac..ca96cc2f 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -225,13 +225,37 @@ export const handleEvent = async (context: Context, event: EventFields) console.log('isChatTransferToQueueComplete', originalTaskSid, eventType); - await client.taskrouter + const originalTask = await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) - .update({ - assignmentStatus: 'completed', + .fetch(); + + const { attributes: attributesRaw } = originalTask; + const originalAttributes = JSON.parse(attributesRaw); + + const { channelSid } = taskAttributes; + const attributesWithChannelSid = { + ...originalAttributes, + channelSid, + transferMeta: { + ...originalAttributes.transferMeta, + sidWithTaskControl: originalAttributes.transferMeta.originalReservation, + // transferStatus: 'rejected', + }, + }; + + await Promise.all([ + client.taskrouter + .workspaces(context.TWILIO_WORKSPACE_SID) + .tasks(originalTaskSid) + .update({ + attributes: JSON.stringify(attributesWithChannelSid), + }), + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + assignmentStatus: 'pending', reason: 'task transferred into queue', - }); + }), + ]); console.log('Finished handling chat queue transfer.'); return; diff --git a/functions/webhooks/taskrouterCallback.protected.ts b/functions/webhooks/taskrouterCallback.protected.ts index f3a6caee..2ac23336 100644 --- a/functions/webhooks/taskrouterCallback.protected.ts +++ b/functions/webhooks/taskrouterCallback.protected.ts @@ -24,51 +24,15 @@ import '@twilio-labs/serverless-runtime-types'; import { Context, ServerlessCallback } from '@twilio-labs/serverless-runtime-types/types'; import { responseWithCors, bindResolve, success, error500 } from '@tech-matters/serverless-helpers'; -import { - TaskrouterListener, - EventFields, - EventType, - TASK_QUEUE_ENTERED, -} from '@tech-matters/serverless-helpers/taskrouter'; +import { TaskrouterListener, EventFields } from '@tech-matters/serverless-helpers/taskrouter'; const LISTENERS_FOLDER = 'taskrouterListeners/'; -export const eventTypes: EventType[] = [TASK_QUEUE_ENTERED]; - type EnvVars = { TWILIO_WORKSPACE_SID: string; CHAT_SERVICE_SID: string; }; -export type TransferMeta = { - mode: 'COLD' | 'WARM'; - transferStatus: 'transferring' | 'accepted' | 'rejected'; - sidWithTaskControl: string; -}; - -type ChatTransferTaskAttributes = { - transferMeta?: TransferMeta; - transferTargetType: 'worker' | 'queue'; -}; - -const isChatTransfer = ( - taskChannelUniqueName: string, - taskAttributes: { transferMeta?: TransferMeta }, -) => - taskChannelUniqueName !== 'voice' && - taskAttributes.transferMeta && - taskAttributes.transferMeta.mode === 'COLD' && - taskAttributes.transferMeta.transferStatus === 'accepted'; - -export const isChatTransferToQueueComplete = ( - eventType: EventType, - taskChannelUniqueName: string, - taskAttributes: ChatTransferTaskAttributes, -) => - eventType === TASK_QUEUE_ENTERED && - isChatTransfer(taskChannelUniqueName, taskAttributes) && - taskAttributes.transferTargetType === 'queue'; - /** * Fetch all taskrouter listeners from the listeners folder */ @@ -103,29 +67,9 @@ export const handler = async ( try { console.log(`===== Executing TaskrouterCallback for event: ${event.EventType} =====`); - - const { - EventType: eventType, - TaskChannelUniqueName: taskChannelUniqueName, - TaskAttributes: taskAttributesString, - } = event; - - const taskAttributes = JSON.parse(taskAttributesString); - - const { originalTask: originalTaskSid } = taskAttributes.transferMeta; - const client = context.getTwilioClient(); - await runTaskrouterListeners(context, event, callback); - if (isChatTransferToQueueComplete(eventType, taskChannelUniqueName, taskAttributes)) { - await client.taskrouter - .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(originalTaskSid) - .update({ - assignmentStatus: 'pending', - reason: 'task transferred into queue', - }); - } + const { EventType: eventType } = event; resolve(success(JSON.stringify({ eventType }))); } catch (err) { From dbbb10391faa070b07ae9b8fd21a8656914013be Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 14:44:25 +0100 Subject: [PATCH 10/30] ft: modify TaskrouterCallback-4 --- .../transfersListener.private.ts | 37 +++++-------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index ca96cc2f..101facc8 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -225,37 +225,13 @@ export const handleEvent = async (context: Context, event: EventFields) console.log('isChatTransferToQueueComplete', originalTaskSid, eventType); - const originalTask = await client.taskrouter + await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) - .fetch(); - - const { attributes: attributesRaw } = originalTask; - const originalAttributes = JSON.parse(attributesRaw); - - const { channelSid } = taskAttributes; - const attributesWithChannelSid = { - ...originalAttributes, - channelSid, - transferMeta: { - ...originalAttributes.transferMeta, - sidWithTaskControl: originalAttributes.transferMeta.originalReservation, - // transferStatus: 'rejected', - }, - }; - - await Promise.all([ - client.taskrouter - .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(originalTaskSid) - .update({ - attributes: JSON.stringify(attributesWithChannelSid), - }), - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'pending', + .update({ + assignmentStatus: 'completed', reason: 'task transferred into queue', - }), - ]); + }); console.log('Finished handling chat queue transfer.'); return; @@ -302,6 +278,11 @@ export const handleEvent = async (context: Context, event: EventFields) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + assignmentStatus: 'reserved', + reason: 'task transferred rejected', + }), + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ assignmentStatus: 'canceled', reason: 'task transferred rejected', From 0d5b56308b943d15384ef10a9169f1e4ab86feb1 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 14:58:19 +0100 Subject: [PATCH 11/30] ft: modify TaskrouterCallback-5 --- functions/taskrouterListeners/transfersListener.private.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 101facc8..abf9fc81 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -279,12 +279,7 @@ export const handleEvent = async (context: Context, event: EventFields) attributes: JSON.stringify(attributesWithChannelSid), }), client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'reserved', - reason: 'task transferred rejected', - }), - - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'canceled', + assignmentStatus: 'completed', reason: 'task transferred rejected', }), ]); From 44af05353655cddc9b237860cb8797c2e6504f67 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 15:27:54 +0100 Subject: [PATCH 12/30] ft: isChatTransferToWorkerRejected --- .../transfersListener.private.ts | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index abf9fc81..e5094205 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -271,18 +271,26 @@ export const handleEvent = async (context: Context, event: EventFields) }, }; - await Promise.all([ - client.taskrouter - .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(originalTaskSid) - .update({ - attributes: JSON.stringify(attributesWithChannelSid), + const tasks = await client.taskrouter + .workspaces(context.TWILIO_WORKSPACE_SID) + .tasks(originalTaskSid) + .fetch(); + + if (tasks.assignmentStatus === 'pending' || tasks.assignmentStatus === 'reserved') { + await Promise.all([ + client.taskrouter + .workspaces(context.TWILIO_WORKSPACE_SID) + .tasks(originalTaskSid) + .update({ + attributes: JSON.stringify(attributesWithChannelSid), + }), + + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + assignmentStatus: 'canceled', + reason: 'task transferred rejected', }), - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'completed', - reason: 'task transferred rejected', - }), - ]); + ]); + } console.log('Finished handling chat transfer rejected.'); return; From 96a9d03e65781ff10025c4d2a6465e63045e4629 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 16:17:51 +0100 Subject: [PATCH 13/30] ft: isChatTransferToWorkerRejected-2 --- .../transfersListener.private.ts | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index e5094205..a8f92abd 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -84,7 +84,7 @@ const isChatTransferToWorkerRejected = ( isChatTransfer(taskChannelUniqueName, taskAttributes) && taskAttributes.transferTargetType === 'worker'; -export const isChatTransferToQueueComplete = ( +const isChatTransferToQueueComplete = ( eventType: EventType, taskChannelUniqueName: string, taskAttributes: ChatTransferTaskAttributes, @@ -198,7 +198,11 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); - console.log('isChatTransferToWorkerAccepted', originalTaskSid, eventType); + console.log( + 'isChatTransferToWorkerAccepted', + originalTaskSid, + taskAttributes.transferTargetType, + ); await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) @@ -223,7 +227,11 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); - console.log('isChatTransferToQueueComplete', originalTaskSid, eventType); + console.log( + 'isChatTransferToQueueComplete', + originalTaskSid, + taskAttributes.transferTargetType, + ); await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) @@ -250,7 +258,11 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); - console.log('isChatTransferToWorkerRejected', originalTaskSid, eventType); + console.log( + 'isChatTransferToWorkerRejected', + originalTaskSid, + taskAttributes.transferTargetType, + ); const originalTask = await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) @@ -267,30 +279,22 @@ export const handleEvent = async (context: Context, event: EventFields) transferMeta: { ...originalAttributes.transferMeta, sidWithTaskControl: originalAttributes.transferMeta.originalReservation, - transferStatus: 'rejected', + // transferStatus: 'rejected', }, }; - const tasks = await client.taskrouter - .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(originalTaskSid) - .fetch(); - - if (tasks.assignmentStatus === 'pending' || tasks.assignmentStatus === 'reserved') { - await Promise.all([ - client.taskrouter - .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(originalTaskSid) - .update({ - attributes: JSON.stringify(attributesWithChannelSid), - }), - - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'canceled', - reason: 'task transferred rejected', + await Promise.all([ + client.taskrouter + .workspaces(context.TWILIO_WORKSPACE_SID) + .tasks(originalTaskSid) + .update({ + attributes: JSON.stringify(attributesWithChannelSid), }), - ]); - } + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + assignmentStatus: 'canceled', + reason: 'task transferred rejected', + }), + ]); console.log('Finished handling chat transfer rejected.'); return; From ea366005726738a1775c1446a4589705676a24e3 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 16:30:26 +0100 Subject: [PATCH 14/30] ch: add isChatTransferToQueueWorker --- .../transfersListener.private.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index a8f92abd..09f6e33b 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -93,6 +93,15 @@ const isChatTransferToQueueComplete = ( isChatTransfer(taskChannelUniqueName, taskAttributes) && taskAttributes.transferTargetType === 'queue'; +const isChatTransferToQueueWorker = ( + eventType: EventType, + taskChannelUniqueName: string, + taskAttributes: ChatTransferTaskAttributes, +) => + eventType === TASK_QUEUE_ENTERED && + isChatTransfer(taskChannelUniqueName, taskAttributes) && + taskAttributes.transferTargetType === 'worker'; + const isWarmVoiceTransferRejected = ( eventType: EventType, taskChannelUniqueName: string, @@ -245,6 +254,30 @@ export const handleEvent = async (context: Context, event: EventFields) return; } + if (isChatTransferToQueueWorker(eventType, taskChannelUniqueName, taskAttributes)) { + console.log('Handling chat transfer to queue entering target queue...'); + + const { originalTask: originalTaskSid } = taskAttributes.transferMeta; + const client = context.getTwilioClient(); + + console.log( + 'isChatTransferToQueueComplete', + originalTaskSid, + taskAttributes.transferTargetType, + ); + + await client.taskrouter + .workspaces(context.TWILIO_WORKSPACE_SID) + .tasks(originalTaskSid) + .update({ + assignmentStatus: 'pending', + reason: 'task transferred into queue', + }); + + console.log('Finished handling chat queue transfer.'); + return; + } + /** * If a chat transfer gets rejected, it should: * 1) Adjust original task attributes: From b770cfa441a70b1ca02f33fc51604c35b5d5ffa3 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 17:15:24 +0100 Subject: [PATCH 15/30] ch: add isChatTransferToQueueWorker-2 --- .../transfersListener.private.ts | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 09f6e33b..9ae54602 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -93,14 +93,14 @@ const isChatTransferToQueueComplete = ( isChatTransfer(taskChannelUniqueName, taskAttributes) && taskAttributes.transferTargetType === 'queue'; -const isChatTransferToQueueWorker = ( - eventType: EventType, - taskChannelUniqueName: string, - taskAttributes: ChatTransferTaskAttributes, -) => - eventType === TASK_QUEUE_ENTERED && - isChatTransfer(taskChannelUniqueName, taskAttributes) && - taskAttributes.transferTargetType === 'worker'; +// const isChatTransferToQueueWorker = ( +// eventType: EventType, +// taskChannelUniqueName: string, +// taskAttributes: ChatTransferTaskAttributes, +// ) => +// eventType === TASK_QUEUE_ENTERED && +// isChatTransfer(taskChannelUniqueName, taskAttributes) && +// taskAttributes.transferTargetType === 'worker'; const isWarmVoiceTransferRejected = ( eventType: EventType, @@ -188,14 +188,14 @@ export const handleEvent = async (context: Context, event: EventFields) const taskAttributes = JSON.parse(taskAttributesString); - // const clients = context.getTwilioClient(); + const clients = context.getTwilioClient(); - // const testClient = clients.taskrouter - // .workspaces(context.TWILIO_WORKSPACE_SID) - // .tasks(taskAttributes.transferMeta.originalTask.originalTaskSid) - // .update(); + const testClient = await clients.taskrouter + .workspaces(context.TWILIO_WORKSPACE_SID) + .tasks(taskAttributes.transferMeta.originalTask.originalTaskSid) + .fetch(); - // console.log('testClient', testClient); + console.log('testClient here', testClient.assignmentStatus); /** * If a chat transfer gets accepted, it should: @@ -254,29 +254,29 @@ export const handleEvent = async (context: Context, event: EventFields) return; } - if (isChatTransferToQueueWorker(eventType, taskChannelUniqueName, taskAttributes)) { - console.log('Handling chat transfer to queue entering target queue...'); - - const { originalTask: originalTaskSid } = taskAttributes.transferMeta; - const client = context.getTwilioClient(); - - console.log( - 'isChatTransferToQueueComplete', - originalTaskSid, - taskAttributes.transferTargetType, - ); - - await client.taskrouter - .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(originalTaskSid) - .update({ - assignmentStatus: 'pending', - reason: 'task transferred into queue', - }); - - console.log('Finished handling chat queue transfer.'); - return; - } + // if (isChatTransferToQueueWorker(eventType, taskChannelUniqueName, taskAttributes)) { + // console.log('Handling chat transfer to queue entering target queue...'); + + // const { originalTask: originalTaskSid } = taskAttributes.transferMeta; + // const client = context.getTwilioClient(); + + // console.log( + // 'isChatTransferToQueueComplete', + // originalTaskSid, + // taskAttributes.transferTargetType, + // ); + + // await client.taskrouter + // .workspaces(context.TWILIO_WORKSPACE_SID) + // .tasks(originalTaskSid) + // .update({ + // assignmentStatus: 'pending', + // reason: 'task transferred into queue', + // }); + + // console.log('Finished handling chat queue transfer.'); + // return; + // } /** * If a chat transfer gets rejected, it should: From a056be2f98bd1758ded724d9978a09e76cf12f5e Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 17:23:13 +0100 Subject: [PATCH 16/30] fx: add taskSid --- functions/taskrouterListeners/transfersListener.private.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 9ae54602..5da6900a 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -192,7 +192,7 @@ export const handleEvent = async (context: Context, event: EventFields) const testClient = await clients.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(taskAttributes.transferMeta.originalTask.originalTaskSid) + .tasks(taskSid) .fetch(); console.log('testClient here', testClient.assignmentStatus); From b34dfd4a68811224e46c1e43090c5b8240dbc49a Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Wed, 12 Jul 2023 18:39:31 +0100 Subject: [PATCH 17/30] fx: add taskSid-2 --- functions/taskrouterListeners/transfersListener.private.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 5da6900a..5ab86e66 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -323,7 +323,7 @@ export const handleEvent = async (context: Context, event: EventFields) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(originalTaskSid).update({ assignmentStatus: 'canceled', reason: 'task transferred rejected', }), From 0f87df2f7c2454863e82e286915f4f18442e9eb6 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Thu, 13 Jul 2023 11:46:01 +0100 Subject: [PATCH 18/30] log taskSid --- .../taskrouterListeners/transfersListener.private.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 5ab86e66..c22c0912 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -207,6 +207,9 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); + console.log('testClient here 1', testClient.assignmentStatus); + console.log('originalTaskSid 1:', originalTaskSid, 'taskSid: 1', taskSid); + console.log( 'isChatTransferToWorkerAccepted', originalTaskSid, @@ -235,6 +238,8 @@ export const handleEvent = async (context: Context, event: EventFields) const { originalTask: originalTaskSid } = taskAttributes.transferMeta; const client = context.getTwilioClient(); + console.log('testClient here 2', testClient.assignmentStatus); + console.log('originalTaskSid: 2', originalTaskSid, 'taskSid: 2', taskSid); console.log( 'isChatTransferToQueueComplete', @@ -296,6 +301,8 @@ export const handleEvent = async (context: Context, event: EventFields) originalTaskSid, taskAttributes.transferTargetType, ); + console.log('testClient here 3', testClient.assignmentStatus); + console.log('originalTaskSid: 3', originalTaskSid, 'taskSid: 3', taskSid); const originalTask = await client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) @@ -323,12 +330,15 @@ export const handleEvent = async (context: Context, event: EventFields) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(originalTaskSid).update({ + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ assignmentStatus: 'canceled', reason: 'task transferred rejected', }), ]); + console.log('testClient here 4', testClient.assignmentStatus); + console.log('originalTaskSid: 4', originalTaskSid, 'taskSid: 4', taskSid); + console.log('Finished handling chat transfer rejected.'); return; } From 2c2bc9a2553e5c22153cf9eba5a1bc97c70810a1 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Thu, 13 Jul 2023 12:01:40 +0100 Subject: [PATCH 19/30] log taskSid-2 --- .../transfersListener.private.ts | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index c22c0912..4f0d5aed 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -176,25 +176,23 @@ const updateWarmVoiceTransferAttributes = async ( export const shouldHandle = (event: EventFields) => eventTypes.includes(event.EventType); export const handleEvent = async (context: Context, event: EventFields) => { + const { + EventType: eventType, + TaskChannelUniqueName: taskChannelUniqueName, + TaskSid: taskSid, + TaskAttributes: taskAttributesString, + } = event; + + const clients = context.getTwilioClient(); + const testClient = await clients.taskrouter + .workspaces(context.TWILIO_WORKSPACE_SID) + .tasks(taskSid) + .fetch(); try { - const { - EventType: eventType, - TaskChannelUniqueName: taskChannelUniqueName, - TaskSid: taskSid, - TaskAttributes: taskAttributesString, - } = event; - console.log(`===== Executing TransfersListener for event: ${eventType} =====`); const taskAttributes = JSON.parse(taskAttributesString); - const clients = context.getTwilioClient(); - - const testClient = await clients.taskrouter - .workspaces(context.TWILIO_WORKSPACE_SID) - .tasks(taskSid) - .fetch(); - console.log('testClient here', testClient.assignmentStatus); /** @@ -379,6 +377,7 @@ export const handleEvent = async (context: Context, event: EventFields) } catch (err) { console.log('===== TransfersListener has failed ====='); console.log(String(err)); + console.log('testClient here 5', testClient.assignmentStatus); throw err; } }; From 2b9861a118bd1c3824be6dcd4f9e6eca17808a28 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Thu, 13 Jul 2023 13:59:50 +0100 Subject: [PATCH 20/30] log taskSid-3 --- functions/taskrouterListeners/transfersListener.private.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 4f0d5aed..c0861682 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -329,7 +329,7 @@ export const handleEvent = async (context: Context, event: EventFields) attributes: JSON.stringify(attributesWithChannelSid), }), client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'canceled', + assignmentStatus: 'completed', reason: 'task transferred rejected', }), ]); From db2bed20d14a6832271350c5a4bddf1d6b54f6b3 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Thu, 13 Jul 2023 14:12:05 +0100 Subject: [PATCH 21/30] log taskSid-4 --- .../taskrouterListeners/transfersListener.private.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index c0861682..2fc76a8d 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -328,12 +328,13 @@ export const handleEvent = async (context: Context, event: EventFields) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'completed', - reason: 'task transferred rejected', - }), ]); + await client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + assignmentStatus: 'canceled', + reason: 'task transferred rejected', + }); + console.log('testClient here 4', testClient.assignmentStatus); console.log('originalTaskSid: 4', originalTaskSid, 'taskSid: 4', taskSid); From f0cce414f6edf8715af447ad1741fd418aa9b57f Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Thu, 13 Jul 2023 15:19:52 +0100 Subject: [PATCH 22/30] remove assignmentStatus: 'canceled' --- .../taskrouterListeners/transfersListener.private.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 2fc76a8d..722fd60a 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -27,6 +27,7 @@ import { RESERVATION_REJECTED, RESERVATION_TIMEOUT, RESERVATION_WRAPUP, + // RESERVATION_CANCELED, TASK_CANCELED, TASK_QUEUE_ENTERED, } from '@tech-matters/serverless-helpers/taskrouter'; @@ -317,7 +318,7 @@ export const handleEvent = async (context: Context, event: EventFields) transferMeta: { ...originalAttributes.transferMeta, sidWithTaskControl: originalAttributes.transferMeta.originalReservation, - // transferStatus: 'rejected', + transferStatus: 'rejected', }, }; @@ -328,13 +329,12 @@ export const handleEvent = async (context: Context, event: EventFields) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), + // client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + // assignmentStatus: 'canceled', + // reason: 'task transferred rejected', + // }), ]); - await client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'canceled', - reason: 'task transferred rejected', - }); - console.log('testClient here 4', testClient.assignmentStatus); console.log('originalTaskSid: 4', originalTaskSid, 'taskSid: 4', taskSid); From 5845d3efca9d88c9e5a26735daca89f1434ec7d7 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Thu, 13 Jul 2023 15:58:28 +0100 Subject: [PATCH 23/30] ch: update taskSid to originalTaskSid --- .../taskrouterListeners/transfersListener.private.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 722fd60a..fb602393 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -329,10 +329,10 @@ export const handleEvent = async (context: Context, event: EventFields) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), - // client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - // assignmentStatus: 'canceled', - // reason: 'task transferred rejected', - // }), + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(originalTaskSid).update({ + assignmentStatus: 'canceled', + reason: 'task transferred rejected', + }), ]); console.log('testClient here 4', testClient.assignmentStatus); From 116cf826d3cd61e273f0ca9a60a0cdfef88bffe3 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Thu, 13 Jul 2023 16:16:38 +0100 Subject: [PATCH 24/30] ch: update taskSid to originalTaskSid-2 --- .../taskrouterListeners/transfersListener.private.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index fb602393..29736588 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -323,16 +323,16 @@ export const handleEvent = async (context: Context, event: EventFields) }; await Promise.all([ + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + assignmentStatus: 'canceled', + reason: 'task transferred rejected', + }), client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(originalTaskSid).update({ - assignmentStatus: 'canceled', - reason: 'task transferred rejected', - }), ]); console.log('testClient here 4', testClient.assignmentStatus); From c965acb155de0a853c5fd71557ad98bf37605852 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Fri, 14 Jul 2023 10:50:29 +0100 Subject: [PATCH 25/30] ft: implement hasTaskControl --- .../janitorListener.private.ts | 5 +- .../transfersListener.private.ts | 10 ++-- functions/transfer/helpers.ts | 49 +++++++++++++++++++ 3 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 functions/transfer/helpers.ts diff --git a/functions/taskrouterListeners/janitorListener.private.ts b/functions/taskrouterListeners/janitorListener.private.ts index 4055c4a6..42017297 100644 --- a/functions/taskrouterListeners/janitorListener.private.ts +++ b/functions/taskrouterListeners/janitorListener.private.ts @@ -31,6 +31,7 @@ import { import type { ChatChannelJanitor } from '../helpers/chatChannelJanitor.private'; import type { ChannelToFlex } from '../helpers/customChannels/customChannelToFlex.private'; +import { hasTaskControl, Attributes } from '../transfer/helpers'; export const eventTypes: EventType[] = [ TASK_CANCELED, @@ -47,7 +48,7 @@ type EnvVars = { const isCleanupPostSurvey = (eventType: EventType, taskAttributes: { isSurveyTask?: boolean }) => (eventType === TASK_CANCELED || eventType === TASK_WRAPUP) && taskAttributes.isSurveyTask; -const isCleanupCustomChannel = (eventType: EventType, taskAttributes: { channelType?: string }) => { +const isCleanupCustomChannel = (eventType: EventType, taskAttributes: Attributes) => { if ( !( eventType === TASK_DELETED || @@ -58,6 +59,8 @@ const isCleanupCustomChannel = (eventType: EventType, taskAttributes: { channelT return false; } + if (!hasTaskControl(taskAttributes)) return false; + const handlerPath = Runtime.getFunctions()['helpers/customChannels/customChannelToFlex'].path; const channelToFlex = require(handlerPath) as ChannelToFlex; diff --git a/functions/taskrouterListeners/transfersListener.private.ts b/functions/taskrouterListeners/transfersListener.private.ts index 29736588..1bb92582 100644 --- a/functions/taskrouterListeners/transfersListener.private.ts +++ b/functions/taskrouterListeners/transfersListener.private.ts @@ -194,7 +194,7 @@ export const handleEvent = async (context: Context, event: EventFields) const taskAttributes = JSON.parse(taskAttributesString); - console.log('testClient here', testClient.assignmentStatus); + console.log('testClient here', testClient.assignmentStatus, taskAttributes.isInMyBehalf); /** * If a chat transfer gets accepted, it should: @@ -323,16 +323,16 @@ export const handleEvent = async (context: Context, event: EventFields) }; await Promise.all([ - client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ - assignmentStatus: 'canceled', - reason: 'task transferred rejected', - }), client.taskrouter .workspaces(context.TWILIO_WORKSPACE_SID) .tasks(originalTaskSid) .update({ attributes: JSON.stringify(attributesWithChannelSid), }), + client.taskrouter.workspaces(context.TWILIO_WORKSPACE_SID).tasks(taskSid).update({ + assignmentStatus: 'canceled', + reason: 'task transferred rejected', + }), ]); console.log('testClient here 4', testClient.assignmentStatus); diff --git a/functions/transfer/helpers.ts b/functions/transfer/helpers.ts new file mode 100644 index 00000000..1b4f80b5 --- /dev/null +++ b/functions/transfer/helpers.ts @@ -0,0 +1,49 @@ +/** + * Copyright (C) 2021-2023 Technology Matters + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ + +/* eslint-disable global-require */ +/* eslint-disable import/no-dynamic-require */ + +export type TransferMeta = { + mode: 'COLD' | 'WARM'; + transferStatus: 'transferring' | 'accepted' | 'rejected'; + sidWithTaskControl: string; +}; + +export type Attributes = { + transferMeta?: TransferMeta; + isContactlessTask?: true; + isInMyBehalf?: true; + taskSid: string; + channelType?: string; +}; + +export const offlineContactTaskSid = 'offline-contact-task-sid'; + +export const isInMyBehalfITask = (task: Attributes) => + task && task.isContactlessTask && task.isInMyBehalf; + +export const isOfflineContactTask = (task: Attributes) => task.taskSid === offlineContactTaskSid; + +export const isTwilioTask = (task: Attributes) => + task && !isOfflineContactTask(task) && !isInMyBehalfITask(task); + +export const hasTransferStarted = (task: Attributes) => Boolean(task && task.transferMeta); + +export const hasTaskControl = (task: Attributes) => + !isTwilioTask(task) || + !hasTransferStarted(task) || + task.transferMeta?.sidWithTaskControl === task.taskSid; From df06960b059b9a8d39abfae59c006fdb5ddc78db Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Fri, 14 Jul 2023 11:56:28 +0100 Subject: [PATCH 26/30] ft: remove hasTaskControl --- functions/taskrouterListeners/janitorListener.private.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/taskrouterListeners/janitorListener.private.ts b/functions/taskrouterListeners/janitorListener.private.ts index 42017297..d1e67095 100644 --- a/functions/taskrouterListeners/janitorListener.private.ts +++ b/functions/taskrouterListeners/janitorListener.private.ts @@ -59,7 +59,7 @@ const isCleanupCustomChannel = (eventType: EventType, taskAttributes: Attributes return false; } - if (!hasTaskControl(taskAttributes)) return false; + // if (!hasTaskControl(taskAttributes)) return false; const handlerPath = Runtime.getFunctions()['helpers/customChannels/customChannelToFlex'].path; const channelToFlex = require(handlerPath) as ChannelToFlex; From aff1343cf55978fdb4855a2b52a4941be703fc49 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Fri, 14 Jul 2023 15:15:38 +0100 Subject: [PATCH 27/30] ft: add hasTaskControl-2 --- functions/taskrouterListeners/janitorListener.private.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/taskrouterListeners/janitorListener.private.ts b/functions/taskrouterListeners/janitorListener.private.ts index d1e67095..42017297 100644 --- a/functions/taskrouterListeners/janitorListener.private.ts +++ b/functions/taskrouterListeners/janitorListener.private.ts @@ -59,7 +59,7 @@ const isCleanupCustomChannel = (eventType: EventType, taskAttributes: Attributes return false; } - // if (!hasTaskControl(taskAttributes)) return false; + if (!hasTaskControl(taskAttributes)) return false; const handlerPath = Runtime.getFunctions()['helpers/customChannels/customChannelToFlex'].path; const channelToFlex = require(handlerPath) as ChannelToFlex; From 504b4263db453311c8970f8c37011acc9d692688 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Fri, 14 Jul 2023 15:26:41 +0100 Subject: [PATCH 28/30] ch: move transfer to janitor --- .../janitorListener.private.ts | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/functions/taskrouterListeners/janitorListener.private.ts b/functions/taskrouterListeners/janitorListener.private.ts index 42017297..8c2aa0a7 100644 --- a/functions/taskrouterListeners/janitorListener.private.ts +++ b/functions/taskrouterListeners/janitorListener.private.ts @@ -31,7 +31,7 @@ import { import type { ChatChannelJanitor } from '../helpers/chatChannelJanitor.private'; import type { ChannelToFlex } from '../helpers/customChannels/customChannelToFlex.private'; -import { hasTaskControl, Attributes } from '../transfer/helpers'; +// import { hasTaskControl, Attributes } from '../transfer/helpers'; export const eventTypes: EventType[] = [ TASK_CANCELED, @@ -45,6 +45,37 @@ type EnvVars = { FLEX_PROXY_SERVICE_SID: string; }; +export type TransferMeta = { + mode: 'COLD' | 'WARM'; + transferStatus: 'transferring' | 'accepted' | 'rejected'; + sidWithTaskControl: string; +}; + +export type Attributes = { + transferMeta?: TransferMeta; + isContactlessTask?: true; + isInMyBehalf?: true; + taskSid: string; + channelType?: string; +}; + +export const offlineContactTaskSid = 'offline-contact-task-sid'; + +export const isInMyBehalfITask = (task: Attributes) => + task && task.isContactlessTask && task.isInMyBehalf; + +export const isOfflineContactTask = (task: Attributes) => task.taskSid === offlineContactTaskSid; + +export const isTwilioTask = (task: Attributes) => + task && !isOfflineContactTask(task) && !isInMyBehalfITask(task); + +export const hasTransferStarted = (task: Attributes) => Boolean(task && task.transferMeta); + +export const hasTaskControl = (task: Attributes) => + !isTwilioTask(task) || + !hasTransferStarted(task) || + task.transferMeta?.sidWithTaskControl === task.taskSid; + const isCleanupPostSurvey = (eventType: EventType, taskAttributes: { isSurveyTask?: boolean }) => (eventType === TASK_CANCELED || eventType === TASK_WRAPUP) && taskAttributes.isSurveyTask; From d0e736c7d622770609562153a125e1070c39d36c Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Fri, 14 Jul 2023 16:06:13 +0100 Subject: [PATCH 29/30] log hasTaskControl --- functions/taskrouterListeners/janitorListener.private.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/functions/taskrouterListeners/janitorListener.private.ts b/functions/taskrouterListeners/janitorListener.private.ts index 8c2aa0a7..20cbf647 100644 --- a/functions/taskrouterListeners/janitorListener.private.ts +++ b/functions/taskrouterListeners/janitorListener.private.ts @@ -80,6 +80,7 @@ const isCleanupPostSurvey = (eventType: EventType, taskAttributes: { isSurveyTas (eventType === TASK_CANCELED || eventType === TASK_WRAPUP) && taskAttributes.isSurveyTask; const isCleanupCustomChannel = (eventType: EventType, taskAttributes: Attributes) => { + console.log('hasTaskControl(taskAttributes) 1', hasTaskControl(taskAttributes)); if ( !( eventType === TASK_DELETED || @@ -90,6 +91,8 @@ const isCleanupCustomChannel = (eventType: EventType, taskAttributes: Attributes return false; } + console.log('hasTaskControl(taskAttributes) 2', hasTaskControl(taskAttributes)); + if (!hasTaskControl(taskAttributes)) return false; const handlerPath = Runtime.getFunctions()['helpers/customChannels/customChannelToFlex'].path; From e10249e5388a6dec6ed0333d15babe0bc71a05c0 Mon Sep 17 00:00:00 2001 From: Stephen Okpalaononuju Date: Fri, 14 Jul 2023 16:44:41 +0100 Subject: [PATCH 30/30] log hasTaskControl-2 --- .../janitorListener.private.ts | 42 ++++--------------- .../{helpers.ts => helpers.private.ts} | 4 ++ 2 files changed, 11 insertions(+), 35 deletions(-) rename functions/transfer/{helpers.ts => helpers.private.ts} (95%) diff --git a/functions/taskrouterListeners/janitorListener.private.ts b/functions/taskrouterListeners/janitorListener.private.ts index 20cbf647..34c02da3 100644 --- a/functions/taskrouterListeners/janitorListener.private.ts +++ b/functions/taskrouterListeners/janitorListener.private.ts @@ -31,7 +31,7 @@ import { import type { ChatChannelJanitor } from '../helpers/chatChannelJanitor.private'; import type { ChannelToFlex } from '../helpers/customChannels/customChannelToFlex.private'; -// import { hasTaskControl, Attributes } from '../transfer/helpers'; +import type { HasTaskControl, Attributes } from '../transfer/helpers.private'; export const eventTypes: EventType[] = [ TASK_CANCELED, @@ -45,42 +45,14 @@ type EnvVars = { FLEX_PROXY_SERVICE_SID: string; }; -export type TransferMeta = { - mode: 'COLD' | 'WARM'; - transferStatus: 'transferring' | 'accepted' | 'rejected'; - sidWithTaskControl: string; -}; - -export type Attributes = { - transferMeta?: TransferMeta; - isContactlessTask?: true; - isInMyBehalf?: true; - taskSid: string; - channelType?: string; -}; - -export const offlineContactTaskSid = 'offline-contact-task-sid'; - -export const isInMyBehalfITask = (task: Attributes) => - task && task.isContactlessTask && task.isInMyBehalf; - -export const isOfflineContactTask = (task: Attributes) => task.taskSid === offlineContactTaskSid; - -export const isTwilioTask = (task: Attributes) => - task && !isOfflineContactTask(task) && !isInMyBehalfITask(task); - -export const hasTransferStarted = (task: Attributes) => Boolean(task && task.transferMeta); - -export const hasTaskControl = (task: Attributes) => - !isTwilioTask(task) || - !hasTransferStarted(task) || - task.transferMeta?.sidWithTaskControl === task.taskSid; - const isCleanupPostSurvey = (eventType: EventType, taskAttributes: { isSurveyTask?: boolean }) => (eventType === TASK_CANCELED || eventType === TASK_WRAPUP) && taskAttributes.isSurveyTask; +const handleTaskControl = Runtime.getFunctions()['transfer/helpers'].path; +const taskControl = require(handleTaskControl) as HasTaskControl; + const isCleanupCustomChannel = (eventType: EventType, taskAttributes: Attributes) => { - console.log('hasTaskControl(taskAttributes) 1', hasTaskControl(taskAttributes)); + console.log('hasTaskControl(taskAttributes) 1', taskControl.hasTaskControl(taskAttributes)); if ( !( eventType === TASK_DELETED || @@ -91,9 +63,9 @@ const isCleanupCustomChannel = (eventType: EventType, taskAttributes: Attributes return false; } - console.log('hasTaskControl(taskAttributes) 2', hasTaskControl(taskAttributes)); + console.log('hasTaskControl(taskAttributes) 2', taskControl.hasTaskControl(taskAttributes)); - if (!hasTaskControl(taskAttributes)) return false; + if (!taskControl.hasTaskControl(taskAttributes)) return false; const handlerPath = Runtime.getFunctions()['helpers/customChannels/customChannelToFlex'].path; const channelToFlex = require(handlerPath) as ChannelToFlex; diff --git a/functions/transfer/helpers.ts b/functions/transfer/helpers.private.ts similarity index 95% rename from functions/transfer/helpers.ts rename to functions/transfer/helpers.private.ts index 1b4f80b5..82a31e87 100644 --- a/functions/transfer/helpers.ts +++ b/functions/transfer/helpers.private.ts @@ -47,3 +47,7 @@ export const hasTaskControl = (task: Attributes) => !isTwilioTask(task) || !hasTransferStarted(task) || task.transferMeta?.sidWithTaskControl === task.taskSid; + +export type HasTaskControl = { + hasTaskControl: typeof hasTaskControl; +};