Commit 82314e826f0fce75a1fae8d4d122816db340def9

Authored by Adhidarma Hadiwinoto
1 parent f942a8afb4
Exists in master

Add locations on requesting task from CORE

Showing 2 changed files with 20 additions and 0 deletions Inline Diff

1 const MODULE_NAME = 'POSTPAID-SDK'; 1 const MODULE_NAME = 'POSTPAID-SDK';
2 2
3 const config = require('komodo-sdk/config'); 3 const config = require('komodo-sdk/config');
4 4
5 const DEFAULT_CORE_REQUEST_TIMEOUT = 15 * 1000; 5 const DEFAULT_CORE_REQUEST_TIMEOUT = 15 * 1000;
6 const DEFAULT_SLEEP_AFTER_CORE_ERROR_MS = 3000; 6 const DEFAULT_SLEEP_AFTER_CORE_ERROR_MS = 3000;
7 const PULL_INTERVAL_MS = config.postpaid_pull_interval_ms || config.pull_interval_ms || 1000; 7 const PULL_INTERVAL_MS = config.postpaid_pull_interval_ms || config.pull_interval_ms || 1000;
8 8
9 const DEFAULT_CORE_AXIOS_CONFIG = { 9 const DEFAULT_CORE_AXIOS_CONFIG = {
10 headers: { 'Content-Type': 'application/json' }, 10 headers: { 'Content-Type': 'application/json' },
11 timeout: config.core_request_timeout || config.request_timeout || DEFAULT_CORE_REQUEST_TIMEOUT, 11 timeout: config.core_request_timeout || config.request_timeout || DEFAULT_CORE_REQUEST_TIMEOUT,
12 }; 12 };
13 13
14 const GET_TASK_AXIOS_CONFIG = DEFAULT_CORE_AXIOS_CONFIG; 14 const GET_TASK_AXIOS_CONFIG = DEFAULT_CORE_AXIOS_CONFIG;
15 15
16 const axios = require('axios').default; 16 const axios = require('axios').default;
17 const uniqid = require('uniqid'); 17 const uniqid = require('uniqid');
18 const coreUrl = require('komodo-sdk/core-url'); 18 const coreUrl = require('komodo-sdk/core-url');
19 const logger = require('tektrans-logger'); 19 const logger = require('tektrans-logger');
20 const report = require('./lib/report'); 20 const report = require('./lib/report');
21 21
22 const sleep = require('./lib/sleep'); 22 const sleep = require('./lib/sleep');
23 const composeGatewayLocations = require('./lib/compose-gateway-locations');
23 24
24 let partner; 25 let partner;
25 let first = true; 26 let first = true;
26 let coreIsHealthy = null; 27 let coreIsHealthy = null;
27 28
28 const CORE_ENDPOINT = `${coreUrl}/postpaid2/task`; 29 const CORE_ENDPOINT = `${coreUrl}/postpaid2/task`;
29 30
30 function detectCoreStatusChange(isHealthy, url, err) { 31 function detectCoreStatusChange(isHealthy, url, err) {
31 if (coreIsHealthy !== isHealthy) { 32 if (coreIsHealthy !== isHealthy) {
32 coreIsHealthy = isHealthy; 33 coreIsHealthy = isHealthy;
33 34
34 if (isHealthy) { 35 if (isHealthy) {
35 logger.info(`${MODULE_NAME} D7F6DBE4: CORE is healthy now`, { 36 logger.info(`${MODULE_NAME} D7F6DBE4: CORE is healthy now`, {
36 url, err: err && err.message, 37 url, err: err && err.message,
37 }); 38 });
38 } else { 39 } else {
39 logger.warn(`${MODULE_NAME} 460EC596: CORE is unhealthy now`, { 40 logger.warn(`${MODULE_NAME} 460EC596: CORE is unhealthy now`, {
40 url, err: err && err.message, 41 url, err: err && err.message,
41 }); 42 });
42 } 43 }
43 } 44 }
44 } 45 }
45 46
46 async function getTask() { 47 async function getTask() {
47 if (!partner) return null; 48 if (!partner) return null;
48 49
49 const xid = uniqid(); 50 const xid = uniqid();
50 51
51 if (first) { 52 if (first) {
52 first = false; 53 first = false;
53 logger.verbose(`${MODULE_NAME} 20A30442: First getTask pull request to CORE`, { xid }); 54 logger.verbose(`${MODULE_NAME} 20A30442: First getTask pull request to CORE`, { xid });
54 } 55 }
55 56
56 const payload = { 57 const payload = {
57 handler: config.handler || config.handler_name, 58 handler: config.handler || config.handler_name,
58 products: config.products || [], 59 products: config.products || [],
60 locations: composeGatewayLocations(config),
59 }; 61 };
60 62
61 let task; 63 let task;
62 try { 64 try {
63 const result = await axios.post( 65 const result = await axios.post(
64 CORE_ENDPOINT, 66 CORE_ENDPOINT,
65 payload, 67 payload,
66 GET_TASK_AXIOS_CONFIG, 68 GET_TASK_AXIOS_CONFIG,
67 ); 69 );
68 70
69 if (!result || !result.data) { 71 if (!result || !result.data) {
70 throw new Error(`${MODULE_NAME} 26F332C6: Empty CORE response on pulling task`); 72 throw new Error(`${MODULE_NAME} 26F332C6: Empty CORE response on pulling task`);
71 } 73 }
72 74
73 if (result && result.data && result.data.task && !result.data.task.postpaid) { 75 if (result && result.data && result.data.task && !result.data.task.postpaid) {
74 throw new Error(`${MODULE_NAME} B338CEF8: CORE returning non postpaid task on pulling task`); 76 throw new Error(`${MODULE_NAME} B338CEF8: CORE returning non postpaid task on pulling task`);
75 } 77 }
76 78
77 detectCoreStatusChange(true, CORE_ENDPOINT); 79 detectCoreStatusChange(true, CORE_ENDPOINT);
78 task = result.data.task; 80 task = result.data.task;
79 } catch (e) { 81 } catch (e) {
80 // skipNext = 3; 82 // skipNext = 3;
81 detectCoreStatusChange(false, CORE_ENDPOINT, e); 83 detectCoreStatusChange(false, CORE_ENDPOINT, e);
82 await sleep(DEFAULT_SLEEP_AFTER_CORE_ERROR_MS); 84 await sleep(DEFAULT_SLEEP_AFTER_CORE_ERROR_MS);
83 } 85 }
84 86
85 if (!task) return null; 87 if (!task) return null;
86 88
87 task.remote_product = ((config.remote_products || {})[task.product]) || task.product; 89 task.remote_product = ((config.remote_products || {})[task.product]) || task.product;
88 task.trx_id = Number(task.trx_id) + (config.sdk_trx_id_adder || 0); 90 task.trx_id = Number(task.trx_id) + (config.sdk_trx_id_adder || 0);
89 91
90 logger.verbose(`${MODULE_NAME} 441E8C96: Got task from CORE on pulling task`, { xid, task }); 92 logger.verbose(`${MODULE_NAME} 441E8C96: Got task from CORE on pulling task`, { xid, task });
91 93
92 if (task.inquiry_only) { 94 if (task.inquiry_only) {
93 if (typeof partner.inquiry === 'function') partner.inquiry(task); 95 if (typeof partner.inquiry === 'function') partner.inquiry(task);
94 return task; 96 return task;
95 } 97 }
96 98
97 if (typeof partner.pay === 'function') { 99 if (typeof partner.pay === 'function') {
98 partner.pay(task, xid); 100 partner.pay(task, xid);
99 return task; 101 return task;
100 } 102 }
101 103
102 return null; 104 return null;
103 } 105 }
104 106
105 const getTaskLooper = async () => { 107 const getTaskLooper = async () => {
106 await getTask(); 108 await getTask();
107 109
108 setTimeout(() => { 110 setTimeout(() => {
109 getTaskLooper(); 111 getTaskLooper();
110 }, PULL_INTERVAL_MS); 112 }, PULL_INTERVAL_MS);
111 }; 113 };
112 114
113 exports.setPartner = (val) => { 115 exports.setPartner = (val) => {
114 partner = val; 116 partner = val;
115 // setInterval(getTaskLooper, config.pull_interval_ms || 1000); 117 // setInterval(getTaskLooper, config.pull_interval_ms || 1000);
116 getTaskLooper(); 118 getTaskLooper();
117 }; 119 };
118 120
119 exports.report = report; 121 exports.report = report;
120 122
lib/compose-gateway-locations.js
File was created 1 /**
2 * @param {Object} config
3 * @param {Array.<string>} [config.locations]
4 * @returns {Array.<string>}
5 */
6 module.exports = (config) => {
7 const retval = ((
8 Array.isArray(config.locations) && config.locations.length && config.locations)
9 || []
10 )
11 .filter((item) => typeof item === 'string')
12 .map((item) => item.trim())
13 .filter((item) => item.length);
14
15 if (!retval.length) retval.push('ALL');
16
17 return retval;
18 };
19