From a21e7a161eb3b8eeb6e6885d17887b2f29ce635f Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Mon, 19 Aug 2019 17:21:40 +0700
Subject: [PATCH] modem-chooser for sending message

---
 config.sample.json   | 14 ++++++++++++++
 index.js             |  3 +++
 lib/modem-chooser.js | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/transport.js     |  6 ++++--
 4 files changed, 73 insertions(+), 2 deletions(-)
 create mode 100644 lib/modem-chooser.js

diff --git a/config.sample.json b/config.sample.json
index c69dbec..6dd0940 100644
--- a/config.sample.json
+++ b/config.sample.json
@@ -35,6 +35,20 @@
         "SMS1"
     ],
 
+    "imsi_senders": {
+        "prefix_names": {
+            "TELKOMSEL": [
+                "510890944235402"
+            ],
+            "XL": [
+                "510890944262917"
+            ]
+        },
+        "default": [
+            "510890944235513"
+        ]
+    },
+
     "redis": {
         "host": "127.0.0.1"
     }
diff --git a/index.js b/index.js
index a23868f..82d8187 100644
--- a/index.js
+++ b/index.js
@@ -10,6 +10,9 @@ const config = require('komodo-sdk/config');
 global.KOMODO_LOG_LABEL = `KOMODO-CENTER@${(config && typeof config.name === 'string') ? config.name.toUpperCase() : 'SMS'}`;
 process.title = global.KOMODO_LOG_LABEL;
 
+const logger = require('komodo-sdk/logger');
+global.KOMODO_LOGGER = logger;
+
 require('./lib/prefixes');
 require('./lib/transport');
 require('./lib/apiserver');
diff --git a/lib/modem-chooser.js b/lib/modem-chooser.js
new file mode 100644
index 0000000..f5b340a
--- /dev/null
+++ b/lib/modem-chooser.js
@@ -0,0 +1,52 @@
+'use strict';
+
+const prefixes = require('./prefixes');
+const modems = require('./modems2');
+const partnerLastSeen = require('./partner-last-seen');
+
+function filterOutCandidates(candidates) {
+    if (!Array.isArray(candidates)) {
+        return [];
+    }
+
+    return candidates.filter((item) => {
+        const modem = modems.get('by_imsi', item);
+
+        if (!modem) return false;
+        return true;
+    });
+}
+
+exports.chooser = async function chooser(destination, config) {
+    const logger = global.KOMODO_LOGGER;
+
+    const prefixName = await prefixes.lookup(destination);
+    if (logger) logger.verbose('Choosing suitable senders', { destination, prefixName });
+
+    let imsiSenders = [];
+    if (config.imsi_senders && config.imsi_senders.prefix_names && config.imsi_senders.prefix_names[prefixName]) {
+        imsiSenders = filterOutCandidates(config.imsi_senders.prefix_names[prefixName]);
+        if (logger) logger.verbose('Suitable senders by prefix name', { destination, prefixName, imsiSenders });
+    }
+
+    if (!imsiSenders.length && config.imsi_senders.default && Array.isArray(config.imsi_senders.default) && config.imsi_senders.default.length) {
+        imsiSenders = filterOutCandidates(config.imsi_senders.default);
+        if (logger) logger.verbose('Suitable default senders', { destination, prefixName, imsiSenders });
+    }
+
+    if (!imsiSenders.length) {
+        imsiSenders = filterOutCandidates([ await partnerLastSeen.get(destination) ]);
+        if (logger) logger.verbose('Suitable senders by last seen', { destination, prefixName, imsiSenders });
+    }
+    
+    if (!imsiSenders.length) {
+        if (logger) logger.verbose('No suitable sender found', { destination, prefixName });
+        return;
+    }
+
+    const count = imsiSenders.length;
+    const idx = Math.round(Math.random() * (count - 1));
+    const imsiChoosed = imsiSenders[idx];
+    if (logger) logger.verbose(`Choose modem with IMSI ${imsiChoosed}`, { destination, prefixName, imsiSenders });
+    return imsiChoosed;
+}
\ No newline at end of file
diff --git a/lib/transport.js b/lib/transport.js
index 0e496f0..cea6f8a 100644
--- a/lib/transport.js
+++ b/lib/transport.js
@@ -14,7 +14,8 @@ const messagingService = require('komodo-center-messaging-client-lib');
 
 const common = require('./common');
 const modems = require('./modems2');
-const partnerLastSeen = require('./partner-last-seen');
+const modemChooser = require('./modem-chooser');
+// const partnerLastSeen = require('./partner-last-seen');
 const history = require('./history');
 const prefixes = require('./prefixes');
 
@@ -119,7 +120,8 @@ async function send(partner, msg) {
     logger.verbose('Destination number prefix lookup', {partner: destinationNumber, prefix: prefixName});
 
     // logger.verbose('Choosing handler name', { partner, destinationNumber, msg, origin });
-    const handlerIMSI = await partnerLastSeen.get(destinationNumber) ;
+    // const handlerIMSI = await partnerLastSeen.get(destinationNumber) ;
+    const handlerIMSI = await modemChooser.chooser(destinationNumber, config);
 
     if (!handlerIMSI) {
         logger.warn(`Unknown handler for sending message to partner`, { partner, destinationNumber });
-- 
1.9.0