diff --git a/.husky/pre-push b/.husky/pre-push index 91c16cf..d7bfd54 100644 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1,4 +1,4 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -yarn run lint:check && yarn run lint:fix +yarn run test diff --git a/packages/bot/core/core.class.js b/packages/bot/core/core.class.js index cb22dca..132b6d0 100644 --- a/packages/bot/core/core.class.js +++ b/packages/bot/core/core.class.js @@ -1,4 +1,4 @@ -const { validateCtx } = require('../io/methods') +const { toCtx } = require('../io/methods') const { printer } = require('../utils/interactive') /** @@ -51,8 +51,20 @@ class CoreClass { let msgToSend = [] const prevMsg = await this.databaseClass.getPrevByNumber(from) - if (prevMsg?.ref && prevMsg?.options?.capture) { - msgToSend = this.flowClass.find(prevMsg.ref, true) || [] + if (prevMsg?.ref) { + const ctxByNumber = toCtx({ + body, + from, + prevRef: prevMsg.refSerialize, + }) + this.databaseClass.save(ctxByNumber) + } + + if (prevMsg?.refSerialize && prevMsg?.options?.capture) { + const refToContinue = this.flowClass.findBySerialize( + prevMsg.refSerialize + ) + msgToSend = this.flowClass.find(refToContinue?.ref, true) || [] } else { msgToSend = this.flowClass.find(body) || [] } diff --git a/packages/bot/io/flow.class.js b/packages/bot/io/flow.class.js index 6818982..83d413a 100644 --- a/packages/bot/io/flow.class.js +++ b/packages/bot/io/flow.class.js @@ -1,7 +1,9 @@ +const { toSerialize } = require('./methods') + class FlowClass { flow constructor(_flow) { - this.flow = _flow + this.flow = toSerialize(_flow) } find = (keyOrWord, symbol = false) => { @@ -25,6 +27,9 @@ class FlowClass { findIn(keyOrWord, symbol) return messages } + + findBySerialize = (refSerialize) => + this.flow.find((r) => r.refSerialize === refSerialize) } module.exports = FlowClass diff --git a/packages/bot/io/methods/index.js b/packages/bot/io/methods/index.js index 1fd497f..875a49c 100644 --- a/packages/bot/io/methods/index.js +++ b/packages/bot/io/methods/index.js @@ -1,6 +1,7 @@ const { addAnswer } = require('./addAnswer') const { addKeyword } = require('./addKeyword') -const { validateCtx } = require('./validateCtx') +const { toSerialize } = require('./toSerialize') +const { toCtx } = require('./toCtx') const { toJson } = require('./toJson') -module.exports = { addAnswer, addKeyword, validateCtx, toJson } +module.exports = { addAnswer, addKeyword, toCtx, toJson, toSerialize } diff --git a/packages/bot/io/methods/toCtx.js b/packages/bot/io/methods/toCtx.js new file mode 100644 index 0000000..d29295e --- /dev/null +++ b/packages/bot/io/methods/toCtx.js @@ -0,0 +1,19 @@ +const { generateRef, generateRefSerialize } = require('../../utils/hash') +/** + * @deprecate + * @param answer string + * @param options {media:string, buttons:[], capture:true default false} + * @returns + */ +const toCtx = ({ body, from, prevRef, index }) => { + return { + ref: generateRef(), + keyword: prevRef, + answer: body, + options: {}, + from, + refSerialize: generateRefSerialize({ index, answer: body }), + } +} + +module.exports = { toCtx } diff --git a/packages/bot/io/methods/toSerialize.js b/packages/bot/io/methods/toSerialize.js new file mode 100644 index 0000000..108cf3e --- /dev/null +++ b/packages/bot/io/methods/toSerialize.js @@ -0,0 +1,22 @@ +const { generateRefSerialize } = require('../../utils/hash') + +/** + * Crear referencia serializada + * @param {*} flowJson + * @returns + */ +const toSerialize = (flowJson) => { + if (!Array.isArray(flowJson)) throw new Error('Esto debe ser un ARRAY') + + const jsonToSerialize = flowJson.map((row, index) => ({ + ...row, + refSerialize: `${generateRefSerialize({ + index, + answer: row.answer, + })}`, + })) + + return jsonToSerialize +} + +module.exports = { toSerialize } diff --git a/packages/bot/io/methods/validateCtx.js b/packages/bot/io/methods/validateCtx.js deleted file mode 100644 index 5bc4670..0000000 --- a/packages/bot/io/methods/validateCtx.js +++ /dev/null @@ -1,18 +0,0 @@ -const { generateRef } = require('../../utils/hash') -/** - * - * @param answer string - * @param options {media:string, buttons:[], capture:true default false} - * @returns - */ -const validateCtx = ({ body, from }) => { - return { - ref: generateRef(), - keyword: null, - answer: body, - options: {}, - from, - } -} - -module.exports = { validateCtx } diff --git a/packages/bot/tests/bot.class.test.js b/packages/bot/tests/bot.class.test.js index 6536722..5e2230f 100644 --- a/packages/bot/tests/bot.class.test.js +++ b/packages/bot/tests/bot.class.test.js @@ -10,6 +10,7 @@ class MockFlow { class MockDB { listHistory = [] save = () => {} + getPrevByNumber = () => {} } test(`[CoreClass] Probando instanciamiento de clase`, async () => { diff --git a/packages/bot/tests/methods.test.js b/packages/bot/tests/methods.test.js index cfefbb2..e108e43 100644 --- a/packages/bot/tests/methods.test.js +++ b/packages/bot/tests/methods.test.js @@ -1,6 +1,7 @@ const { test } = require('uvu') const assert = require('uvu/assert') -const { addKeyword, addAnswer } = require('@bot-whatsapp/bot') +const { generateRefSerialize } = require('../utils/hash') +const { addKeyword, addAnswer, toSerialize } = require('../io/methods') test('Debere probar las propeidades', () => { const ARRANGE = { @@ -21,6 +22,26 @@ test('Debere probar las propeidades array', () => { assert.is(MAIN_CTX.ctx.keyword, ARRANGE.keyword) }) +test('Debere probar toSerialize', () => { + const ARRANGE = { + keyword: ['hola!', 'ole'], + } + const MAIN_CTX = addKeyword(ARRANGE.keyword) + .addAnswer('Segundo!') + .addAnswer('Segundo!') + .toJson() + + const [ANSWER_A] = MAIN_CTX + + assert.is( + toSerialize(MAIN_CTX)[0].refSerialize, + generateRefSerialize({ + index: 0, + answer: ANSWER_A.answer, + }) + ) +}) + test('Debere probar el paso de contexto', () => { const ARRANGE = { keyword: 'hola!', diff --git a/packages/bot/utils/hash.js b/packages/bot/utils/hash.js index a84fc83..888df6b 100644 --- a/packages/bot/utils/hash.js +++ b/packages/bot/utils/hash.js @@ -4,4 +4,15 @@ const generateRef = () => { return crypto.randomUUID() } -module.exports = { generateRef } +/** + * Genera un HASH MD5 + * @param {*} param0 + * @returns + */ +const generateRefSerialize = ({ index, answer }) => + crypto + .createHash('md5') + .update(JSON.stringify({ index, answer })) + .digest('hex') + +module.exports = { generateRef, generateRefSerialize }