diff --git a/__tests__/basic.e2e.test.js b/__tests__/basic.e2e.test.js index b95cfac..9ba4406 100644 --- a/__tests__/basic.e2e.test.js +++ b/__tests__/basic.e2e.test.js @@ -1,77 +1,43 @@ const { test } = require('uvu') const assert = require('uvu/assert') -/** - * require('@bot-whatsapp') - */ -const { inout, provider, bot } = require('../lib/index.cjs') -/** - * MockDB - */ -class DatabaseClass { - constructor() {} +// const { inout, provider, database, botcore } = require('../lib/index.cjs') +const { inout, provider, database, botcore } = require('../packages/index') - saveLog = (ctx) => { - return ctx - } +const adapterDB = database.create({ + engine: 'json', // 'mysql / pg / mongo / json (json-default)', + credentials: {}, +}) + +const adapterProvider = provider.create({ + vendor: 'web', //'twilio / web / meta', + credentials: {}, +}) + +const makeFlow = () => { + const flowA = inout + .addKeyword('hola') + .addAnswer('Bienvenido a tu tienda 🥲') + .addAnswer('escribe *catalogo* o *ofertas*') + .toJson() + + return [...flowA] } -const adapterDB = new DatabaseClass() +const adapterFlow = inout.create(makeFlow()) -const adapterFlow = new inout.instance( - (() => { - const flowA = inout - .addKeyword('hola') - .addAnswer('Bienvenido a tu tienda 🥲') - .addAnswer('escribe *catalogo* o *ofertas*') - .toJson() - - const flowB = inout - .addKeyword(['catalogo', 'ofertas']) - .addAnswer('Este es nuestro CATALOGO mas reciente!', { - buttons: [{ body: 'Xiaomi' }, { body: 'Samsung' }], - }) - .toJson() - - const flowC = inout - .addKeyword('Xiaomi') - .addAnswer('Estos son nuestro productos XIAOMI ....', { - media: 'https://....', - }) - .addAnswer('Si quieres mas info escrbie *info*') - .toJson() - - const flowD = inout - .addKeyword('chao!') - .addAnswer('bye!') - .addAnswer('Recuerda que tengo esta promo', { - media: 'https://media2.giphy.com/media/VQJu0IeULuAmCwf5SL/giphy.gif', - }) - .toJson() - - const flowE = inout - .addKeyword('Modelo C', { sensitive: false }) - .addAnswer('100USD', { media: 'http//:...' }) - .toJson() - - return [...flowA, ...flowB, ...flowC, ...flowC, ...flowD, ...flowE] - })() -) - -const adapterProvider = new provider.instance() - -test(`[Flow Basico]: BotClass`, () => { +test(`[BotClass]: recibe los mensajes entrantes del provider`, () => { let messages = [] - const flows = adapterFlow - const databases = adapterDB - const providers = adapterProvider + const bot = botcore.create({ + flow: adapterFlow, + database: adapterDB, + provider: adapterProvider, + }) - const botBasic = new bot.instance(flows, databases, providers) - - botBasic.on('message', (ctx) => messages.push(ctx.body)) - botBasic.emit('message', { body: 'hola' }) - botBasic.emit('message', { body: 'otro' }) + bot.on('message', (ctx) => messages.push(ctx.body)) + bot.emit('message', { body: 'hola' }) + bot.emit('message', { body: 'otro' }) assert.is(messages.join(','), ['hola', 'otro'].join(',')) }) diff --git a/package.json b/package.json index 1c01113..3e5b888 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "io:rollup": "rollup ./packages/io/index.js --config ./packages/io/rollup-cli.config.js", "core:rollup": "rollup ./packages/core/index.js --config ./packages/core/rollup-cli.config.js", "provider:rollup": "rollup ./packages/provider/index.js --config ./packages/provider/rollup-cli.config.js", + "database:rollup": "rollup ./packages/database/index.js --config ./packages/database/rollup-cli.config.js", "all:rollup": "rollup ./packages/index.js --config ./packages/rollup-cli.config.js", "format:check": "prettier --check ./packages", "format:write": "prettier --write ./packages", diff --git a/packages/core/classes/bot.class.js b/packages/core/classes/bot.class.js index cee96b1..418548b 100644 --- a/packages/core/classes/bot.class.js +++ b/packages/core/classes/bot.class.js @@ -1,19 +1,18 @@ -const { EventEmitter } = require('node:events') - /** * Clase principal del BOT */ -class BotClass extends EventEmitter { +class BotClass { flowClass databaseClass providerClass constructor(_flow, _database, _provider) { - super() this.flowClass = _flow this.databaseClass = _database this.providerClass = _provider - this.on('message', (ctxMessage) => this.handleOnMessage(ctxMessage)) + this.providerClass.on('message', (ctxMessage) => + this.handleOnMessage(ctxMessage) + ) } handleOnMessage = (ctxMessage) => { diff --git a/packages/core/index.js b/packages/core/index.js index 80a28cc..ebc1812 100644 --- a/packages/core/index.js +++ b/packages/core/index.js @@ -1,2 +1,15 @@ const BotClass = require('./classes/bot.class') -module.exports = { instance: BotClass } + +/** + * Crear instancia de clase + * @param {*} args + * @returns + */ +const create = ({ flow, database, provider }) => { + return Object.setPrototypeOf( + new BotClass(flow, database, provider), + provider + ) +} + +module.exports = { create } diff --git a/packages/database/classes/database.class.js b/packages/database/classes/database.class.js new file mode 100644 index 0000000..86278c7 --- /dev/null +++ b/packages/database/classes/database.class.js @@ -0,0 +1,9 @@ +class DatabaseClass { + constructor() {} + + saveLog = (ctx) => { + return ctx + } +} + +module.exports = DatabaseClass diff --git a/packages/database/index.js b/packages/database/index.js new file mode 100644 index 0000000..58e5e52 --- /dev/null +++ b/packages/database/index.js @@ -0,0 +1,12 @@ +const DatabaseClass = require('./classes/database.class') + +/** + * Crear instancia de clase + * @param {*} args + * @returns + */ +const create = (args) => { + return new DatabaseClass(args) +} + +module.exports = { create } diff --git a/packages/database/package.json b/packages/database/package.json new file mode 100644 index 0000000..dccbb0e --- /dev/null +++ b/packages/database/package.json @@ -0,0 +1,11 @@ +{ + "name": "@bot-whatsapp/database", + "version": "0.0.1", + "description": "Esto es el conector a mysql, pg, mongo", + "main": "index.js", + "private": true, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": {} +} diff --git a/packages/database/rollup-cli.config.js b/packages/database/rollup-cli.config.js new file mode 100644 index 0000000..a4aea1b --- /dev/null +++ b/packages/database/rollup-cli.config.js @@ -0,0 +1,10 @@ +const commonjs = require('@rollup/plugin-commonjs') + +module.exports = { + input: 'index.js', + output: { + file: 'lib/database/bundle.database.cjs', + format: 'cjs', + }, + plugins: [commonjs()], +} diff --git a/packages/index.js b/packages/index.js index bcd72f3..821912c 100644 --- a/packages/index.js +++ b/packages/index.js @@ -1,5 +1,6 @@ const inout = require('./io') const provider = require('./provider') -const bot = require('./core') +const botcore = require('./core') +const database = require('./database') -module.exports = { inout, provider, bot } +module.exports = { inout, provider, botcore, database } diff --git a/packages/io/index.js b/packages/io/index.js index 0dd0d22..c47f212 100644 --- a/packages/io/index.js +++ b/packages/io/index.js @@ -1,3 +1,13 @@ const { addKeyword, addAnswer } = require('./methods') const FlowClass = require('./classes/flow.class') -module.exports = { addKeyword, addAnswer, instance: FlowClass } + +/** + * Crear instancia de clase + * @param {*} args + * @returns + */ +const create = (args) => { + return new FlowClass(args) +} + +module.exports = { addKeyword, addAnswer, create } diff --git a/packages/provider/adapters/mock.js b/packages/provider/adapters/mock.js new file mode 100644 index 0000000..5ab4b6a --- /dev/null +++ b/packages/provider/adapters/mock.js @@ -0,0 +1,5 @@ +const { EventEmitter } = require('node:events') + +class MockProvider extends EventEmitter {} + +module.exports = MockProvider diff --git a/packages/provider/adapters/twilio.js b/packages/provider/adapters/twilio.js new file mode 100644 index 0000000..ed01a5a --- /dev/null +++ b/packages/provider/adapters/twilio.js @@ -0,0 +1 @@ +class TwilioProvider {} diff --git a/packages/provider/classes/provider.class.js b/packages/provider/classes/provider.class.js index 5f58b79..e8765da 100644 --- a/packages/provider/classes/provider.class.js +++ b/packages/provider/classes/provider.class.js @@ -1,4 +1,8 @@ class ProviderClass { + /** + * events: message | auth | auth_error | ... + * + */ constructor() {} sendMessage = (message) => { diff --git a/packages/provider/index.js b/packages/provider/index.js index e32e127..11807a9 100644 --- a/packages/provider/index.js +++ b/packages/provider/index.js @@ -1,2 +1,22 @@ const ProviderClass = require('./classes/provider.class') -module.exports = { instance: ProviderClass } +const TwilioProvider = require('./adapters/twilio') +const MockProvider = require('./adapters/mock') + +const prepareVendor = ({ vendor, credentials }) => { + if (vendor === 'twilio') return new TwilioProvider(credentials) + // if (vendor === 'meta') return new TwilioProvider(credentials) + // if (vendor === 'wev') return new TwilioProvider(credentials) + return new MockProvider() +} + +/** + * Crear instancia de clase + * @param {*} args + * @returns + */ +const create = (args) => { + const vendor = prepareVendor(args) + return Object.setPrototypeOf(new ProviderClass(), vendor) +} + +module.exports = { create } diff --git a/packages/provider/package.json b/packages/provider/package.json index c7b3201..180bdf2 100644 --- a/packages/provider/package.json +++ b/packages/provider/package.json @@ -1,7 +1,7 @@ { "name": "@bot-whatsapp/provider", "version": "0.0.1", - "description": "", + "description": "Esto es el conector a Twilio, Meta, etc...", "main": "index.js", "private": true, "keywords": [],