Commit 6abb33e39cacc42d658b089116d7970e302382d2

Authored by Adhidarma Hadiwinoto
1 parent 1697d0840e
Exists in master

Incoming SMS from with +

Showing 3 changed files with 14 additions and 2 deletions Inline Diff

lib/report-sender.js
1 'use strict'; 1 'use strict';
2 2
3 const request = require('request'); 3 const request = require('request');
4 4
5 const config = require('komodo-sdk/config'); 5 const config = require('komodo-sdk/config');
6 const logger = require('komodo-sdk/logger'); 6 const logger = require('komodo-sdk/logger');
7 7
8 function incomingSMS(message) { 8 function incomingSMS(message) {
9 if (!message || !config || !config.report_url || !config.report_url.incoming_sms) return; 9 if (!message || !config || !config.report_url || !config.report_url.incoming_sms) return;
10 10
11 if (!message.metadata) { 11 if (!message.metadata) {
12 const e = new Error('Missing metadata on incoming sms'); 12 const e = new Error('Missing metadata on incoming sms');
13 e.smsObj = message; 13 e.smsObj = message;
14 throw e; 14 throw e;
15 } 15 }
16 16
17 if (!message.metadata.from) {
18 const e = new Error('Missing metadata.from on incoming sms');
19 e.smsObj = message;
20 throw e;
21 }
22
17 if (!message.message) { 23 if (!message.message) {
18 const e = new Error('Missing message on incoming sms'); 24 const e = new Error('Missing message on incoming sms');
19 e.smsObj = message; 25 e.smsObj = message;
20 throw e; 26 throw e;
21 } 27 }
22 28
29 if (message.metadata.from.indexOf('+') !== 0) {
30 logger.verbose('Do not send report on incoming message when sender does not start with "+".', { from: message.metadata.from, msg: message.message });
31 return;
32 }
33
23 const requestOptions = { 34 const requestOptions = {
24 url: config.report_url.incoming_sms, 35 url: config.report_url.incoming_sms,
25 qs: { 36 qs: {
26 modem: config.name, 37 modem: config.name,
27 ts: message.metadata.ts, 38 ts: message.metadata.ts,
28 status: message.metadata.status, 39 status: message.metadata.status,
29 number: message.metadata.from, 40 number: message.metadata.from,
30 msg: message.message, 41 msg: message.message,
31 }, 42 },
32 }; 43 };
33 44
34 logger.info('Sending report via HTTP', requestOptions); 45 logger.info('Sending report via HTTP', requestOptions);
35 request(requestOptions, (err, res, body) => { 46 request(requestOptions, (err, res, body) => {
36 if (err) { 47 if (err) {
37 logger.warn(`Error sending report via HTTP. ${err.toString()}`); 48 logger.warn(`Error sending report via HTTP. ${err.toString()}`);
38 return; 49 return;
39 } 50 }
40 51
41 if (res.statusCode !== 200) { 52 if (res.statusCode !== 200) {
42 logger.warn(`Error sending report via HTTP. Server respond with HTTP status code ${res.statusCode}`, { http_status_code: res.statusCode, body }); 53 logger.warn(`Error sending report via HTTP. Server respond with HTTP status code ${res.statusCode}`, { http_status_code: res.statusCode, body });
43 } 54 }
44 }); 55 });
45 } 56 }
46 57
47 exports.incomingSMS = incomingSMS; 58 exports.incomingSMS = incomingSMS;
48 59
1 'use strict'; 1 'use strict';
2 2
3 const moment = require('moment'); 3 const moment = require('moment');
4 4
5 function extract(raw) { 5 function extract(raw) {
6 if (!raw) return null; 6 if (!raw) return null;
7 const lines = raw.trim().split(/[\n\r]+/m); 7 const lines = raw.trim().split(/[\n\r]+/m);
8 if (!lines) return null; 8 if (!lines) return null;
9 9
10 const result = { 10 const result = {
11 metadata: { 11 metadata: {
12 status: null, 12 status: null,
13 from: null, 13 from: null,
14 ts: null, 14 ts: null,
15 raw: null, 15 raw: null,
16 }, 16 },
17 message: null, 17 message: null,
18 raw, 18 raw,
19 }; 19 };
20 20
21 const metadata = lines[0].split(',').map(el => el.replace(/"/g, '')) || []; 21 const metadata = lines[0].split(',').map(el => el.replace(/"/g, '')) || [];
22 22
23 [result.metadata.raw] = lines; 23 [result.metadata.raw] = lines;
24 result.metadata.status = typeof metadata[0] === 'string' ? metadata[0].replace(/^.+: /, '') : ''; 24 result.metadata.status = typeof metadata[0] === 'string' ? metadata[0].replace(/^.+: /, '') : '';
25 result.metadata.from = typeof metadata[1] === 'string' ? metadata[1].replace(/^\+/, '') : ''; 25 // result.metadata.from = typeof metadata[1] === 'string' ? metadata[1].replace(/^\+/, '') : '';
26 result.metadata.from = metadata[1];
26 27
27 const tsFromRaw = `${metadata[3]} ${(metadata[4] || '').replace(/\+\d+/, '')}`; 28 const tsFromRaw = `${metadata[3]} ${(metadata[4] || '').replace(/\+\d+/, '')}`;
28 result.metadata.ts = moment(tsFromRaw, 'YY/MM/DD HH:mm:ss').format('YYYY-MM-DD HH:mm:ss'); 29 result.metadata.ts = moment(tsFromRaw, 'YY/MM/DD HH:mm:ss').format('YYYY-MM-DD HH:mm:ss');
29 30
30 result.message = lines.slice(1).join('\n').trim(); 31 result.message = lines.slice(1).join('\n').trim();
31 return result; 32 return result;
32 } 33 }
33 34
34 exports.extract = extract; 35 exports.extract = extract;
35 36
1 'use strict'; 1 'use strict';
2 2
3 /* global describe it */ 3 /* global describe it */
4 4
5 require('should'); 5 require('should');
6 6
7 const sms = require('../lib/sms'); 7 const sms = require('../lib/sms');
8 8
9 describe('#sms', () => { 9 describe('#sms', () => {
10 describe('#extract', () => { 10 describe('#extract', () => {
11 const raw = '+CMGR: "REC UNREAD","+6282210008543",,"19/07/26,13:21:16+28"\r\nsudah bisa?'; 11 const raw = '+CMGR: "REC UNREAD","+6282210008543",,"19/07/26,13:21:16+28"\r\nsudah bisa?';
12 const messageParsed = sms.extract(raw); 12 const messageParsed = sms.extract(raw);
13 13
14 it('should return raw correctly', () => { 14 it('should return raw correctly', () => {
15 messageParsed.raw.should.equal(raw); 15 messageParsed.raw.should.equal(raw);
16 }); 16 });
17 17
18 it('should return correct metadata', () => { 18 it('should return correct metadata', () => {
19 messageParsed.metadata.status.should.equal('REC UNREAD'); 19 messageParsed.metadata.status.should.equal('REC UNREAD');
20 messageParsed.metadata.from.should.equal('6282210008543'); 20 messageParsed.metadata.from.should.equal('+6282210008543');
21 messageParsed.metadata.ts.should.equal('2019-07-26 13:21:16'); 21 messageParsed.metadata.ts.should.equal('2019-07-26 13:21:16');
22 }); 22 });
23 23
24 it('should return correct message', () => { 24 it('should return correct message', () => {
25 messageParsed.message.should.equal('sudah bisa?'); 25 messageParsed.message.should.equal('sudah bisa?');
26 }); 26 });
27 }); 27 });
28 }); 28 });
29 29