diff --git a/lib/db-mysql.js b/lib/db-mysql.js new file mode 100644 index 0000000..e46b3c3 --- /dev/null +++ b/lib/db-mysql.js @@ -0,0 +1,37 @@ +'use strict'; + +const mysql = require('mysql'); + +const config = require('komodo-sdk/config'); + +const connectionLimit = config.mysql && config.mysql.pool_connection_limit ? config.mysql.pool_connection_limit : 0; + +const pool = config.mysql ? mysql.createPool({ + connectionLimit: connectionLimit, + host: config.mysql.host || 'localhost', + database: config.mysql.database || 'komodo', + user: config.mysql.user || 'komodo', + password: config.mysql.password +}) : null; + +exports.pool = pool; +exports.query = pool.query; + +exports.format = (sql, values) => { + return new Promise((resolve, reject) => { + if (!pool) { + reject('Missing DB config'); + return; + } + + pool.getConnection((err, connection) => { + if (err) { + reject(err); + return; + } + + resolve(connection.format(sql, values)); + connection.release(); + }); + }) +} \ No newline at end of file diff --git a/lib/http-listener.js b/lib/http-listener.js index ddfe9e8..f56d16c 100644 --- a/lib/http-listener.js +++ b/lib/http-listener.js @@ -8,6 +8,7 @@ const config = require('komodo-sdk/config'); const logger = require('komodo-sdk/logger'); const commandHandler = require('./command-handler'); +const messagesArchive = require('./messages-archive'); const app = express(); const port = config && config.listener && config.listener.http && config.listener.http.port ? config.listener.http.port : 32979; @@ -16,24 +17,34 @@ function mainHandler(req, res) { if (!req.body) req.body = {}; - if (req.body.do_not_forward_to_core || req.query.do_not_forward_to_core) { - logger.verbose('Ignoring message', { from: req.body.from || req.query.from, msg: req.body.msg || req.query.msg, do_not_forward_to_core: req.body.do_not_forward_to_core || req.query.do_not_forward_to_core }); - res.end('OK'); + if (!req.query.from && !req.body.from) { + res.end('ERROR. Undefined parameter: from'); return; } - if (!req.query.report_port && !req.body.report_port) { - res.end('ERROR. Undefined parameter: report_port'); + if (!req.query.msg && !req.body.msg) { + res.end('ERROR. Undefined parameter: msg'); return; } - if (!req.query.from && !req.body.from) { - res.end('ERROR. Undefined parameter: from'); + messagesArchive.insert( + { + origin_label: req.body.origin_label || req.query.origin_label || req.body.origin || req.query.origin, + origin_transport: req.body.origin_transport || req.query.origin_transport, + partner: req.body.from_raw || req.query.from_raw || req.body.from || req.query.from, + msg: req.body.msg || req.query.msg, + }, + messagesArchive.DIRECTION_INCOMING + ); + + if (req.body.do_not_forward_to_core || req.query.do_not_forward_to_core) { + logger.verbose('Ignoring message', { from: req.body.from || req.query.from, msg: req.body.msg || req.query.msg, do_not_forward_to_core: req.body.do_not_forward_to_core || req.query.do_not_forward_to_core }); + res.end('OK'); return; } - if (!req.query.msg && !req.body.msg) { - res.end('ERROR. Undefined parameter: msg'); + if (!req.query.report_port && !req.body.report_port) { + res.end('ERROR. Undefined parameter: report_port'); return; } diff --git a/lib/messages-archive.js b/lib/messages-archive.js new file mode 100644 index 0000000..97dcde9 --- /dev/null +++ b/lib/messages-archive.js @@ -0,0 +1,42 @@ +'use strict'; + +const logger = require('komodo-sdk/logger'); +const db = require('./db-mysql'); + +const DIRECTION_INCOMING = 0; +const DIRECTION_OUTGOING = 1; + +/** + * Menyimpan pesan ke dalam archive histori pesan di database + * + * @param {object} params - objek pesan yang akan disimpan + * @param {string} [params.origin_label] - label origin + * @param {string} [params.origin=UNKNOWN] - digunakan sebagai label origin jika tdk ditentukan + * @param {string} [params.origin_transport=UNKNOWN] - transport, misal SMS, TELEGRAM + * @param {string} params.partner - pengirim / penerima + * @param {string} [params.msg] - isi pesan + * @param {string} [params.message] - isi pesan, jika params.msg tidak terdefinisi + * @param {number} direction - 0: incoming, 1: outgoing + */ +function insert(params, direction) { + if (!db.pool) return; + + const query = `INSERT INTO messages SET created = NOW(), ?`; + const values = [{ + origin_label: (params.origin_label || params.origin || 'UNKNOWN').trim(), + origin_transport: (params.origin_transport || 'UNKNOWN').trim(), + direction, + partner: params.partner.trim(), + message: (params.msg || params.message).trim(), + }]; + + db.query(query, values, (err) => { + if (err) { + logger.warn(`MESSAGES-ARCHIVE: DB ERROR on inserting message. ${err.toString()}`); + } + }); +} + +exports.insert = insert; +exports.DIRECTION_INCOMING = DIRECTION_INCOMING; +exports.DIRECTION_OUTGOING = DIRECTION_OUTGOING; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9c72da7..153158d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -287,6 +287,11 @@ "tweetnacl": "^0.14.3" } }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -2273,8 +2278,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -2593,6 +2597,17 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mysql": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.17.1.tgz", + "integrity": "sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA==", + "requires": { + "bignumber.js": "7.2.1", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -3013,8 +3028,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "optional": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -3101,7 +3115,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3696,6 +3709,11 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -3767,7 +3785,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -4075,8 +4092,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", diff --git a/package.json b/package.json index 69d8c37..d0d2493 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "express": "^4.17.1", "express-ipfilter": "^1.0.1", "komodo-sdk": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git", + "mysql": "^2.17.1", "natural-compare-lite": "^1.4.0", "request": "^2.88.0", "yargs": "^13.2.4"